commit 6281085045c8d8bf9fd25a059a7225ce93420674 Author: anoracleofra-code Date: Wed Mar 4 21:13:34 2026 -0700 Initial commit: ShadowBroker v1.0 Former-commit-id: 3b8912a8f67efd51c08cc6f4c77d43266b8fdc1b diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bfd30d --- /dev/null +++ b/.gitignore @@ -0,0 +1,66 @@ +# shadowbroker .gitignore +# ---------------------- + +# Dependencies +node_modules/ +venv/ +env/ +.venv/ + +# Environment Variables & Secrets +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Python caches & compiled files +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python + +# Next.js build output +.next/ +out/ +build/ + +# Application Specific Caches & DBs +backend/ais_cache.json +backend/carrier_cache.json +backend/cctv.db +*.sqlite3 + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDEs and Editors +.vscode/ +.idea/ +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Vercel / Deployment +.vercel + +# Temp files +tmp/ +*.log +*.tmp +*.bak +out.txt +out_sys.txt +rss_output.txt +merged.txt +tmp_fast.json +TheAirTraffic Database.xlsx diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b931bb --- /dev/null +++ b/README.md @@ -0,0 +1,301 @@ +

+

🛰️ S H A D O W B R O K E R

+

Global Threat Intercept — Real-Time Geospatial Intelligence Platform

+

+ TOP SECRET // SI TK // NOFORN +

+

+ +--- + +**ShadowBroker** is a real-time, full-spectrum geospatial intelligence dashboard that aggregates live data from dozens of open-source intelligence (OSINT) feeds and renders them on a unified dark-ops map interface. It tracks aircraft, ships, satellites, earthquakes, conflict zones, CCTV networks, GPS jamming, and breaking geopolitical events — all updating in real time. + +Built with **Next.js**, **MapLibre GL**, **FastAPI**, and **Python**, it's designed for analysts, researchers, and enthusiasts who want a single-pane-of-glass view of global activity. + +--- + +## ✨ Features + +### 🛩️ Aviation Tracking + +- **Commercial Flights** — Real-time positions via OpenSky Network (~5,000+ aircraft) +- **Private Aircraft** — Light GA, turboprops, bizjets tracked separately +- **Private Jets** — High-net-worth individual aircraft with owner identification +- **Military Flights** — Tankers, ISR, fighters, transports via adsb.lol military endpoint +- **Flight Trail Accumulation** — Persistent breadcrumb trails for all tracked aircraft +- **Holding Pattern Detection** — Automatically flags aircraft circling (>300° total turn) +- **Aircraft Classification** — Shape-accurate SVG icons: airliners, turboprops, bizjets, helicopters +- **Grounded Detection** — Aircraft below 100ft AGL rendered with grey icons + +### 🚢 Maritime Tracking + +- **AIS Vessel Stream** — 25,000+ vessels via aisstream.io WebSocket (real-time) +- **Ship Classification** — Cargo, tanker, passenger, yacht, military vessel types with color-coded icons +- **Carrier Strike Group Tracker** — All 11 active US Navy aircraft carriers with OSINT-estimated positions + - Automated GDELT news scraping for carrier movement intelligence + - 50+ geographic region-to-coordinate mappings + - Disk-cached positions, auto-updates at 00:00 & 12:00 UTC +- **Cruise & Passenger Ships** — Dedicated layer for cruise liners and ferries +- **Clustered Display** — Ships cluster at low zoom with count labels, decluster on zoom-in + +### 🛰️ Space & Satellites + +- **Orbital Tracking** — Real-time satellite positions from N2YO API +- **Mission-Type Classification** — Color-coded by mission: military recon (red), SAR (cyan), SIGINT (white), navigation (blue), early warning (magenta), commercial imaging (green), space station (gold) + +### 🌍 Geopolitics & Conflict + +- **Global Incidents** — GDELT-powered conflict event aggregation (last 8 hours, ~1,000 events) +- **Ukraine Frontline** — Live warfront GeoJSON from DeepState Map +- **SIGINT/RISINT News Feed** — Real-time RSS aggregation from multiple intelligence-focused sources +- **Region Dossier** — Right-click anywhere on the map for: + - Country profile (population, capital, languages, currencies, area) + - Head of state & government type (Wikidata SPARQL) + - Local Wikipedia summary with thumbnail + +### 📷 Surveillance + +- **CCTV Mesh** — 2,000+ live traffic cameras from: + - 🇬🇧 Transport for London JamCams + - 🇺🇸 Austin, TX TxDOT + - 🇺🇸 NYC DOT + - 🇸🇬 Singapore LTA + - Custom URL ingestion +- **Feed Rendering** — Automatic detection & rendering of video, MJPEG, HLS, embed, satellite tile, and image feeds +- **Clustered Map Display** — Green dots cluster with count labels, decluster on zoom + +### 📡 Signal Intelligence + +- **GPS Jamming Detection** — Real-time analysis of aircraft NAC-P (Navigation Accuracy Category) values + - Grid-based aggregation identifies interference zones + - Red overlay squares with "GPS JAM XX%" severity labels +- **Radio Intercept Panel** — Scanner-style UI for monitoring communications + +### 🌐 Additional Layers + +- **Earthquakes (24h)** — USGS real-time earthquake feed with magnitude-scaled markers +- **Day/Night Cycle** — Solar terminator overlay showing global daylight/darkness +- **Global Markets Ticker** — Live financial market indices (minimizable) +- **Measurement Tool** — Point-to-point distance & bearing measurement on the map + +--- + +## 🏗️ Architecture + +``` +┌──────────────────────────────────────────────────────┐ +│ FRONTEND (Next.js) │ +│ │ +│ ┌─────────────┐ ┌──────────┐ ┌─────────────────┐ │ +│ │ MapLibre GL │ │ NewsFeed │ │ Control Panels │ │ +│ │ 2D WebGL │ │ SIGINT │ │ Layers/Filters │ │ +│ │ Map Render │ │ Intel │ │ Markets/Radio │ │ +│ └──────┬──────┘ └────┬─────┘ └────────┬────────┘ │ +│ └──────────────┼─────────────────┘ │ +│ │ REST API (15s fast / 60s slow│ +├────────────────────────┼─────────────────────────────┤ +│ BACKEND (FastAPI) │ +│ │ │ +│ ┌─────────────────────┼─────────────────────────┐ │ +│ │ Data Fetcher (Scheduler) │ │ +│ │ ┌──────────┬──────────┬──────────┬─────────┐ │ │ +│ │ │ OpenSky │ adsb.lol │ N2YO │ USGS │ │ │ +│ │ │ Flights │ Military │ Sats │ Quakes │ │ │ +│ │ ├──────────┼──────────┼──────────┼─────────┤ │ │ +│ │ │ AIS WS │ Carrier │ GDELT │ CCTV │ │ │ +│ │ │ Ships │ Tracker │ Conflict │ Cameras │ │ │ +│ │ ├──────────┼──────────┼──────────┼─────────┤ │ │ +│ │ │ DeepState│ RSS │ Region │ GPS │ │ │ +│ │ │ Frontline│ Intel │ Dossier │ Jamming │ │ │ +│ │ └──────────┴──────────┴──────────┴─────────┘ │ │ +│ └───────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────┘ +``` + +--- + +## 📊 Data Sources & APIs + +| Source | Data | Update Frequency | API Key Required | +|---|---|---|---| +| [OpenSky Network](https://opensky-network.org) | Commercial & private flights | ~60s | Optional (anonymous limited) | +| [adsb.lol](https://adsb.lol) | Military aircraft | ~60s | No | +| [aisstream.io](https://aisstream.io) | AIS vessel positions | Real-time WebSocket | **Yes** | +| [N2YO](https://www.n2yo.com) | Satellite orbital positions | ~60s | **Yes** | +| [USGS Earthquake](https://earthquake.usgs.gov) | Global seismic events | ~60s | No | +| [GDELT Project](https://www.gdeltproject.org) | Global conflict events | ~6h | No | +| [DeepState Map](https://deepstatemap.live) | Ukraine frontline | ~30min | No | +| [Transport for London](https://api.tfl.gov.uk) | London CCTV JamCams | ~5min | No | +| [TxDOT](https://its.txdot.gov) | Austin TX traffic cameras | ~5min | No | +| [NYC DOT](https://webcams.nyctmc.org) | NYC traffic cameras | ~5min | No | +| [Singapore LTA](https://datamall.lta.gov.sg) | Singapore traffic cameras | ~5min | **Yes** | +| [RestCountries](https://restcountries.com) | Country profile data | On-demand (cached 24h) | No | +| [Wikidata SPARQL](https://query.wikidata.org) | Head of state data | On-demand (cached 24h) | No | +| [Wikipedia API](https://en.wikipedia.org/api) | Location summaries & aircraft images | On-demand (cached) | No | +| [CARTO Basemaps](https://carto.com) | Dark map tiles | Continuous | No | + +--- + +## 🚀 Getting Started + +### Prerequisites + +- **Node.js** 18+ and **npm** +- **Python** 3.10+ with `pip` +- API keys for: `aisstream.io`, `n2yo.com` (and optionally `opensky-network.org`, `lta.gov.sg`) + +### Installation + +```bash +# Clone the repository +git clone https://github.com/your-username/shadowbroker.git +cd shadowbroker/live-risk-dashboard + +# Backend setup +cd backend +python -m venv venv +venv\Scripts\activate # Windows +# source venv/bin/activate # macOS/Linux +pip install -r requirements.txt + +# Create .env with your API keys +echo "AISSTREAM_API_KEY=your_key_here" >> .env +echo "N2YO_API_KEY=your_key_here" >> .env +echo "OPENSKY_USERNAME=your_user" >> .env +echo "OPENSKY_PASSWORD=your_pass" >> .env + +# Frontend setup +cd ../frontend +npm install +``` + +### Running + +```bash +# From the frontend directory — starts both frontend & backend concurrently +npm run dev +``` + +This starts: + +- **Next.js** frontend on `http://localhost:3000` +- **FastAPI** backend on `http://localhost:8000` + +--- + +## 🎛️ Data Layers + +All layers are independently toggleable from the left panel: + +| Layer | Default | Description | +|---|---|---| +| Commercial Flights | ✅ ON | Airlines, cargo, GA aircraft | +| Private Flights | ✅ ON | Non-commercial private aircraft | +| Private Jets | ✅ ON | High-value bizjets with owner data | +| Military Flights | ✅ ON | Military & government aircraft | +| Tracked Aircraft | ✅ ON | Special interest watch list | +| Satellites | ✅ ON | Orbital assets by mission type | +| Carriers / Mil / Cargo | ✅ ON | Navy carriers, cargo ships, tankers | +| Civilian Vessels | ❌ OFF | Yachts, fishing, recreational | +| Cruise / Passenger | ✅ ON | Cruise ships and ferries | +| Earthquakes (24h) | ✅ ON | USGS seismic events | +| CCTV Mesh | ❌ OFF | Surveillance camera network | +| Ukraine Frontline | ✅ ON | Live warfront positions | +| Global Incidents | ✅ ON | GDELT conflict events | +| GPS Jamming | ✅ ON | NAC-P degradation zones | +| Day / Night Cycle | ✅ ON | Solar terminator overlay | + +--- + +## 🔧 Performance + +The platform is optimized for handling massive real-time datasets: + +- **Gzip Compression** — API payloads compressed ~92% (11.6 MB → 915 KB) +- **ETag Caching** — `304 Not Modified` responses skip redundant JSON parsing +- **Viewport Culling** — Only features within the visible map bounds (+20% buffer) are rendered +- **Clustered Rendering** — Ships, CCTV, and earthquakes use MapLibre clustering to reduce feature count +- **Debounced Viewport Updates** — 300ms debounce prevents GeoJSON rebuild thrash during pan/zoom +- **Position Interpolation** — Smooth 10s tick animation between data refreshes +- **React.memo** — Heavy components wrapped to prevent unnecessary re-renders +- **Coordinate Precision** — Lat/lng rounded to 5 decimals (~1m) to reduce JSON size + +--- + +## 📁 Project Structure + +``` +live-risk-dashboard/ +├── backend/ +│ ├── main.py # FastAPI app, middleware, API routes +│ ├── carrier_cache.json # Persisted carrier OSINT positions +│ ├── cctv.db # SQLite CCTV camera database +│ └── services/ +│ ├── data_fetcher.py # Core scheduler — fetches all data sources +│ ├── ais_stream.py # AIS WebSocket client (25K+ vessels) +│ ├── carrier_tracker.py # OSINT carrier position tracker +│ ├── cctv_pipeline.py # Multi-source CCTV camera ingestion +│ ├── geopolitics.py # GDELT + Ukraine frontline fetcher +│ ├── region_dossier.py # Right-click country/city intelligence +│ ├── radio_intercept.py # Scanner radio feed integration +│ ├── network_utils.py # HTTP client with curl fallback +│ └── api_settings.py # API key management +│ +├── frontend/ +│ ├── src/ +│ │ ├── app/ +│ │ │ └── page.tsx # Main dashboard — state, polling, layout +│ │ └── components/ +│ │ ├── MaplibreViewer.tsx # Core map — 2,000+ lines, all GeoJSON layers +│ │ ├── NewsFeed.tsx # SIGINT feed + entity detail panels +│ │ ├── WorldviewLeftPanel.tsx # Data layer toggles +│ │ ├── WorldviewRightPanel.tsx # Search + filter sidebar +│ │ ├── FilterPanel.tsx # Basic layer filters +│ │ ├── AdvancedFilterModal.tsx # Airport/country/owner filtering +│ │ ├── MapLegend.tsx # Dynamic legend with all icons +│ │ ├── MarketsPanel.tsx # Global financial markets ticker +│ │ ├── RadioInterceptPanel.tsx # Scanner-style radio panel +│ │ ├── FindLocateBar.tsx # Search/locate bar +│ │ ├── SettingsPanel.tsx # App settings +│ │ ├── ScaleBar.tsx # Map scale indicator +│ │ ├── WikiImage.tsx # Wikipedia image fetcher +│ │ └── ErrorBoundary.tsx # Crash recovery wrapper +│ └── package.json +``` + +--- + +## 🔑 Environment Variables + +Create a `.env` file in the `backend/` directory: + +```env +# Required +AISSTREAM_API_KEY=your_aisstream_key # Maritime vessel tracking +N2YO_API_KEY=your_n2yo_key # Satellite position data + +# Optional (enhances data quality) +OPENSKY_USERNAME=your_opensky_user # Higher rate limits for flight data +OPENSKY_PASSWORD=your_opensky_pass +LTA_ACCOUNT_KEY=your_lta_key # Singapore CCTV cameras +``` + +--- + +## ⚠️ Disclaimer + +This is an **educational and research tool** built entirely on publicly available, open-source intelligence (OSINT) data. No classified, restricted, or non-public data sources are used. Carrier positions are estimates based on public reporting. The military-themed UI is purely aesthetic. + +**Do not use this tool for any operational, military, or intelligence purpose.** + +--- + +## 📜 License + +This project is for educational and personal research purposes. See individual API provider terms of service for data usage restrictions. + +--- + +

+ Built with ☕ and too many API calls +

diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..e46dc11 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.10-slim + +WORKDIR /app + +# Install dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copy source code +COPY . . + +# Expose port +EXPOSE 8000 + +# Start FastAPI server +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/ais_proxy.js b/backend/ais_proxy.js new file mode 100644 index 0000000..f03298f --- /dev/null +++ b/backend/ais_proxy.js @@ -0,0 +1,52 @@ +const WebSocket = require('ws'); + +const args = process.argv.slice(2); +const API_KEY = args[0] || '75cc39af03c9cc23c90e8a7b3c3bc2b2a507c5fb'; + +const FILTER = [ + // US Aircraft Carriers and major naval groups + { "MMSI": 338000000 }, { "MMSI": 338100000 }, // US Navy general prefixes + // Plus let's grab some global shipping for density + { "BoundingBoxes": [[[-90, -180], [90, 180]]] } +]; + +function connect() { + const ws = new WebSocket('wss://stream.aisstream.io/v0/stream'); + + ws.on('open', () => { + const subMsg = { + APIKey: API_KEY, + BoundingBoxes: [ + [[-90, -180], [90, 180]] + ], + FilterMessageTypes: [ + "PositionReport", + "ShipStaticData", + "StandardClassBPositionReport" + ] + }; + ws.send(JSON.stringify(subMsg)); + }); + + ws.on('message', (data) => { + // Output raw AIS message JSON to stdout so Python can consume it + // We ensure exactly one JSON object per line. + try { + const parsed = JSON.parse(data); + console.log(JSON.stringify(parsed)); + } catch (e) { + // ignore non-json + } + }); + + ws.on('error', (err) => { + console.error("WebSocket Proxy Error:", err.message); + }); + + ws.on('close', () => { + console.error("WebSocket Proxy Closed. Reconnecting in 5s..."); + setTimeout(connect, 5000); + }); +} + +connect(); diff --git a/backend/analyze_xlsx.py b/backend/analyze_xlsx.py new file mode 100644 index 0000000..da601b8 --- /dev/null +++ b/backend/analyze_xlsx.py @@ -0,0 +1,112 @@ +import zipfile +import xml.etree.ElementTree as ET +import re +import csv +import os + +xlsx_path = r"f:\Codebase\Oracle\live-risk-dashboard\TheAirTraffic Database.xlsx" +output_path = r"f:\Codebase\Oracle\live-risk-dashboard\backend\xlsx_analysis.txt" + +def parse_xlsx_sheet(z, shared_strings, sheet_num): + ns = {'s': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'} + sheet_file = f'xl/worksheets/sheet{sheet_num}.xml' + if sheet_file not in z.namelist(): + return [] + ws_xml = z.read(sheet_file) + ws_root = ET.fromstring(ws_xml) + rows = [] + for row in ws_root.findall('.//s:sheetData/s:row', ns): + cells = {} + for cell in row.findall('s:c', ns): + cell_ref = cell.get('r', '') + cell_type = cell.get('t', '') + val_elem = cell.find('s:v', ns) + val = val_elem.text if val_elem is not None else '' + if cell_type == 's' and val: + val = shared_strings[int(val)] + col = re.match(r'([A-Z]+)', cell_ref).group(1) if re.match(r'([A-Z]+)', cell_ref) else '' + cells[col] = val + rows.append(cells) + return rows + +with open(output_path, 'w', encoding='utf-8') as out: + with zipfile.ZipFile(xlsx_path, 'r') as z: + shared_strings = [] + if 'xl/sharedStrings.xml' in z.namelist(): + ss_xml = z.read('xl/sharedStrings.xml') + root = ET.fromstring(ss_xml) + ns = {'s': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'} + for si in root.findall('.//s:si', ns): + texts = si.findall('.//s:t', ns) + val = ''.join(t.text or '' for t in texts) + shared_strings.append(val) + + all_entries = [] + for sheet_idx in range(1, 5): + rows = parse_xlsx_sheet(z, shared_strings, sheet_idx) + if not rows: + continue + + out.write(f"\n=== SHEET {sheet_idx}: {len(rows)} rows ===\n") + # Print first 5 rows + for i in range(min(5, len(rows))): + for col in sorted(rows[i].keys(), key=lambda x: (len(x), x)): + val = rows[i][col] + if val: + out.write(f" Row{i} {col}: '{val[:80]}'\n") + out.write("\n") + + for r in rows[1:]: + for col, val in r.items(): + val = str(val).strip() + n_regs = re.findall(r'N\d{1,5}[A-Z]{0,2}', val) + owner = r.get('B', r.get('A', '')).strip() + aircraft_type = r.get('C', r.get('D', '')).strip() + for reg in n_regs: + all_entries.append({ + 'registration': reg.upper(), + 'owner': owner, + 'type': aircraft_type, + 'sheet': sheet_idx + }) + + unique_regs = set(e['registration'] for e in all_entries) + out.write(f"\nTOTAL ENTRIES: {len(all_entries)}\n") + out.write(f"UNIQUE REGISTRATIONS: {len(unique_regs)}\n") + + csv_path = r"f:\Codebase\Oracle\live-risk-dashboard\PLANEALERTLIST\plane-alert-db-main\plane-alert-db.csv" + existing = {} + with open(csv_path, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + for row in reader: + icao = row.get('$ICAO', '').strip().upper() + reg = row.get('$Registration', '').strip().upper() + if reg: + existing[reg] = { + 'icao': icao, + 'category': row.get('Category', ''), + 'operator': row.get('$Operator', ''), + } + + already_in = unique_regs & set(existing.keys()) + missing = unique_regs - set(existing.keys()) + out.write(f"\nplane-alert-db: {len(existing)} registrations\n") + out.write(f"Already covered: {len(already_in)}\n") + out.write(f"MISSING: {len(missing)}\n") + + out.write(f"\n--- ALREADY TRACKED ---\n") + seen = set() + for e in all_entries: + if e['registration'] in already_in and e['registration'] not in seen: + info = existing[e['registration']] + out.write(f" {e['owner'][:40]:40s} {e['registration']:10s} DB_CAT: {info['category'][:25]:25s} DB_OP: {info['operator'][:40]}\n") + seen.add(e['registration']) + + out.write(f"\n--- MISSING (NEED TO ADD) ---\n") + seen = set() + for e in all_entries: + if e['registration'] in missing and e['registration'] not in seen: + out.write(f" {e['owner'][:40]:40s} {e['registration']:10s} TYPE: {e['type'][:30]}\n") + seen.add(e['registration']) + +print(f"Analysis written to {output_path}") diff --git a/backend/check_regions.py b/backend/check_regions.py new file mode 100644 index 0000000..ddf6a89 --- /dev/null +++ b/backend/check_regions.py @@ -0,0 +1,17 @@ +import requests + +regions = [ + {"lat": 39.8, "lon": -98.5, "dist": 2000}, # USA + {"lat": 50.0, "lon": 15.0, "dist": 2000}, # Europe + {"lat": 35.0, "lon": 105.0, "dist": 2000} # Asia / China +] + +for r in regions: + url = f"https://api.adsb.lol/v2/lat/{r['lat']}/lon/{r['lon']}/dist/{r['dist']}" + res = requests.get(url, timeout=10) + if res.status_code == 200: + data = res.json() + acs = data.get("ac", []) + print(f"Region lat:{r['lat']} lon:{r['lon']} dist:{r['dist']} -> Flights: {len(acs)}") + else: + print(f"Error for Region lat:{r['lat']} lon:{r['lon']}: HTTP {res.status_code}") diff --git a/backend/clean_osm_cctvs.py b/backend/clean_osm_cctvs.py new file mode 100644 index 0000000..17bd77c --- /dev/null +++ b/backend/clean_osm_cctvs.py @@ -0,0 +1,10 @@ +import sqlite3 +import os + +db_path = os.path.join(os.path.dirname(__file__), 'cctv.db') +conn = sqlite3.connect(db_path) +cur = conn.cursor() +cur.execute("DELETE FROM cameras WHERE id LIKE 'OSM-%'") +print(f"Deleted {cur.rowcount} OSM cameras from DB.") +conn.commit() +conn.close() diff --git a/backend/data/plane_alert_db.json b/backend/data/plane_alert_db.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/backend/data/plane_alert_db.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/backend/data/tracked_names.json b/backend/data/tracked_names.json new file mode 100644 index 0000000..ec9636e --- /dev/null +++ b/backend/data/tracked_names.json @@ -0,0 +1,8678 @@ +{ + "names": [ + { + "name": "21st Century Fox America", + "category": "Business" + }, + { + "name": "United States of America 747/757", + "category": "Government" + }, + { + "name": "Elon Musk", + "category": "People" + }, + { + "name": "Dallas Mavericks", + "category": "Sports" + }, + { + "name": "Alex Rodriguez", + "category": "Celebrity" + }, + { + "name": "State of Alabama", + "category": "State/Law" + }, + { + "name": "Rolls Royce Test Bed", + "category": "Other" + }, + { + "name": "Bombardier Global 7500", + "category": "Test Aircraft" + }, + { + "name": "CitationMax", + "category": "YouTubers" + }, + { + "name": "Bernie Ecclestone", + "category": "Formula 1" + }, + { + "name": "AbbVie", + "category": "Business" + }, + { + "name": "FBI (Federal Bureau of Investigation)", + "category": "Government" + }, + { + "name": "Bill Gates", + "category": "People" + }, + { + "name": "Arizona Cardinals Football", + "category": "Sports" + }, + { + "name": "Blake Shelton", + "category": "Celebrity" + }, + { + "name": "State of Alaska", + "category": "State/Law" + }, + { + "name": "Zero G Plane", + "category": "Other" + }, + { + "name": "Gulfstream G700", + "category": "Test Aircraft" + }, + { + "name": "Premier1Driver", + "category": "YouTubers" + }, + { + "name": "Chalerm Yoovidhya", + "category": "Formula 1" + }, + { + "name": "Adobe", + "category": "Business" + }, + { + "name": "DOJ (Dept. of Justice)", + "category": "Government" + }, + { + "name": "Melinda Gates", + "category": "People" + }, + { + "name": "Patriots", + "category": "Sports" + }, + { + "name": "Dan Bilzerian", + "category": "Celebrity" + }, + { + "name": "State of Arizona", + "category": "State/Law" + }, + { + "name": "Orbis Flying Eye Hospital", + "category": "Other" + }, + { + "name": "Honeywell 757 Test Bed", + "category": "Test Aircraft" + }, + { + "name": "Baron Pilot", + "category": "YouTubers" + }, + { + "name": "Crown Prince Salman bin Hamad bin Isa Al Khalifa", + "category": "Formula 1" + }, + { + "name": "Aflac", + "category": "Business" + }, + { + "name": "USDHS (Dept. Homeland Sec.)", + "category": "Government" + }, + { + "name": "Larry Ellison", + "category": "People" + }, + { + "name": "Colts", + "category": "Sports" + }, + { + "name": "Dr. Phil & Son", + "category": "Celebrity" + }, + { + "name": "State of Arkansas", + "category": "State/Law" + }, + { + "name": "Samaritan's Purse", + "category": "Other" + }, + { + "name": "Boeing 777-9", + "category": "Test Aircraft" + }, + { + "name": "Stevie Triesenberg", + "category": "YouTubers" + }, + { + "name": "Dietrich Mateschitz", + "category": "Formula 1" + }, + { + "name": "Air Lease Corp.", + "category": "Business" + }, + { + "name": "USCG (Coast Guard)", + "category": "Government" + }, + { + "name": "Mark Cuban", + "category": "People" + }, + { + "name": "Dallas Cowboys", + "category": "Sports" + }, + { + "name": "Taylor Swift", + "category": "Celebrity" + }, + { + "name": "State of California", + "category": "State/Law" + }, + { + "name": "Airbus Beluga", + "category": "Other" + }, + { + "name": "Textron/Beechcraft Denali", + "category": "Test Aircraft" + }, + { + "name": "Matt Guthmiller", + "category": "YouTubers" + }, + { + "name": "Fernando Alonso", + "category": "Formula 1" + }, + { + "name": "Allen & Company", + "category": "Business" + }, + { + "name": "U.S. Marshals (JPATS/Prisoner Transport)", + "category": "Government" + }, + { + "name": "Roman Abramovich", + "category": "People" + }, + { + "name": "JR Motorsports", + "category": "Sports" + }, + { + "name": "Drake", + "category": "Celebrity" + }, + { + "name": "State of Colorado", + "category": "State/Law" + }, + { + "name": "Boeing Dreamlifter", + "category": "Other" + }, + { + "name": "Gulfstream G800", + "category": "Test Aircraft" + }, + { + "name": "steveo1kinevo", + "category": "YouTubers" + }, + { + "name": "Flavio Briatore", + "category": "Formula 1" + }, + { + "name": "American Express", + "category": "Business" + }, + { + "name": "Government of France", + "category": "Government" + }, + { + "name": "Alisher Usmanov", + "category": "People" + }, + { + "name": "Houston Rockets", + "category": "Sports" + }, + { + "name": "State of Connecticut", + "category": "State/Law" + }, + { + "name": "International Air Response", + "category": "Other" + }, + { + "name": "Falcon 6X", + "category": "Test Aircraft" + }, + { + "name": "Angle of Attack", + "category": "YouTubers" + }, + { + "name": "Abbott Labratories", + "category": "Business" + }, + { + "name": "Government of India", + "category": "Government" + }, + { + "name": "Steve Wynn/Wynn Resorts", + "category": "People" + }, + { + "name": "WWE", + "category": "Sports" + }, + { + "name": "Floyd Mayweather", + "category": "Celebrity" + }, + { + "name": "State of Delaware", + "category": "State/Law" + }, + { + "name": "AN124", + "category": "Other" + }, + { + "name": "Eviation Alice", + "category": "Test Aircraft" + }, + { + "name": "Trent Palmer", + "category": "YouTubers" + }, + { + "name": "Gene Haas", + "category": "Formula 1" + }, + { + "name": "American Family Insurance", + "category": "Business" + }, + { + "name": "Government of Qatar", + "category": "Government" + }, + { + "name": "Tom Gores", + "category": "People" + }, + { + "name": "Philadelphia Eagles", + "category": "Sports" + }, + { + "name": "Garth Brooks", + "category": "Celebrity" + }, + { + "name": "State of Florida", + "category": "State/Law" + }, + { + "name": "Swiss Air Ambulance", + "category": "Other" + }, + { + "name": "Cessna C700", + "category": "Test Aircraft" + }, + { + "name": "Dave Sparks / HeavyD", + "category": "YouTubers" + }, + { + "name": "John Malone", + "category": "Formula 1" + }, + { + "name": "Amgen", + "category": "Business" + }, + { + "name": "Government of Abu Dhabi", + "category": "Government" + }, + { + "name": "Paul Tudor Jones", + "category": "People" + }, + { + "name": "Tony Stewart", + "category": "Sports" + }, + { + "name": "George Strait", + "category": "Celebrity" + }, + { + "name": "State of Georgia", + "category": "State/Law" + }, + { + "name": "LifeFlightNetwork", + "category": "Other" + }, + { + "name": "Boeing 737-10 MAX", + "category": "Test Aircraft" + }, + { + "name": "Don Av8's", + "category": "YouTubers" + }, + { + "name": "Lance Stroll", + "category": "Formula 1" + }, + { + "name": "Andreessen Horowitz", + "category": "Business" + }, + { + "name": "Government of Saudi Arabia", + "category": "Government" + }, + { + "name": "Grant Cardone", + "category": "People" + }, + { + "name": "Chase Elliot", + "category": "Sports" + }, + { + "name": "Harrison Ford", + "category": "Celebrity" + }, + { + "name": "DLR - German Aerospace Center", + "category": "Other" + }, + { + "name": "MQ-20 Avenger", + "category": "Test Aircraft" + }, + { + "name": "MojoGrip", + "category": "YouTubers" + }, + { + "name": "Lawrence Stroll", + "category": "Formula 1" + }, + { + "name": "Apollo Global Management", + "category": "Business" + }, + { + "name": "Government of Equatorial Guinea", + "category": "Government" + }, + { + "name": "Jared Isaacman", + "category": "People" + }, + { + "name": "Brad Keselowski", + "category": "Sports" + }, + { + "name": "J Balvin", + "category": "Celebrity" + }, + { + "name": "State of Idaho", + "category": "State/Law" + }, + { + "name": "Lyden Air Cargo", + "category": "Other" + }, + { + "name": "Joby Aviation eVTOL", + "category": "Test Aircraft" + }, + { + "name": "Stefan Drury", + "category": "YouTubers" + }, + { + "name": "Max Verstappen", + "category": "Formula 1" + }, + { + "name": "AT&T", + "category": "Business" + }, + { + "name": "Government of Japan", + "category": "Government" + }, + { + "name": "Marco Andretti", + "category": "Sports" + }, + { + "name": "Jackie Chan", + "category": "Celebrity" + }, + { + "name": "State of Illinois", + "category": "State/Law" + }, + { + "name": "Pratt & Whitney Canada 747SP", + "category": "Other" + }, + { + "name": "Bell V-280 Valor", + "category": "Test Aircraft" + }, + { + "name": "ENTP LIFE", + "category": "YouTubers" + }, + { + "name": "Michael Schumacher", + "category": "Formula 1" + }, + { + "name": "Bank of America", + "category": "Business" + }, + { + "name": "Government State of Kuwait", + "category": "Government" + }, + { + "name": "Jack Ma", + "category": "People" + }, + { + "name": "Dale Earnhardt Family", + "category": "Sports" + }, + { + "name": "Jerry Seinfeld", + "category": "Celebrity" + }, + { + "name": "State of Indiana", + "category": "State/Law" + }, + { + "name": "Dassault Falcon Response Team", + "category": "Other" + }, + { + "name": "Sikorsky SB-1 Defiant", + "category": "Test Aircraft" + }, + { + "name": "Plane and Dirt Simple", + "category": "YouTubers" + }, + { + "name": "Nelson Piquet", + "category": "Formula 1" + }, + { + "name": "Bass Pro Shop", + "category": "Business" + }, + { + "name": "Government of Russia", + "category": "Government" + }, + { + "name": "Ken Griffin", + "category": "People" + }, + { + "name": "Joe Gibbs Racing", + "category": "Sports" + }, + { + "name": "Jim Carrey", + "category": "Celebrity" + }, + { + "name": "State of Iowa", + "category": "State/Law" + }, + { + "name": "Phoenix Air Gulfstream II", + "category": "Other" + }, + { + "name": "Alyssa Miller", + "category": "YouTubers" + }, + { + "name": "Piero Ferrari", + "category": "Formula 1" + }, + { + "name": "Berkshire Hathaway", + "category": "Business" + }, + { + "name": "Government of Turkey", + "category": "Government" + }, + { + "name": "Kimbal Musk", + "category": "People" + }, + { + "name": "Denny Hamlin Racing", + "category": "Sports" + }, + { + "name": "Jimmy Buffet", + "category": "Celebrity" + }, + { + "name": "State of Kansas", + "category": "State/Law" + }, + { + "name": "Calspan Flight Research", + "category": "Other" + }, + { + "name": "Leonardo AW609", + "category": "Test Aircraft" + }, + { + "name": "JR Garage (JR Aviation)", + "category": "YouTubers" + }, + { + "name": "Rubens Barrichello", + "category": "Formula 1" + }, + { + "name": "Berrada Properties", + "category": "Business" + }, + { + "name": "Government of the Netherlands", + "category": "Government" + }, + { + "name": "Stephen Schwarzman", + "category": "People" + }, + { + "name": "Hendrick Motorsports", + "category": "Sports" + }, + { + "name": "John Travolta", + "category": "Celebrity" + }, + { + "name": "State of Kentucky", + "category": "State/Law" + }, + { + "name": "Surveillance Australia", + "category": "Other" + }, + { + "name": "Scaled Composites Proteus", + "category": "Test Aircraft" + }, + { + "name": "Pickle Driver (SF50)", + "category": "YouTubers" + }, + { + "name": "Scuderia AlphaTauri", + "category": "Formula 1" + }, + { + "name": "BIC Lighters and Pens", + "category": "Business" + }, + { + "name": "Government of Bangladesh", + "category": "Government" + }, + { + "name": "Steve Witkoff", + "category": "People" + }, + { + "name": "Stewart-Haas Racing", + "category": "Sports" + }, + { + "name": "Julio Iglesias", + "category": "Celebrity" + }, + { + "name": "State of Louisiana", + "category": "State/Law" + }, + { + "name": "Mayo Clinic", + "category": "Other" + }, + { + "name": "Textron AirLand Scorpion", + "category": "Test Aircraft" + }, + { + "name": "Fly With Own (Non-owner Pilot)", + "category": "YouTubers" + }, + { + "name": "Sergio Perez", + "category": "Formula 1" + }, + { + "name": "BlackRock", + "category": "Business" + }, + { + "name": "Government of South Africa", + "category": "Government" + }, + { + "name": "George Lucas", + "category": "People" + }, + { + "name": "Penske Racing", + "category": "Sports" + }, + { + "name": "Keith Urban", + "category": "Celebrity" + }, + { + "name": "State of Maine", + "category": "State/Law" + }, + { + "name": "NAV Canada Flight Inspection", + "category": "Other" + }, + { + "name": "BETA Tech eVTOL", + "category": "Test Aircraft" + }, + { + "name": "Ricky Gutierrez & JR Garage", + "category": "YouTubers" + }, + { + "name": "Blackstone", + "category": "Business" + }, + { + "name": "Royal Air Force", + "category": "Government" + }, + { + "name": "James Simmons", + "category": "People" + }, + { + "name": "Richard Childress Racing", + "category": "Sports" + }, + { + "name": "Kenny Chesney", + "category": "Celebrity" + }, + { + "name": "State of Maryland", + "category": "State/Law" + }, + { + "name": "Life Lion (Hershey Medical Center)", + "category": "Other" + }, + { + "name": "Boeing 737-7 MAX", + "category": "Test Aircraft" + }, + { + "name": "christophe jouany", + "category": "YouTubers" + }, + { + "name": "BMW Automotive", + "category": "Business" + }, + { + "name": "National Nuclear Security Administration", + "category": "Government" + }, + { + "name": "Magic Johnson", + "category": "People" + }, + { + "name": "Victory Aviation (NASCAR)", + "category": "Sports" + }, + { + "name": "Kid Rock", + "category": "Celebrity" + }, + { + "name": "State of Massachusetts", + "category": "State/Law" + }, + { + "name": "NASA", + "category": "Other" + }, + { + "name": "Boeing 777 EcoDemonstrator", + "category": "Test Aircraft" + }, + { + "name": "Blue Star Airways", + "category": "YouTubers" + }, + { + "name": "BNSF Railway", + "category": "Business" + }, + { + "name": "New Zealand Air Force", + "category": "Government" + }, + { + "name": "Johnny Ive", + "category": "People" + }, + { + "name": "Aaron Rogers", + "category": "Sports" + }, + { + "name": "Kim Kardashian", + "category": "Celebrity" + }, + { + "name": "State of Michigan", + "category": "State/Law" + }, + { + "name": "Boeing 787-8 Test Bed", + "category": "Test Aircraft" + }, + { + "name": "SlowAsianDriver", + "category": "YouTubers" + }, + { + "name": "Calspan Defense Corp", + "category": "Business" + }, + { + "name": "Government of Ukraine", + "category": "Government" + }, + { + "name": "Craig McCaw", + "category": "People" + }, + { + "name": "Troy Aikman", + "category": "Sports" + }, + { + "name": "Kylie Jenner", + "category": "Celebrity" + }, + { + "name": "State of Minnesota", + "category": "State/Law" + }, + { + "name": "National Science Foundation", + "category": "Other" + }, + { + "name": "Stratos 716", + "category": "Test Aircraft" + }, + { + "name": "Grant Baker", + "category": "YouTubers" + }, + { + "name": "CarMax", + "category": "Business" + }, + { + "name": "Israel Air Force", + "category": "Government" + }, + { + "name": "John McCaw", + "category": "People" + }, + { + "name": "Russell Wilson", + "category": "Sports" + }, + { + "name": "Luke Bryan", + "category": "Celebrity" + }, + { + "name": "State of Mississippi", + "category": "State/Law" + }, + { + "name": "Innovation First Research and Development Inc", + "category": "Other" + }, + { + "name": "Boeing 757 (F-22 Testbed)", + "category": "Test Aircraft" + }, + { + "name": "Ginger the Plane", + "category": "YouTubers" + }, + { + "name": "Carrier Corp", + "category": "Business" + }, + { + "name": "Government of Iran", + "category": "Government" + }, + { + "name": "Phil Knight (NIKE)", + "category": "People" + }, + { + "name": "Las Vegas Golden Knights", + "category": "Sports" + }, + { + "name": "Mark Wahlberg", + "category": "Celebrity" + }, + { + "name": "State of Missouri", + "category": "State/Law" + }, + { + "name": "T2 Aviation (Oil Spill Response", + "category": "Other" + }, + { + "name": "Micke Lang", + "category": "YouTubers" + }, + { + "name": "Carvana/DriveTime", + "category": "Business" + }, + { + "name": "Government of Canada", + "category": "Government" + }, + { + "name": "Rick Caruso", + "category": "People" + }, + { + "name": "Sergio Garcia", + "category": "Sports" + }, + { + "name": "Michael Jordan", + "category": "Celebrity" + }, + { + "name": "State of Montana", + "category": "State/Law" + }, + { + "name": "FAAM Airborne Laboratory", + "category": "Other" + }, + { + "name": "Gulfstream G400", + "category": "Test Aircraft" + }, + { + "name": "Meet Kevin", + "category": "YouTubers" + }, + { + "name": "Caterpillar Inc.", + "category": "Business" + }, + { + "name": "Royal Australian Air Force", + "category": "Government" + }, + { + "name": "Eric Schmidt", + "category": "People" + }, + { + "name": "Tennessee Titans", + "category": "Sports" + }, + { + "name": "Oprah Winfrey", + "category": "Celebrity" + }, + { + "name": "State of Nebraska", + "category": "State/Law" + }, + { + "name": "Airbus Racer", + "category": "Test Aircraft" + }, + { + "name": "MATCH1N", + "category": "YouTubers" + }, + { + "name": "CBS Media", + "category": "Business" + }, + { + "name": "Government/Police of Mexico", + "category": "Government" + }, + { + "name": "DeVos Family", + "category": "People" + }, + { + "name": "Drew Brees", + "category": "Sports" + }, + { + "name": "Ozuna", + "category": "Celebrity" + }, + { + "name": "State of Nevada", + "category": "State/Law" + }, + { + "name": "Excalibur Testbed", + "category": "Test Aircraft" + }, + { + "name": "Mike Patey", + "category": "YouTubers" + }, + { + "name": "Chevron", + "category": "Business" + }, + { + "name": "Government of North Korea", + "category": "Government" + }, + { + "name": "Yusaku Mazawa", + "category": "People" + }, + { + "name": "LA Chargers", + "category": "Sports" + }, + { + "name": "Pitbull", + "category": "Celebrity" + }, + { + "name": "State of New Hampshire", + "category": "State/Law" + }, + { + "name": "Hermeus Quarterhorse", + "category": "Test Aircraft" + }, + { + "name": "Wifi-Money", + "category": "YouTubers" + }, + { + "name": "Chick-Fil-A", + "category": "Business" + }, + { + "name": "Government of Malaysia", + "category": "Government" + }, + { + "name": "Richard Branson", + "category": "People" + }, + { + "name": "Riley Herbst", + "category": "Sports" + }, + { + "name": "Playboy", + "category": "Celebrity" + }, + { + "name": "State of New Jersey", + "category": "State/Law" + }, + { + "name": "Blue Max Six", + "category": "YouTubers" + }, + { + "name": "Chipotle", + "category": "Business" + }, + { + "name": "Government of Egypt", + "category": "Government" + }, + { + "name": "Tony Robbins", + "category": "People" + }, + { + "name": "Robert Penske", + "category": "Sports" + }, + { + "name": "Jay-Z", + "category": "Celebrity" + }, + { + "name": "State of New Mexico", + "category": "State/Law" + }, + { + "name": "Gear Down", + "category": "YouTubers" + }, + { + "name": "Choice Hotels", + "category": "Business" + }, + { + "name": "Government of Zambia", + "category": "Government" + }, + { + "name": "Tiger Woods", + "category": "People" + }, + { + "name": "Jim Crane/Houston Astros", + "category": "Sports" + }, + { + "name": "Rick Ross", + "category": "Celebrity" + }, + { + "name": "State of New York", + "category": "State/Law" + }, + { + "name": "Becki and Chris", + "category": "YouTubers" + }, + { + "name": "Cisco Systems", + "category": "Business" + }, + { + "name": "Government of the United Kingdom", + "category": "Government" + }, + { + "name": "Sebastian Kulczyk", + "category": "People" + }, + { + "name": "John Henry/Boston Red Sox", + "category": "Sports" + }, + { + "name": "Rihanna", + "category": "Celebrity" + }, + { + "name": "State of North Carolina", + "category": "State/Law" + }, + { + "name": "Blaze Grubbs", + "category": "YouTubers" + }, + { + "name": "Citigroup", + "category": "Business" + }, + { + "name": "Government of Spain", + "category": "Government" + }, + { + "name": "Kilmer Management LP", + "category": "Sports" + }, + { + "name": "State of North Dakota", + "category": "State/Law" + }, + { + "name": "Accidental Aviator", + "category": "YouTubers" + }, + { + "name": "Clayton Homes", + "category": "Business" + }, + { + "name": "Government of Croatia", + "category": "Government" + }, + { + "name": "Olympia Aviation (Detroit Red Wings/Tigers)", + "category": "Sports" + }, + { + "name": "Sammy Hagar", + "category": "Celebrity" + }, + { + "name": "State of Ohio", + "category": "State/Law" + }, + { + "name": "Coca-Cola", + "category": "Business" + }, + { + "name": "Government of Bulgaria", + "category": "Government" + }, + { + "name": "David Rubenstein", + "category": "People" + }, + { + "name": "John Mara/NY Giants", + "category": "Sports" + }, + { + "name": "Sebastian Maniscalco", + "category": "Celebrity" + }, + { + "name": "State of Oklahoma", + "category": "State/Law" + }, + { + "name": "Congra Brands", + "category": "Business" + }, + { + "name": "Government of Czech Republic", + "category": "Government" + }, + { + "name": "Vasil Bojkov", + "category": "People" + }, + { + "name": "Saints/Pelicans", + "category": "Sports" + }, + { + "name": "Shaq", + "category": "Celebrity" + }, + { + "name": "State of Oregon", + "category": "State/Law" + }, + { + "name": "Conoco", + "category": "Business" + }, + { + "name": "Government of Poland", + "category": "Government" + }, + { + "name": "Mark Zuckerberg", + "category": "People" + }, + { + "name": "Ron Fowler/San Diego Padres", + "category": "Sports" + }, + { + "name": "Steven Spielberg", + "category": "Celebrity" + }, + { + "name": "State of Pennsylvania", + "category": "State/Law" + }, + { + "name": "ConocoPhillips", + "category": "Business" + }, + { + "name": "Government of Slovenia", + "category": "Government" + }, + { + "name": "Mike Bloomberg", + "category": "People" + }, + { + "name": "John Middleton/Phillies", + "category": "Sports" + }, + { + "name": "Toby Kieth", + "category": "Celebrity" + }, + { + "name": "Costar Realty", + "category": "Business" + }, + { + "name": "Government of Cote d'Ivoire", + "category": "Government" + }, + { + "name": "Jim Ovia", + "category": "People" + }, + { + "name": "Cristiano Ronaldo", + "category": "Sports" + }, + { + "name": "Tom Cruise", + "category": "Celebrity" + }, + { + "name": "State of South Carolina", + "category": "State/Law" + }, + { + "name": "Business", + "category": "Business" + }, + { + "name": "Government", + "category": "Government" + }, + { + "name": "People", + "category": "People" + }, + { + "name": "Sports", + "category": "Sports" + }, + { + "name": "Celebrity", + "category": "Celebrity" + }, + { + "name": "State Govt./Law", + "category": "State/Law" + }, + { + "name": "Other", + "category": "Other" + }, + { + "name": "Test Aircraft", + "category": "Test Aircraft" + }, + { + "name": "YouTubers", + "category": "YouTubers" + }, + { + "name": "Formula 1 VIP's", + "category": "Formula 1" + }, + { + "name": "Silver Lake Technology Management", + "category": "Business" + }, + { + "name": "Government of Nigeria", + "category": "Government" + }, + { + "name": "David Geffen", + "category": "People" + }, + { + "name": "Jody Allen/Seahawks & Trail Blazers (Paul Allen Estate)", + "category": "Sports" + }, + { + "name": "Tyler Perry", + "category": "Celebrity" + }, + { + "name": "State of South Dakota", + "category": "State/Law" + }, + { + "name": "Costco Wholesale", + "category": "Business" + }, + { + "name": "Government of Pakistan", + "category": "Government" + }, + { + "name": "Laurene Powell Jobs", + "category": "People" + }, + { + "name": "Rory McIlroy", + "category": "Sports" + }, + { + "name": "Dierks Bentley", + "category": "Celebrity" + }, + { + "name": "State of Tennessee", + "category": "State/Law" + }, + { + "name": "COX TV/Communications", + "category": "Business" + }, + { + "name": "Government of Gabon", + "category": "Government" + }, + { + "name": "Ralph Lauren", + "category": "People" + }, + { + "name": "John Elway", + "category": "Sports" + }, + { + "name": "Paris Hilton", + "category": "Celebrity" + }, + { + "name": "State of Texas", + "category": "State/Law" + }, + { + "name": "Cracker Barrel", + "category": "Business" + }, + { + "name": "Government of Brazil", + "category": "Government" + }, + { + "name": "Adam Weitsman", + "category": "People" + }, + { + "name": "Adam Scott", + "category": "Sports" + }, + { + "name": "DJ Khaled", + "category": "Celebrity" + }, + { + "name": "State of Utah", + "category": "State/Law" + }, + { + "name": "Cummins Inc", + "category": "Business" + }, + { + "name": "Government of Panama", + "category": "Government" + }, + { + "name": "Nancy Walton", + "category": "People" + }, + { + "name": "David Tepper", + "category": "Sports" + }, + { + "name": "CVS", + "category": "Business" + }, + { + "name": "Government of Italy", + "category": "Government" + }, + { + "name": "Tim Gillean", + "category": "People" + }, + { + "name": "Robert Kraft", + "category": "Sports" + }, + { + "name": "State of Virginia", + "category": "State/Law" + }, + { + "name": "Dell", + "category": "Business" + }, + { + "name": "Government of Switzerland", + "category": "Government" + }, + { + "name": "Ha Du Long", + "category": "People" + }, + { + "name": "Jason Kelce", + "category": "Sports" + }, + { + "name": "State of Washington", + "category": "State/Law" + }, + { + "name": "Dick's Sporting Goods", + "category": "Business" + }, + { + "name": "Government of Hungary", + "category": "Government" + }, + { + "name": "Nick Woodman", + "category": "People" + }, + { + "name": "Craig Leipold/Minnesota Wild", + "category": "Sports" + }, + { + "name": "State of West Virginia", + "category": "State/Law" + }, + { + "name": "DigitalBridge", + "category": "Business" + }, + { + "name": "Government of Ireland", + "category": "Government" + }, + { + "name": "Sawiris Family", + "category": "People" + }, + { + "name": "Detroit Red Wings", + "category": "Sports" + }, + { + "name": "State of Wisconsin", + "category": "State/Law" + }, + { + "name": "Dillards Dept. Stores", + "category": "Business" + }, + { + "name": "Government of Chile", + "category": "Government" + }, + { + "name": "Ted Turner", + "category": "People" + }, + { + "name": "Patrick Mahomes (Part Owner)", + "category": "Sports" + }, + { + "name": "State of Wyoming", + "category": "State/Law" + }, + { + "name": "Dippin Dots", + "category": "Business" + }, + { + "name": "Johor Royal Family", + "category": "Government" + }, + { + "name": "Tilman Fertitta", + "category": "People" + }, + { + "name": "Lionel Messi", + "category": "Sports" + }, + { + "name": "Discovery Land Company Real Estate", + "category": "Business" + }, + { + "name": "Government of Ecuador", + "category": "Government" + }, + { + "name": "Shahid Khan", + "category": "People" + }, + { + "name": "Disney", + "category": "Business" + }, + { + "name": "Government of Thailand", + "category": "Government" + }, + { + "name": "Santo Domingo Family", + "category": "People" + }, + { + "name": "DMB Associates Real Estate", + "category": "Business" + }, + { + "name": "Andrew Forrest", + "category": "People" + }, + { + "name": "Dollar General", + "category": "Business" + }, + { + "name": "Kingdom of Eswatini", + "category": "Government" + }, + { + "name": "Steve Ballmer", + "category": "People" + }, + { + "name": "Dollar Tree", + "category": "Business" + }, + { + "name": "Government of Belarus", + "category": "Government" + }, + { + "name": "Arthur Blank", + "category": "People" + }, + { + "name": "Domino's", + "category": "Business" + }, + { + "name": "Government of Germany", + "category": "Government" + }, + { + "name": "John W. Henry", + "category": "People" + }, + { + "name": "Draft Kings", + "category": "Business" + }, + { + "name": "Government of Algeria", + "category": "Government" + }, + { + "name": "Jim Crane", + "category": "People" + }, + { + "name": "DS Advisors (Equitec)", + "category": "Business" + }, + { + "name": "Government of Angola", + "category": "Government" + }, + { + "name": "Jimmy Johnson", + "category": "People" + }, + { + "name": "Duke Energy", + "category": "Business" + }, + { + "name": "Government of Argentina", + "category": "Government" + }, + { + "name": "Stan Kronke", + "category": "People" + }, + { + "name": "Dutch Bros Coffee", + "category": "Business" + }, + { + "name": "Government of Armenia", + "category": "Government" + }, + { + "name": "Sergey Brin", + "category": "People" + }, + { + "name": "Eli Lilly and Company", + "category": "Business" + }, + { + "name": "Government of Azerbaijan", + "category": "Government" + }, + { + "name": "Ted Leonsis", + "category": "People" + }, + { + "name": "Enterprise Car Rental", + "category": "Business" + }, + { + "name": "Bahrain Royal Flight", + "category": "Government" + }, + { + "name": "Phil Ruffin", + "category": "People" + }, + { + "name": "ExxonMobile", + "category": "Business" + }, + { + "name": "Government of Belgium", + "category": "Government" + }, + { + "name": "Paul L. Foster", + "category": "People" + }, + { + "name": "FedEx", + "category": "Business" + }, + { + "name": "Government of Bolivia", + "category": "Government" + }, + { + "name": "Wesley Edens", + "category": "People" + }, + { + "name": "First Horizon Bank", + "category": "Business" + }, + { + "name": "Government of Tanzania", + "category": "Government" + }, + { + "name": "Jeff Bezos", + "category": "People" + }, + { + "name": "Five Guys", + "category": "Business" + }, + { + "name": "Government of Turkmenistan", + "category": "Government" + }, + { + "name": "Fertitta (Casinos + Houston Rockets)", + "category": "People" + }, + { + "name": "Ford", + "category": "Business" + }, + { + "name": "Republic of Tatarstan(RU)", + "category": "Government" + }, + { + "name": "David MacNeil", + "category": "People" + }, + { + "name": "Franklin Templeton Investments", + "category": "Business" + }, + { + "name": "Government of Jordan", + "category": "Government" + }, + { + "name": "Mike Lindell", + "category": "People" + }, + { + "name": "GAP Inc.", + "category": "Business" + }, + { + "name": "John Paulson", + "category": "People" + }, + { + "name": "General Dynamics", + "category": "Business" + }, + { + "name": "Joe Manchin", + "category": "People" + }, + { + "name": "Globus Medical", + "category": "Business" + }, + { + "name": "Dennis Washington", + "category": "People" + }, + { + "name": "Goldman Sachs", + "category": "Business" + }, + { + "name": "Murdoch Family", + "category": "People" + }, + { + "name": "Goodyear Tire & Rubber Company", + "category": "Business" + }, + { + "name": "Dan Newlin", + "category": "People" + }, + { + "name": "Google", + "category": "Business" + }, + { + "name": "Leon Black", + "category": "People" + }, + { + "name": "Grady White Boats", + "category": "Business" + }, + { + "name": "Great Clips", + "category": "Business" + }, + { + "name": "Mark Benioff", + "category": "People" + }, + { + "name": "Guggenheim Partners", + "category": "Business" + }, + { + "name": "Jim Breyer", + "category": "People" + }, + { + "name": "Hallmark Cards", + "category": "Business" + }, + { + "name": "John Staluppi", + "category": "People" + }, + { + "name": "Hard Rock", + "category": "Business" + }, + { + "name": "Jeffrey Soffer", + "category": "People" + }, + { + "name": "Hershey Foods", + "category": "Business" + }, + { + "name": "Gulfstream C-37A", + "category": "Government" + }, + { + "name": "Peter Thiel", + "category": "People" + }, + { + "name": "Hess Corp", + "category": "Business" + }, + { + "name": "Gulfstream C-37B", + "category": "Government" + }, + { + "name": "George William Davies", + "category": "People" + }, + { + "name": "Hilton Hotels", + "category": "Business" + }, + { + "name": "Gulfstream C-20C", + "category": "Government" + }, + { + "name": "Winklevoss Twins (Crypto)", + "category": "People" + }, + { + "name": "Hobby Lobby", + "category": "Business" + }, + { + "name": "Gulfstream C-20H", + "category": "Government" + }, + { + "name": "Jacob Arabo", + "category": "People" + }, + { + "name": "Honeywell", + "category": "Business" + }, + { + "name": "Cessna UC-35A/B", + "category": "Government" + }, + { + "name": "Donald Trump", + "category": "People" + }, + { + "name": "HP", + "category": "Business" + }, + { + "name": "Beoing E4B", + "category": "Government" + }, + { + "name": "Chairul Tanjung", + "category": "People" + }, + { + "name": "Huntsman Jet", + "category": "Business" + }, + { + "name": "Bombardier E-11A", + "category": "Government" + }, + { + "name": "Trevor Milton", + "category": "People" + }, + { + "name": "Hy-Vee Grocery", + "category": "Business" + }, + { + "name": "E-11A BACN & R1 Sentinel", + "category": "Government" + }, + { + "name": "Ted Waitt", + "category": "People" + }, + { + "name": "Hyundai", + "category": "Business" + }, + { + "name": "IAI C-38A Courier", + "category": "Government" + }, + { + "name": "Stanley Druckenmiller", + "category": "People" + }, + { + "name": "IBM", + "category": "Business" + }, + { + "name": "Army ARES Bombardier Global", + "category": "Government" + }, + { + "name": "Thomas Siebel", + "category": "People" + }, + { + "name": "Intel Air Shuttle (Intel)", + "category": "Business" + }, + { + "name": "C-9B Skytrain II", + "category": "Government" + }, + { + "name": "Josh Altman", + "category": "People" + }, + { + "name": "Jacksons Food Stores", + "category": "Business" + }, + { + "name": "RC-12X Guardrail", + "category": "Government" + }, + { + "name": "Peter Lim", + "category": "People" + }, + { + "name": "JCB Manufacturing", + "category": "Business" + }, + { + "name": "COMCO", + "category": "Government" + }, + { + "name": "Robert F. Smith", + "category": "People" + }, + { + "name": "JDS Development", + "category": "Business" + }, + { + "name": "FEST (Foreign Emergency Support Team)", + "category": "Government" + }, + { + "name": "David Grain", + "category": "People" + }, + { + "name": "John Deere", + "category": "Business" + }, + { + "name": "RQ-4 Global Hawk", + "category": "Government" + }, + { + "name": "David Sacks", + "category": "People" + }, + { + "name": "Johnson & Johnson", + "category": "Business" + }, + { + "name": "WC-135R Constant Phoenix", + "category": "Government" + }, + { + "name": "Tommy Hilfiger", + "category": "People" + }, + { + "name": "Johnson Development", + "category": "Business" + }, + { + "name": "U.S. Marines C-40A", + "category": "Government" + }, + { + "name": "Edward Norton", + "category": "People" + }, + { + "name": "Johnsonville Brats", + "category": "Business" + }, + { + "name": "CIA Linked", + "category": "Government" + }, + { + "name": "Ed DeBartolo", + "category": "People" + }, + { + "name": "JP Morgan", + "category": "Business" + }, + { + "name": "U.S. Govt. Special Missions", + "category": "Government" + }, + { + "name": "Jerry Jones", + "category": "People" + }, + { + "name": "JRK Property Holdings", + "category": "Business" + }, + { + "name": "B-29 Superfortress", + "category": "Government" + }, + { + "name": "Fred Luddy", + "category": "People" + }, + { + "name": "L-3 Communications", + "category": "Government" + }, + { + "name": "Dan Snyder", + "category": "People" + }, + { + "name": "Khosla Ventures", + "category": "Business" + }, + { + "name": "L3 Harris Technologies", + "category": "Government" + }, + { + "name": "Alejandro Roemmers", + "category": "People" + }, + { + "name": "Kiewit Engineering Co.", + "category": "Business" + }, + { + "name": "Tenax Aerospace", + "category": "Government" + }, + { + "name": "Paul Randy", + "category": "People" + }, + { + "name": "Knight-Swift Trucking", + "category": "Business" + }, + { + "name": "ARTEMIS Platform", + "category": "Government" + }, + { + "name": "Charles Hoskinson", + "category": "People" + }, + { + "name": "Koch Industries", + "category": "Business" + }, + { + "name": "USAF/Big Safari/SierraNevCor", + "category": "Government" + }, + { + "name": "Jimmy John Liautaud", + "category": "People" + }, + { + "name": "Kohler Co.", + "category": "Business" + }, + { + "name": "Ukraine War Survalliance Plane", + "category": "Government" + }, + { + "name": "Chase Coleman", + "category": "People" + }, + { + "name": "Kroger", + "category": "Business" + }, + { + "name": "Lockheed Gulfstream", + "category": "Government" + }, + { + "name": "Andy Albright", + "category": "People" + }, + { + "name": "Las Vegas Sands", + "category": "Business" + }, + { + "name": "Top Aces F16's", + "category": "Government" + }, + { + "name": "Dmitry Balyasny", + "category": "People" + }, + { + "name": "Leisure Pools", + "category": "Business" + }, + { + "name": "AVdef", + "category": "Government" + }, + { + "name": "John Ruiz", + "category": "People" + }, + { + "name": "LG Electronics", + "category": "Business" + }, + { + "name": "Northrup Grumman", + "category": "Government" + }, + { + "name": "Mark Juncosa (SpaceX VP)", + "category": "People" + }, + { + "name": "Liberty Mutual Insurance", + "category": "Business" + }, + { + "name": "Air Force Materiel Command-GRUMMAN", + "category": "Government" + }, + { + "name": "Jan Koum", + "category": "People" + }, + { + "name": "Lockheed Martin", + "category": "Business" + }, + { + "name": "Military HALO Gulfstreams", + "category": "Government" + }, + { + "name": "Taylor Gerring", + "category": "People" + }, + { + "name": "Lowes", + "category": "Business" + }, + { + "name": "Government 707", + "category": "Government" + }, + { + "name": "Chris Sacca", + "category": "People" + }, + { + "name": "Maersk Shipping Company", + "category": "Business" + }, + { + "name": "MIT Lincoln Lab", + "category": "Government" + }, + { + "name": "John Doerr", + "category": "People" + }, + { + "name": "Mandalay Vegas Resorts", + "category": "Business" + }, + { + "name": "Marriott Hotels", + "category": "Business" + }, + { + "name": "Larry Page", + "category": "People" + }, + { + "name": "Mary Kay Inc.", + "category": "Business" + }, + { + "name": "Jerry Yang", + "category": "People" + }, + { + "name": "McDonalds", + "category": "Business" + }, + { + "name": "Robert Pera", + "category": "People" + }, + { + "name": "McNeil Consumer Healthcare (Tylenol)", + "category": "Business" + }, + { + "name": "Roleof Botha", + "category": "People" + }, + { + "name": "Plumb Bill Pay", + "category": "Business" + }, + { + "name": "Phillip Sarofim", + "category": "People" + }, + { + "name": "Meijer Stores", + "category": "Business" + }, + { + "name": "Joe Tsai", + "category": "People" + }, + { + "name": "Menards", + "category": "Business" + }, + { + "name": "Learjet C-21A", + "category": "Government" + }, + { + "name": "Amnon Shashua", + "category": "People" + }, + { + "name": "Merck", + "category": "Business" + }, + { + "name": "Eytan Stibbe", + "category": "People" + }, + { + "name": "Micron", + "category": "Business" + }, + { + "name": "Woody Johnson", + "category": "People" + }, + { + "name": "Miliken", + "category": "Business" + }, + { + "name": "Boeing C-40A/B Clipper", + "category": "Government" + }, + { + "name": "Mark Burnett", + "category": "People" + }, + { + "name": "Morgan and Morgan Law Firm", + "category": "Business" + }, + { + "name": "Andr\u00e9 Esteves", + "category": "People" + }, + { + "name": "Morgan Stanley", + "category": "Business" + }, + { + "name": "Nick Marietta", + "category": "People" + }, + { + "name": "Nanoworks", + "category": "Business" + }, + { + "name": "Boeing E-3G Sentry", + "category": "Government" + }, + { + "name": "Nestle USA", + "category": "Business" + }, + { + "name": "Jared Kushner", + "category": "People" + }, + { + "name": "Netflix", + "category": "Business" + }, + { + "name": "Charles Simonyi", + "category": "People" + }, + { + "name": "Niagara Water Bottling", + "category": "Business" + }, + { + "name": "FAA", + "category": "Government" + }, + { + "name": "Jon A Shirley", + "category": "People" + }, + { + "name": "Nike", + "category": "Business" + }, + { + "name": "Kevin Harvey", + "category": "People" + }, + { + "name": "Norfolk Southern Railroad", + "category": "Business" + }, + { + "name": "Jeffrey Vinik", + "category": "People" + }, + { + "name": "Oaktree Capital", + "category": "Business" + }, + { + "name": "B-52", + "category": "Government" + }, + { + "name": "Greg Wyler (OneWeb)", + "category": "People" + }, + { + "name": "Oracle", + "category": "Business" + }, + { + "name": "B-1B", + "category": "Government" + }, + { + "name": "Meet Kevin (YouTuber)", + "category": "People" + }, + { + "name": "OtterBox", + "category": "Business" + }, + { + "name": "Gwyenn Shotwell (SpaceX)", + "category": "People" + }, + { + "name": "PACCAR", + "category": "Business" + }, + { + "name": "Antonio Gracias (Valor Equity Partners)", + "category": "People" + }, + { + "name": "Palantir", + "category": "Business" + }, + { + "name": "David Katzman (SmileDirect)", + "category": "People" + }, + { + "name": "Panda Express", + "category": "Business" + }, + { + "name": "Wes Edens", + "category": "People" + }, + { + "name": "Pap\u00e9 Machinery", + "category": "Business" + }, + { + "name": "Remon Voss", + "category": "People" + }, + { + "name": "Paramount Pictures", + "category": "Business" + }, + { + "name": "Joseph Edelman", + "category": "People" + }, + { + "name": "Pasaca Capital", + "category": "Business" + }, + { + "name": "Glennon Crowell Jr.", + "category": "People" + }, + { + "name": "Patek Philippe SA", + "category": "Business" + }, + { + "name": "Pritzker Family", + "category": "People" + }, + { + "name": "PayPal", + "category": "Business" + }, + { + "name": "Aliko Dangote", + "category": "People" + }, + { + "name": "Penn National Gaming", + "category": "Business" + }, + { + "name": "John Schnatter (Papa Johns)", + "category": "People" + }, + { + "name": "Pepsi", + "category": "Business" + }, + { + "name": "Stephanie Shojaee (Shoma Real Estate)", + "category": "People" + }, + { + "name": "Perenco", + "category": "Business" + }, + { + "name": "Nelson Peltz", + "category": "People" + }, + { + "name": "Peterson Companies", + "category": "Business" + }, + { + "name": "Jerry Savelle (televangelist )", + "category": "People" + }, + { + "name": "Pfizer", + "category": "Business" + }, + { + "name": "Michael Niederst (Real estate)", + "category": "People" + }, + { + "name": "Prada", + "category": "Business" + }, + { + "name": "Eric Lefkofsky (Groupon)", + "category": "People" + }, + { + "name": "Precision Castparts", + "category": "Business" + }, + { + "name": "Brad Keywell (Groupon and Uptake Tech)", + "category": "People" + }, + { + "name": "Prime Inc.", + "category": "Business" + }, + { + "name": "James Williamson", + "category": "People" + }, + { + "name": "Principal Financial", + "category": "Business" + }, + { + "name": "Michael Saylor (MicroStrategy)", + "category": "People" + }, + { + "name": "Proctor & Gamble", + "category": "Business" + }, + { + "name": "Michael Milken", + "category": "People" + }, + { + "name": "Prudential Insurance", + "category": "Business" + }, + { + "name": "Patrick Dovigi", + "category": "People" + }, + { + "name": "Publix Supermarkets", + "category": "Business" + }, + { + "name": "John A. Sobrato", + "category": "People" + }, + { + "name": "Puma", + "category": "Business" + }, + { + "name": "Ty Warner", + "category": "People" + }, + { + "name": "Purina Petcare", + "category": "Business" + }, + { + "name": "Louis Bacon", + "category": "People" + }, + { + "name": "Qualcomm", + "category": "Business" + }, + { + "name": "Laurence Escalante (theleecollection)", + "category": "People" + }, + { + "name": "Quest Diagnostics (BE58)", + "category": "Business" + }, + { + "name": "Mohamed El Enein", + "category": "People" + }, + { + "name": "Quest Diagnostics (Other)", + "category": "Business" + }, + { + "name": "Kris Krohn", + "category": "People" + }, + { + "name": "Quest Diagnostics (PC12)", + "category": "Business" + }, + { + "name": "Danny Jenkins", + "category": "People" + }, + { + "name": "Raytheon", + "category": "Business" + }, + { + "name": "Erik Prince", + "category": "People" + }, + { + "name": "RealPage Real Estate", + "category": "Business" + }, + { + "name": "Alan Waxman Sixth Street Partners", + "category": "People" + }, + { + "name": "Related Companies (Stephen Ross)", + "category": "Business" + }, + { + "name": "Pierre Omidyar", + "category": "People" + }, + { + "name": "Resturant Brands Intl.", + "category": "Business" + }, + { + "name": "Richard T. Santulli", + "category": "People" + }, + { + "name": "Rocket Lab Helicopters", + "category": "Business" + }, + { + "name": "Vick Tipnes", + "category": "People" + }, + { + "name": "Tom and Steuart Walton", + "category": "People" + }, + { + "name": "Rooms to Go", + "category": "Business" + }, + { + "name": "Cohen Brothers", + "category": "People" + }, + { + "name": "RTW Investments", + "category": "Business" + }, + { + "name": "Ronald Perelman", + "category": "People" + }, + { + "name": "RyanAir Support Aircraft", + "category": "Business" + }, + { + "name": "Tom Werner", + "category": "People" + }, + { + "name": "S C Johnson", + "category": "Business" + }, + { + "name": "Jon Gray", + "category": "People" + }, + { + "name": "Samsung", + "category": "Business" + }, + { + "name": "Robert Herjavec", + "category": "People" + }, + { + "name": "ScottsMiracle-Gro", + "category": "Business" + }, + { + "name": "Jeff Swickard", + "category": "People" + }, + { + "name": "Shell Oil", + "category": "Business" + }, + { + "name": "Haim Saban", + "category": "People" + }, + { + "name": "Sierra Pacific Industries", + "category": "Business" + }, + { + "name": "Steven Rattner", + "category": "People" + }, + { + "name": "Simon Property Group (Malls)", + "category": "Business" + }, + { + "name": "David Ellison", + "category": "People" + }, + { + "name": "Snapchat/Evan Spiegel", + "category": "Business" + }, + { + "name": "Alberto Rodr\u00edguez Baldi (Baldi Hot Springs Hotel)", + "category": "People" + }, + { + "name": "South Park Media", + "category": "Business" + }, + { + "name": "James Dyson", + "category": "People" + }, + { + "name": "SpaceX", + "category": "Business" + }, + { + "name": "Aiyawatt Srivaddhanaprabha", + "category": "People" + }, + { + "name": "Standard Industries", + "category": "Business" + }, + { + "name": "Jay Penske", + "category": "People" + } + ], + "details": { + "21st Century Fox America": { + "category": "Business", + "registrations": [ + "N2702" + ] + }, + "United States of America 747/757": { + "category": "Government", + "registrations": [ + "02-4452", + "09-2017", + "92-9000", + "98-0002", + "09-2016", + "00-9001", + "99-0003", + "99-0004", + "82-8000", + "09-2018", + "09-2015", + "98-0001" + ] + }, + "Elon Musk": { + "category": "People", + "registrations": [ + "N628TS" + ] + }, + "Dallas Mavericks": { + "category": "Sports", + "registrations": [ + "N801DM" + ] + }, + "Alex Rodriguez": { + "category": "Celebrity", + "registrations": [ + "N313AR" + ] + }, + "State of Alabama": { + "category": "State/Law", + "registrations": [ + "N1263S", + "N225LH", + "N160SA", + "N906V", + "N157SA", + "N1073S", + "N52437", + "N5329S", + "N407SA", + "N477GF" + ] + }, + "Rolls Royce Test Bed": { + "category": "Other", + "registrations": [ + "N787RR" + ] + }, + "Bombardier Global 7500": { + "category": "Test Aircraft", + "registrations": [ + "C-GLBO", + "C-GBLB", + "C-GLBG", + "C-GLBX" + ] + }, + "CitationMax": { + "category": "YouTubers", + "registrations": [ + "N2RF", + "N2MJ" + ] + }, + "Bernie Ecclestone": { + "category": "Formula 1", + "registrations": [ + "HB-FXF", + "M-REEE" + ] + }, + "AbbVie": { + "category": "Business", + "registrations": [ + "N550AV", + "N554AV", + "N551AV", + "N556AV" + ] + }, + "FBI (Federal Bureau of Investigation)": { + "category": "Government", + "registrations": [ + "N616RK" + ] + }, + "Bill Gates": { + "category": "People", + "registrations": [ + "N897GV", + "N887GV", + "N608GV" + ] + }, + "Arizona Cardinals Football": { + "category": "Sports", + "registrations": [ + "N867DA", + "N1AZ" + ] + }, + "Blake Shelton": { + "category": "Celebrity", + "registrations": [ + "N703BG" + ] + }, + "State of Alaska": { + "category": "State/Law", + "registrations": [ + "N7326S", + "N20786", + "N54741", + "N1867", + "N7761D", + "N88AK", + "N7051", + "N7056", + "N70714", + "N574ST", + "N1323Y", + "N8370Q", + "N82736", + "N90322", + "N90918", + "N7196H", + "N270WC", + "N303GV", + "N7695S", + "N70715", + "N106WT", + "N7055", + "N7041", + "N7054", + "N7063J", + "N909AK", + "N7183C", + "N6705H", + "N911NT", + "N7040", + "N3330D", + "N7052", + "N70713", + "N8717Q", + "N34FG", + "N911AA", + "N7085", + "N7058", + "N145PL", + "N607TC", + "N4387Z", + "N4730E", + "N8460C", + "N1155W", + "N125FG", + "N42033", + "N4151T", + "N7067", + "N840AK", + "N905AK", + "N2400S", + "N714NK", + "N246CC", + "N1386A", + "N6987B", + "N82735", + "N82732", + "N7023", + "N7059", + "N7046" + ] + }, + "Zero G Plane": { + "category": "Other", + "registrations": [ + "N794AJ" + ] + }, + "Gulfstream G700": { + "category": "Test Aircraft", + "registrations": [ + "N700GA", + "N703GA", + "N705GD", + "N706GD", + "N702GD", + "N703GD", + "N704GA" + ] + }, + "Premier1Driver": { + "category": "YouTubers", + "registrations": [ + "N390GM" + ] + }, + "Chalerm Yoovidhya": { + "category": "Formula 1", + "registrations": [ + "N155AN", + "HS-CDY", + "OE-LCY" + ] + }, + "Adobe": { + "category": "Business", + "registrations": [ + "N82123" + ] + }, + "DOJ (Dept. of Justice)": { + "category": "Government", + "registrations": [ + "N119NA", + "N874TW", + "N977GA", + "N708JH", + "N313CG", + "N721AL", + "N996GA" + ] + }, + "Melinda Gates": { + "category": "People", + "registrations": [ + "N459WM", + "N459BL" + ] + }, + "Patriots": { + "category": "Sports", + "registrations": [ + "N36NE", + "N225NE" + ] + }, + "Dan Bilzerian": { + "category": "Celebrity", + "registrations": [ + "N701DB" + ] + }, + "State of Arizona": { + "category": "State/Law", + "registrations": [ + "N58AZ", + "N3037Q", + "N761EZ", + "N61298", + "N1816R", + "N783AZ", + "N207KQ", + "N922AZ", + "N911AZ", + "N56AZ", + "N921AZ" + ] + }, + "Orbis Flying Eye Hospital": { + "category": "Other", + "registrations": [ + "N330AU" + ] + }, + "Honeywell 757 Test Bed": { + "category": "Test Aircraft", + "registrations": [ + "N757HW", + "N170EH" + ] + }, + "Baron Pilot": { + "category": "YouTubers", + "registrations": [ + "N3175W" + ] + }, + "Crown Prince Salman bin Hamad bin Isa Al Khalifa": { + "category": "Formula 1", + "registrations": [ + "A9C-HAK" + ] + }, + "Aflac": { + "category": "Business", + "registrations": [ + "N280AF", + "N285AF" + ] + }, + "USDHS (Dept. Homeland Sec.)": { + "category": "Government", + "registrations": [ + "N115H" + ] + }, + "Larry Ellison": { + "category": "People", + "registrations": [ + "N817GS", + "N417C" + ] + }, + "Colts": { + "category": "Sports", + "registrations": [ + "N107TD", + "N931FL", + "N101TD", + "N106TD" + ] + }, + "Dr. Phil & Son": { + "category": "Celebrity", + "registrations": [ + "N800JM", + "N4DP" + ] + }, + "State of Arkansas": { + "category": "State/Law", + "registrations": [ + "N390SP", + "N524SP", + "N77HD", + "N8125N", + "N523SP" + ] + }, + "Samaritan's Purse": { + "category": "Other", + "registrations": [ + "N782SP", + "N783SP" + ] + }, + "Boeing 777-9": { + "category": "Test Aircraft", + "registrations": [ + "N779XZ", + "N779XW", + "N779XY", + "N779XX" + ] + }, + "Stevie Triesenberg": { + "category": "YouTubers", + "registrations": [ + "N9477A", + "N5921C" + ] + }, + "Dietrich Mateschitz": { + "category": "Formula 1", + "registrations": [ + "OE-GDM", + "OE-IDM" + ] + }, + "Air Lease Corp.": { + "category": "Business", + "registrations": [ + "N8AL", + "N1AL" + ] + }, + "USCG (Coast Guard)": { + "category": "Government", + "registrations": [ + "2022-01-02 00:00:00" + ] + }, + "Mark Cuban": { + "category": "People", + "registrations": [ + "N921MT", + "N718MC" + ] + }, + "Dallas Cowboys": { + "category": "Sports", + "registrations": [ + "N1DC" + ] + }, + "Taylor Swift": { + "category": "Celebrity", + "registrations": [ + "N621MM" + ] + }, + "State of California": { + "category": "State/Law", + "registrations": [ + "N984HP", + "N25FG", + "N617HP", + "N22FG", + "N979HP", + "N981HP", + "N983HP", + "N156HP", + "N24FG", + "N463DF", + "N443HP", + "N137HP", + "N28FG", + "N988HP", + "N161SP", + "N459DF", + "N23FG", + "N30CA", + "N974HP", + "N975HP", + "N140HP", + "N441HP", + "N139HP", + "N36FG", + "N976HP", + "N982HP", + "N21FG", + "N985HP", + "N461DF", + "N485DF", + "N37FG", + "N202HP", + "N978HP", + "N511HP", + "N20CA", + "N26FG", + "N153HP" + ] + }, + "Airbus Beluga": { + "category": "Other", + "registrations": [ + "F-GSTD", + "F-GSTC", + "F-GSTF", + "F-GXLI", + "F-GXLH", + "F-WBXL" + ] + }, + "Textron/Beechcraft Denali": { + "category": "Test Aircraft", + "registrations": [ + "N221NT", + "N220BT", + "N222NT" + ] + }, + "Matt Guthmiller": { + "category": "YouTubers", + "registrations": [ + "N367HP" + ] + }, + "Fernando Alonso": { + "category": "Formula 1", + "registrations": [ + "EC-JNZ" + ] + }, + "Allen & Company": { + "category": "Business", + "registrations": [ + "N550AA", + "N550GW" + ] + }, + "U.S. Marshals (JPATS/Prisoner Transport)": { + "category": "Government", + "registrations": [ + "N738A", + "N639CS", + "N640CS", + "N311MS", + "N279AD", + "N1789M" + ] + }, + "Roman Abramovich": { + "category": "People", + "registrations": [ + "LX-GVI", + "LX-RAY", + "M-SOLA", + "P4-MES", + "LX-LUX", + "P4-BDL" + ] + }, + "JR Motorsports": { + "category": "Sports", + "registrations": [ + "N477GJ", + "N38AD", + "N388JR", + "N560MT" + ] + }, + "Drake": { + "category": "Celebrity", + "registrations": [ + "N767CJ", + "N757CJ" + ] + }, + "State of Colorado": { + "category": "State/Law", + "registrations": [ + "N203SP", + "N205SP", + "N328SF", + "N4211C", + "N959AF", + "N185CC", + "N202SP", + "N93827", + "N327SF" + ] + }, + "Boeing Dreamlifter": { + "category": "Other", + "registrations": [ + "N249BA", + "N718BA", + "N747BC", + "N780BA" + ] + }, + "Gulfstream G800": { + "category": "Test Aircraft", + "registrations": [ + "N800G", + "N802GD" + ] + }, + "steveo1kinevo": { + "category": "YouTubers", + "registrations": [ + "N949BZ" + ] + }, + "Flavio Briatore": { + "category": "Formula 1", + "registrations": [ + "G-FBFI" + ] + }, + "American Express": { + "category": "Business", + "registrations": [ + "N652GB", + "N650GB" + ] + }, + "Government of France": { + "category": "Government", + "registrations": [ + "F-RAFA", + "F-RAFB", + "F-RARF" + ] + }, + "Alisher Usmanov": { + "category": "People", + "registrations": [ + "M-DLBR", + "LX-GLX", + "M-IABU" + ] + }, + "Houston Rockets": { + "category": "Sports", + "registrations": [ + "N625HR" + ] + }, + "State of Connecticut": { + "category": "State/Law", + "registrations": [ + "N108SP", + "N1903A", + "N107SP", + "N105SP" + ] + }, + "International Air Response": { + "category": "Other", + "registrations": [ + "N121TG", + "N118TG", + "N120TG", + "N117TG" + ] + }, + "Falcon 6X": { + "category": "Test Aircraft", + "registrations": [ + "F-WZOA", + "F-WAVE", + "F-HSUP", + "F-WSIX" + ] + }, + "Angle of Attack": { + "category": "YouTubers", + "registrations": [ + "N2423U" + ] + }, + "Abbott Labratories": { + "category": "Business", + "registrations": [ + "N900AL", + "N100AL", + "N550AL", + "N650AL" + ] + }, + "Government of India": { + "category": "Government", + "registrations": [ + "K7067", + "K7066" + ] + }, + "Steve Wynn/Wynn Resorts": { + "category": "People", + "registrations": [ + "N1W" + ] + }, + "WWE": { + "category": "Sports", + "registrations": [ + "N247WE" + ] + }, + "Floyd Mayweather": { + "category": "Celebrity", + "registrations": [ + "N305DG" + ] + }, + "State of Delaware": { + "category": "State/Law", + "registrations": [ + "N51SP", + "N1SP", + "N2SP", + "N6SP" + ] + }, + "AN124": { + "category": "Other", + "registrations": [ + "UR-82027", + "RA-82039", + "UR-82073", + "RA-82043", + "UR-82029", + "RA-82035", + "RA-82077", + "RA-82038", + "RA-82030", + "RA-82014", + "UR-82009", + "UR-ZYD", + "RA-82032", + "RA-82040", + "UR-82008", + "RA-82010", + "UR-82072", + "RA-82028", + "RA-82044", + "RA-82041", + "RA-82037", + "RA-82013", + "UR-82007", + "RA-82046", + "RA-82047" + ] + }, + "Eviation Alice": { + "category": "Test Aircraft", + "registrations": [ + "N882EV" + ] + }, + "Trent Palmer": { + "category": "YouTubers", + "registrations": [ + "N318JJ" + ] + }, + "Gene Haas": { + "category": "Formula 1", + "registrations": [ + "N545GH" + ] + }, + "American Family Insurance": { + "category": "Business", + "registrations": [ + "N81GK" + ] + }, + "Government of Qatar": { + "category": "Government", + "registrations": [ + "A7-AAH", + "A7-HSJ", + "A7-HHH", + "A7-HJJ", + "A7-MBK", + "A7-HHK", + "A7-HHM", + "A7-HHF", + "A7-MED", + "A7-HHJ", + "A7-HBJ", + "A7-HHE", + "A7-AAG", + "A7-MHH" + ] + }, + "Tom Gores": { + "category": "People", + "registrations": [ + "N595TG" + ] + }, + "Philadelphia Eagles": { + "category": "Sports", + "registrations": [ + "N468KL", + "N612MJ" + ] + }, + "Garth Brooks": { + "category": "Celebrity", + "registrations": [ + "N810GT" + ] + }, + "State of Florida": { + "category": "State/Law", + "registrations": [ + "N600FC", + "N106FW", + "N419FW", + "N91HP", + "N107FC", + "N155FC", + "N267HP", + "N943FL", + "N773HP", + "N610HP", + "N706HP" + ] + }, + "Swiss Air Ambulance": { + "category": "Other", + "registrations": [ + "HB-JWC", + "HB-JWA", + "HB-JWB" + ] + }, + "Cessna C700": { + "category": "Test Aircraft", + "registrations": [ + "N701GL", + "N9722L", + "N703DL" + ] + }, + "Dave Sparks / HeavyD": { + "category": "YouTubers", + "registrations": [ + "N131AE", + "N801WT" + ] + }, + "John Malone": { + "category": "Formula 1", + "registrations": [ + "N780LM", + "N770LM" + ] + }, + "Amgen": { + "category": "Business", + "registrations": [ + "N558GA" + ] + }, + "Government of Abu Dhabi": { + "category": "Government", + "registrations": [ + "A6-PFE", + "A6-SIL", + "A6-AUH", + "A6-PFC", + "A6-ALN", + "A6-PFG" + ] + }, + "Paul Tudor Jones": { + "category": "People", + "registrations": [ + "N117TF" + ] + }, + "Tony Stewart": { + "category": "Sports", + "registrations": [ + "N329SH" + ] + }, + "George Strait": { + "category": "Celebrity", + "registrations": [ + "N518GS" + ] + }, + "State of Georgia": { + "category": "State/Law", + "registrations": [ + "N25NR", + "N280HG", + "N922SP", + "N924SP", + "N927SP", + "N926SP", + "N429LC", + "N26NR", + "N290MG", + "N930SP", + "N297MH", + "N921SP", + "N940SP", + "N258MG", + "N24NR", + "N252MG", + "N271MG", + "N925SP", + "N908SP", + "N256MG", + "N251MG", + "N266MG" + ] + }, + "LifeFlightNetwork": { + "category": "Other", + "registrations": [ + "N661LF", + "N662LF", + "N617BG", + "N890WA", + "N886LF", + "N214NX", + "N126TS" + ] + }, + "Boeing 737-10 MAX": { + "category": "Test Aircraft", + "registrations": [ + "N27752", + "N27751" + ] + }, + "Don Av8's": { + "category": "YouTubers", + "registrations": [ + "N379JM" + ] + }, + "Lance Stroll": { + "category": "Formula 1", + "registrations": [ + "OE-ILS" + ] + }, + "Andreessen Horowitz": { + "category": "Business", + "registrations": [ + "N689BG" + ] + }, + "Government of Saudi Arabia": { + "category": "Government", + "registrations": [ + "HZ-SKY3", + "HZ-HM65", + "HZ-MF7", + "HZ-MF6", + "HZ-MS4B", + "HZ-MF4", + "HZ-MF8", + "HZ-MF1" + ] + }, + "Grant Cardone": { + "category": "People", + "registrations": [ + "N247GC", + "N880GC" + ] + }, + "Chase Elliot": { + "category": "Sports", + "registrations": [ + "N9CE" + ] + }, + "Harrison Ford": { + "category": "Celebrity", + "registrations": [ + "N6GU" + ] + }, + "DLR - German Aerospace Center": { + "category": "Other", + "registrations": [ + "D-BDLR", + "D-CMET", + "D-ADLR" + ] + }, + "MQ-20 Avenger": { + "category": "Test Aircraft", + "registrations": [ + "N903PC" + ] + }, + "MojoGrip": { + "category": "YouTubers", + "registrations": [ + "N661MG" + ] + }, + "Lawrence Stroll": { + "category": "Formula 1", + "registrations": [ + "T7-LSS", + "N811LS", + "OE-LSS", + "OE-LLS", + "C-FWLS", + "HB-ZQK" + ] + }, + "Apollo Global Management": { + "category": "Business", + "registrations": [ + "N650XF" + ] + }, + "Government of Equatorial Guinea": { + "category": "Government", + "registrations": [ + "P4-SKN" + ] + }, + "Jared Isaacman": { + "category": "People", + "registrations": [ + "N135EM", + "N136EM", + "N82EM", + "N80EM", + "N137EM", + "N138EM", + "N29UB", + "N512XA" + ] + }, + "Brad Keselowski": { + "category": "Sports", + "registrations": [ + "N229BK", + "N629BK" + ] + }, + "J Balvin": { + "category": "Celebrity", + "registrations": [ + "N714JB" + ] + }, + "State of Idaho": { + "category": "State/Law", + "registrations": [ + "N239KQ", + "N121TD" + ] + }, + "Lyden Air Cargo": { + "category": "Other", + "registrations": [ + "P4-LAC", + "P4-LAS", + "N402LC", + "N410LC", + "N403LC", + "N401LC" + ] + }, + "Joby Aviation eVTOL": { + "category": "Test Aircraft", + "registrations": [ + "N542BJ" + ] + }, + "Stefan Drury": { + "category": "YouTubers", + "registrations": [ + "VH-EYZ" + ] + }, + "Max Verstappen": { + "category": "Formula 1", + "registrations": [ + "PH-UTL" + ] + }, + "AT&T": { + "category": "Business", + "registrations": [ + "N900SB", + "N775E" + ] + }, + "Government of Japan": { + "category": "Government", + "registrations": [ + "80-1112", + "80-1111" + ] + }, + "Marco Andretti": { + "category": "Sports", + "registrations": [ + "N800MA" + ] + }, + "Jackie Chan": { + "category": "Celebrity", + "registrations": [ + "N688JC" + ] + }, + "State of Illinois": { + "category": "State/Law", + "registrations": [ + "N4131Q", + "N551SP", + "N771SP", + "N881SP", + "N6484A", + "N971LL", + "N991LL", + "N661SP", + "N831LL", + "N981LL", + "N35945", + "N751LL" + ] + }, + "Pratt & Whitney Canada 747SP": { + "category": "Other", + "registrations": [ + "C-GTFF", + "C-FPAW" + ] + }, + "Bell V-280 Valor": { + "category": "Test Aircraft", + "registrations": [ + "N280BH" + ] + }, + "ENTP LIFE": { + "category": "YouTubers", + "registrations": [ + "N8623W" + ] + }, + "Michael Schumacher": { + "category": "Formula 1", + "registrations": [ + "M-IKEL" + ] + }, + "Bank of America": { + "category": "Business", + "registrations": [ + "N651BA", + "N228BA", + "N590BA", + "N286BA", + "N297BA", + "N285BA", + "N676BA" + ] + }, + "Government State of Kuwait": { + "category": "Government", + "registrations": [ + "9K-GAA", + "9K-AKD", + "9K-GBB", + "9K-GBA", + "9K-GCC", + "9K-GEA" + ] + }, + "Jack Ma": { + "category": "People", + "registrations": [ + "VP-CZM" + ] + }, + "Dale Earnhardt Family": { + "category": "Sports", + "registrations": [ + "N138DE", + "N3DE", + "N1DE", + "N500DE" + ] + }, + "Jerry Seinfeld": { + "category": "Celebrity", + "registrations": [ + "N845JS" + ] + }, + "State of Indiana": { + "category": "State/Law", + "registrations": [ + "N54SP", + "N193SP", + "N407SS", + "N507SP" + ] + }, + "Dassault Falcon Response Team": { + "category": "Other", + "registrations": [ + "N247FR", + "F-GOFX" + ] + }, + "Sikorsky SB-1 Defiant": { + "category": "Test Aircraft", + "registrations": [ + "N972SK", + "N971SK", + "N100FV" + ] + }, + "Plane and Dirt Simple": { + "category": "YouTubers", + "registrations": [ + "N26DT" + ] + }, + "Nelson Piquet": { + "category": "Formula 1", + "registrations": [ + "PR-JAQ" + ] + }, + "Bass Pro Shop": { + "category": "Business", + "registrations": [ + "N378TM", + "N372BP" + ] + }, + "Government of Russia": { + "category": "Government", + "registrations": [ + "RA-96024", + "RA-96019", + "RA-96021", + "RA-96018", + "RA-96023", + "RA-96014", + "RA-96012", + "RA-96016", + "RA-96017", + "RA-96020", + "RA-96022" + ] + }, + "Ken Griffin": { + "category": "People", + "registrations": [ + "N421AL", + "N302AK", + "N421SZ", + "N750KD" + ] + }, + "Joe Gibbs Racing": { + "category": "Sports", + "registrations": [ + "N518JG", + "N519JG", + "N520JG" + ] + }, + "Jim Carrey": { + "category": "Celebrity", + "registrations": [ + "N162JC" + ] + }, + "State of Iowa": { + "category": "State/Law", + "registrations": [ + "N23540", + "N231SP", + "N2231E", + "N227SP", + "N1921F", + "N171SP", + "N996CS" + ] + }, + "Phoenix Air Gulfstream II": { + "category": "Other", + "registrations": [ + "N165PA", + "N164PA" + ] + }, + "Alyssa Miller": { + "category": "YouTubers", + "registrations": [ + "N6355J" + ] + }, + "Piero Ferrari": { + "category": "Formula 1", + "registrations": [ + "PP-DLA", + "I-FACM" + ] + }, + "Berkshire Hathaway": { + "category": "Business", + "registrations": [ + "N235BH" + ] + }, + "Government of Turkey": { + "category": "Government", + "registrations": [ + "TC-DAP", + "TC-TUR", + "TC-ATA", + "TC-CBK", + "TC-GAP", + "TC-TRK" + ] + }, + "Kimbal Musk": { + "category": "People", + "registrations": [ + "N831FR" + ] + }, + "Denny Hamlin Racing": { + "category": "Sports", + "registrations": [ + "N400DH" + ] + }, + "Jimmy Buffet": { + "category": "Celebrity", + "registrations": [ + "N502JB" + ] + }, + "State of Kansas": { + "category": "State/Law", + "registrations": [ + "N600HP", + "N670HP", + "N980HP", + "N950HP", + "N650HP", + "N870HP", + "N900HP", + "N940HP" + ] + }, + "Calspan Flight Research": { + "category": "Other", + "registrations": [ + "N102VS", + "N304VS", + "N710CF" + ] + }, + "Leonardo AW609": { + "category": "Test Aircraft", + "registrations": [ + "N609PH", + "N609TR", + "N609PA" + ] + }, + "JR Garage (JR Aviation)": { + "category": "YouTubers", + "registrations": [ + "N62JR" + ] + }, + "Rubens Barrichello": { + "category": "Formula 1", + "registrations": [ + "HB-JEO", + "VP-CHP" + ] + }, + "Berrada Properties": { + "category": "Business", + "registrations": [ + "N737JB", + "N700YB" + ] + }, + "Government of the Netherlands": { + "category": "Government", + "registrations": [ + "PH-GOV", + "V117" + ] + }, + "Stephen Schwarzman": { + "category": "People", + "registrations": [ + "N113CS" + ] + }, + "Hendrick Motorsports": { + "category": "Sports", + "registrations": [ + "N509RH", + "N508RH", + "N1RH", + "N500RH" + ] + }, + "John Travolta": { + "category": "Celebrity", + "registrations": [ + "N492JT", + "N707JT", + "N500CE", + "N905FJ", + "N327JT" + ] + }, + "State of Kentucky": { + "category": "State/Law", + "registrations": [ + "N45SP", + "N148KY", + "N723KY", + "N220SP", + "N421WJ", + "N283SP", + "N36SP", + "N8237B", + "N24SP", + "N46SP", + "N282SP", + "N10SP" + ] + }, + "Surveillance Australia": { + "category": "Other", + "registrations": [ + "VH-XND VH-XNC VH-XNF" + ] + }, + "Scaled Composites Proteus": { + "category": "Test Aircraft", + "registrations": [ + "N281PR" + ] + }, + "Pickle Driver (SF50)": { + "category": "YouTubers", + "registrations": [ + "N32GK", + "N616DP" + ] + }, + "Scuderia AlphaTauri": { + "category": "Formula 1", + "registrations": [ + "OE-FAA" + ] + }, + "BIC Lighters and Pens": { + "category": "Business", + "registrations": [ + "N550BG" + ] + }, + "Government of Bangladesh": { + "category": "Government", + "registrations": [ + "S2-AJU" + ] + }, + "Steve Witkoff": { + "category": "People", + "registrations": [ + "N102WG" + ] + }, + "Stewart-Haas Racing": { + "category": "Sports", + "registrations": [ + "N60GH", + "N141SH" + ] + }, + "Julio Iglesias": { + "category": "Celebrity", + "registrations": [ + "N768JJ" + ] + }, + "State of Louisiana": { + "category": "State/Law", + "registrations": [ + "N918SP", + "N67183", + "N354SP", + "N101AF", + "N262AF", + "N382AF", + "N302AF", + "N64034", + "N91WF", + "N269SP", + "N65HA", + "N356SP", + "N508SP", + "N232AF", + "N357SP", + "N355SP", + "N261AF", + "N241AF", + "N522AF", + "N904HB", + "N812AF", + "N811AF", + "N252AF", + "N670SP", + "N430M", + "N5175E", + "N9750L", + "N281AF", + "N810SP" + ] + }, + "Mayo Clinic": { + "category": "Other", + "registrations": [ + "N350MC" + ] + }, + "Textron AirLand Scorpion": { + "category": "Test Aircraft", + "registrations": [ + "N531TA", + "N532TX", + "N534TX" + ] + }, + "Fly With Own (Non-owner Pilot)": { + "category": "YouTubers", + "registrations": [ + "N370RS" + ] + }, + "Sergio Perez": { + "category": "Formula 1", + "registrations": [ + "XA-ASP" + ] + }, + "BlackRock": { + "category": "Business", + "registrations": [ + "N10199", + "N1777M", + "N3788B" + ] + }, + "Government of South Africa": { + "category": "Government", + "registrations": [ + "ZS-RSA" + ] + }, + "George Lucas": { + "category": "People", + "registrations": [ + "N238MH", + "N138GL" + ] + }, + "Penske Racing": { + "category": "Sports", + "registrations": [ + "N500PR" + ] + }, + "Keith Urban": { + "category": "Celebrity", + "registrations": [ + "N510CX" + ] + }, + "State of Maine": { + "category": "State/Law", + "registrations": [ + "N985MF", + "N185SL", + "N880WS", + "N9494N", + "N407TN", + "N5339N", + "N61368" + ] + }, + "NAV Canada Flight Inspection": { + "category": "Other", + "registrations": [ + "C-GFIO", + "C-GNVC" + ] + }, + "BETA Tech eVTOL": { + "category": "Test Aircraft", + "registrations": [ + "N250UT" + ] + }, + "Ricky Gutierrez & JR Garage": { + "category": "YouTubers", + "registrations": [ + "N52TL" + ] + }, + "Blackstone": { + "category": "Business", + "registrations": [ + "N550TB" + ] + }, + "Royal Air Force": { + "category": "Government", + "registrations": [ + "G-XATW", + "ZZ336" + ] + }, + "James Simmons": { + "category": "People", + "registrations": [ + "N773MJ" + ] + }, + "Richard Childress Racing": { + "category": "Sports", + "registrations": [ + "N3RC" + ] + }, + "Kenny Chesney": { + "category": "Celebrity", + "registrations": [ + "N7KC" + ] + }, + "State of Maryland": { + "category": "State/Law", + "registrations": [ + "N381MD", + "N387MD", + "N389MD", + "N902MD", + "N9111G", + "N383MD", + "N390MD", + "N384MD", + "N385MD", + "N388MD", + "N386MD", + "N382MD", + "N125MD", + "N903MD" + ] + }, + "Life Lion (Hershey Medical Center)": { + "category": "Other", + "registrations": [ + "N611LL", + "N896LL", + "N921LL", + "N600LL", + "N916LL" + ] + }, + "Boeing 737-7 MAX": { + "category": "Test Aircraft", + "registrations": [ + "N7201S" + ] + }, + "christophe jouany": { + "category": "YouTubers", + "registrations": [ + "N14WS" + ] + }, + "BMW Automotive": { + "category": "Business", + "registrations": [ + "D-AUTO", + "D-ABMR", + "D-ABMW" + ] + }, + "National Nuclear Security Administration": { + "category": "Government", + "registrations": [ + "N878VF", + "N2316", + "N990ST", + "N305DQ", + "N980ST", + "N2317", + "N2319" + ] + }, + "Magic Johnson": { + "category": "People", + "registrations": [ + "N32MJ" + ] + }, + "Victory Aviation (NASCAR)": { + "category": "Sports", + "registrations": [ + "N25VA", + "N47VA", + "N67VA", + "N43VA", + "N87VA", + "N92VA", + "N15VA", + "N70VA", + "N46VA", + "N49VA" + ] + }, + "Kid Rock": { + "category": "Celebrity", + "registrations": [ + "N71KR" + ] + }, + "State of Massachusetts": { + "category": "State/Law", + "registrations": [ + "N824AH", + "N822PP", + "N823JM", + "N825MM", + "N6340F", + "N891TD" + ] + }, + "NASA": { + "category": "Other", + "registrations": [ + "N524NA", + "N528NA" + ] + }, + "Boeing 777 EcoDemonstrator": { + "category": "Test Aircraft", + "registrations": [ + "N861BC" + ] + }, + "Blue Star Airways": { + "category": "YouTubers", + "registrations": [ + "N317SR" + ] + }, + "BNSF Railway": { + "category": "Business", + "registrations": [ + "N459BN", + "N331BN" + ] + }, + "New Zealand Air Force": { + "category": "Government", + "registrations": [ + "NZ7571", + "NZ7572" + ] + }, + "Johnny Ive": { + "category": "People", + "registrations": [ + "N51VE" + ] + }, + "Aaron Rogers": { + "category": "Sports", + "registrations": [ + "N98AC" + ] + }, + "Kim Kardashian": { + "category": "Celebrity", + "registrations": [ + "N1980K" + ] + }, + "State of Michigan": { + "category": "State/Law", + "registrations": [ + "N9461Z", + "N383ST", + "N162ST", + "N733XN", + "N2463B", + "N827ST", + "N111SP", + "N312ST", + "N1655M", + "N5101U", + "N4617E", + "N6275S", + "N768ST" + ] + }, + "Boeing 787-8 Test Bed": { + "category": "Test Aircraft", + "registrations": [ + "N7874" + ] + }, + "SlowAsianDriver": { + "category": "YouTubers", + "registrations": [ + "N888FU" + ] + }, + "Calspan Defense Corp": { + "category": "Business", + "registrations": [ + "N710CF", + "N721CF" + ] + }, + "Government of Ukraine": { + "category": "Government", + "registrations": [ + "UR-ABA" + ] + }, + "Craig McCaw": { + "category": "People", + "registrations": [ + "N222MC", + "N688MC" + ] + }, + "Troy Aikman": { + "category": "Sports", + "registrations": [ + "N8TA", + "N270GP" + ] + }, + "Kylie Jenner": { + "category": "Celebrity", + "registrations": [ + "N810KJ" + ] + }, + "State of Minnesota": { + "category": "State/Law", + "registrations": [ + "N529NR", + "N119SP", + "N105NR", + "N16MN", + "N112SP", + "N55MN", + "N118SP", + "N114SP", + "N70MN", + "N805NR", + "N115SP", + "N905NR", + "N605NR", + "N205NR", + "N125NR", + "N155NR", + "N5897E", + "N705NR", + "N145NR", + "N528NR", + "N14MN" + ] + }, + "National Science Foundation": { + "category": "Other", + "registrations": [ + "N677F", + "N130AR" + ] + }, + "Stratos 716": { + "category": "Test Aircraft", + "registrations": [ + "N716X" + ] + }, + "Grant Baker": { + "category": "YouTubers", + "registrations": [ + "N921NG" + ] + }, + "CarMax": { + "category": "Business", + "registrations": [ + "N75KX" + ] + }, + "Israel Air Force": { + "category": "Government", + "registrations": [ + "676.0" + ] + }, + "John McCaw": { + "category": "People", + "registrations": [ + "N1NE" + ] + }, + "Russell Wilson": { + "category": "Sports", + "registrations": [ + "N330RW" + ] + }, + "Luke Bryan": { + "category": "Celebrity", + "registrations": [ + "N69FH" + ] + }, + "State of Mississippi": { + "category": "State/Law", + "registrations": [ + "N350MS", + "N28SM", + "N956SM", + "N351MS", + "N30SM" + ] + }, + "Innovation First Research and Development Inc": { + "category": "Other", + "registrations": [ + "N213EM" + ] + }, + "Boeing 757 (F-22 Testbed)": { + "category": "Test Aircraft", + "registrations": [ + "N757A" + ] + }, + "Ginger the Plane": { + "category": "YouTubers", + "registrations": [ + "N12768" + ] + }, + "Carrier Corp": { + "category": "Business", + "registrations": [ + "N1902C" + ] + }, + "Government of Iran": { + "category": "Government", + "registrations": [ + "EP-IGC" + ] + }, + "Phil Knight (NIKE)": { + "category": "People", + "registrations": [ + "N19HT" + ] + }, + "Las Vegas Golden Knights": { + "category": "Sports", + "registrations": [ + "N622GK" + ] + }, + "Mark Wahlberg": { + "category": "Celebrity", + "registrations": [ + "N989DM", + "N143MW" + ] + }, + "State of Missouri": { + "category": "State/Law", + "registrations": [ + "N83MP", + "N128VT", + "N338MC", + "N81MP", + "N92MP", + "N94MP", + "N402MC", + "N96MP", + "N93MP", + "N95MP", + "N90MP", + "N84MC", + "N91MP" + ] + }, + "T2 Aviation (Oil Spill Response": { + "category": "Other", + "registrations": [ + "G-OSRA", + "G-OSRB" + ] + }, + "Micke Lang": { + "category": "YouTubers", + "registrations": [ + "OEUDA" + ] + }, + "Carvana/DriveTime": { + "category": "Business", + "registrations": [ + "N50VC", + "N650C" + ] + }, + "Government of Canada": { + "category": "Government", + "registrations": [ + "144619", + "144617", + "15002", + "144600", + "15005", + "15003", + "15004", + "15001" + ] + }, + "Rick Caruso": { + "category": "People", + "registrations": [ + "N1759C" + ] + }, + "Sergio Garcia": { + "category": "Sports", + "registrations": [ + "N901SG" + ] + }, + "Michael Jordan": { + "category": "Celebrity", + "registrations": [ + "N236MJ" + ] + }, + "State of Montana": { + "category": "State/Law", + "registrations": [ + "N61CV", + "N1664R", + "N6110A", + "N384M", + "N4644Y", + "N6690", + "N8862Y", + "N447MA", + "N368M", + "N151HP", + "N42178", + "N6962C", + "N28KP", + "N1604Z", + "N4622E" + ] + }, + "FAAM Airborne Laboratory": { + "category": "Other", + "registrations": [ + "G-LUXE" + ] + }, + "Gulfstream G400": { + "category": "Test Aircraft", + "registrations": [ + "N400G" + ] + }, + "Meet Kevin": { + "category": "YouTubers", + "registrations": [ + "N88W", + "N964PP" + ] + }, + "Caterpillar Inc.": { + "category": "Business", + "registrations": [ + "N385CT", + "N797CT" + ] + }, + "Royal Australian Air Force": { + "category": "Government", + "registrations": [ + "A56-002", + "A62-002", + "A36-002", + "A56-001", + "A36-001", + "A56-003 A62-001" + ] + }, + "Eric Schmidt": { + "category": "People", + "registrations": [ + "N785QS", + "N652WE", + "N651WE" + ] + }, + "Tennessee Titans": { + "category": "Sports", + "registrations": [ + "N200BA" + ] + }, + "Oprah Winfrey": { + "category": "Celebrity", + "registrations": [ + "N540W" + ] + }, + "State of Nebraska": { + "category": "State/Law", + "registrations": [ + "N575NE", + "N84NE", + "N373NE", + "N2383L" + ] + }, + "Airbus Racer": { + "category": "Test Aircraft", + "registrations": [ + "F-WRAC" + ] + }, + "MATCH1N": { + "category": "YouTubers", + "registrations": [ + "N30AQ" + ] + }, + "CBS Media": { + "category": "Business", + "registrations": [ + "N75VB", + "N8VB" + ] + }, + "Government/Police of Mexico": { + "category": "Government", + "registrations": [ + "XC-NPF", + "XC-MPF" + ] + }, + "DeVos Family": { + "category": "People", + "registrations": [ + "N252DV", + "N255DV", + "N251DV", + "N254DV", + "N256DV", + "N257DV", + "N258DV" + ] + }, + "Drew Brees": { + "category": "Sports", + "registrations": [ + "N15QB" + ] + }, + "Ozuna": { + "category": "Celebrity", + "registrations": [ + "N600CK" + ] + }, + "State of Nevada": { + "category": "State/Law", + "registrations": [ + "N212DF", + "N711NV", + "N777NV", + "N407FG", + "N407JS", + "N777NX" + ] + }, + "Excalibur Testbed": { + "category": "Test Aircraft", + "registrations": [ + "G-FTAI" + ] + }, + "Mike Patey": { + "category": "YouTubers", + "registrations": [ + "N22LP" + ] + }, + "Chevron": { + "category": "Business", + "registrations": [ + "N1876P", + "N1895T", + "N1901G" + ] + }, + "Government of North Korea": { + "category": "Government", + "registrations": [ + "P-671", + "P-632" + ] + }, + "Yusaku Mazawa": { + "category": "People", + "registrations": [ + "N555MZ" + ] + }, + "LA Chargers": { + "category": "Sports", + "registrations": [ + "N70AG" + ] + }, + "Pitbull": { + "category": "Celebrity", + "registrations": [ + "N305PB", + "N365WW" + ] + }, + "State of New Hampshire": { + "category": "State/Law", + "registrations": [ + "N366SP", + "N366NH" + ] + }, + "Hermeus Quarterhorse": { + "category": "Test Aircraft", + "registrations": [ + "N60304" + ] + }, + "Wifi-Money": { + "category": "YouTubers", + "registrations": [ + "N814ST" + ] + }, + "Chick-Fil-A": { + "category": "Business", + "registrations": [ + "N967TC" + ] + }, + "Government of Malaysia": { + "category": "Government", + "registrations": [ + "M48-02", + "9M-NAA", + "9M-NAB" + ] + }, + "Richard Branson": { + "category": "People", + "registrations": [ + "M-GGAL" + ] + }, + "Riley Herbst": { + "category": "Sports", + "registrations": [ + "N669T" + ] + }, + "Playboy": { + "category": "Celebrity", + "registrations": [ + "N950PB" + ] + }, + "State of New Jersey": { + "category": "State/Law", + "registrations": [ + "N110NJ", + "N6NJ", + "N3NJ", + "N2NJ", + "N4NJ", + "N9NJ", + "N5NJ", + "N7NJ", + "N1NJ" + ] + }, + "Blue Max Six": { + "category": "YouTubers", + "registrations": [ + "N682TM" + ] + }, + "Chipotle": { + "category": "Business", + "registrations": [ + "N793CG", + "N793MG" + ] + }, + "Government of Egypt": { + "category": "Government", + "registrations": [ + "SU-BTT", + "SU-EGY" + ] + }, + "Tony Robbins": { + "category": "People", + "registrations": [ + "N950TR" + ] + }, + "Robert Penske": { + "category": "Sports", + "registrations": [ + "N1RP", + "N500RP" + ] + }, + "Jay-Z": { + "category": "Celebrity", + "registrations": [ + "N44440" + ] + }, + "State of New Mexico": { + "category": "State/Law", + "registrations": [ + "N91GF", + "N605SP", + "N575NM", + "N607SP" + ] + }, + "Gear Down": { + "category": "YouTubers", + "registrations": [ + "N28AR", + "N888PN" + ] + }, + "Choice Hotels": { + "category": "Business", + "registrations": [ + "N472K" + ] + }, + "Government of Zambia": { + "category": "Government", + "registrations": [ + "AF002", + "AF222", + "N425HP", + "AF001", + "AF608" + ] + }, + "Tiger Woods": { + "category": "People", + "registrations": [ + "N517TW" + ] + }, + "Jim Crane/Houston Astros": { + "category": "Sports", + "registrations": [ + "N512GD" + ] + }, + "Rick Ross": { + "category": "Celebrity", + "registrations": [ + "N33055" + ] + }, + "State of New York": { + "category": "State/Law", + "registrations": [ + "N13SP", + "N749SP", + "N605", + "N651SP", + "N129SP", + "N9SP", + "N17SP", + "N200NY", + "N430SP", + "N430NY", + "N20SP", + "N432NY", + "N16SP", + "N761NY", + "N201NY", + "N11SP", + "N224SP", + "N18SP", + "N12SP", + "N61SP", + "N19SP", + "N174SP" + ] + }, + "Becki and Chris": { + "category": "YouTubers", + "registrations": [ + "N300WZ" + ] + }, + "Cisco Systems": { + "category": "Business", + "registrations": [ + "N60TE", + "N80TE" + ] + }, + "Government of the United Kingdom": { + "category": "Government", + "registrations": [ + "GZ100", + "ZZ336", + "G-GBNI", + "G-ZAHS", + "G-XXEB", + "G-XXED", + "G-ZABH" + ] + }, + "Sebastian Kulczyk": { + "category": "People", + "registrations": [ + "D-ADSK" + ] + }, + "John Henry/Boston Red Sox": { + "category": "Sports", + "registrations": [ + "N510GD" + ] + }, + "Rihanna": { + "category": "Celebrity", + "registrations": [ + "N220F" + ] + }, + "State of North Carolina": { + "category": "State/Law", + "registrations": [ + "N406NC", + "N9542W", + "N803NC", + "N800NC", + "N350NC", + "N407NC", + "N404NC", + "N22593", + "N401NC", + "N421NC", + "N735EK", + "N735AX", + "N6492G", + "N735ED", + "N370NC", + "N103NC", + "N735DN", + "N193P", + "N405NC", + "N801NC", + "N3NC", + "N3521K", + "N42058", + "N1712S", + "N920NC" + ] + }, + "Blaze Grubbs": { + "category": "YouTubers", + "registrations": [ + "N317SP", + "N12VJ" + ] + }, + "Citigroup": { + "category": "Business", + "registrations": [ + "N6012C", + "N8012C", + "N805WM", + "N2019C" + ] + }, + "Government of Spain": { + "category": "Government", + "registrations": [ + "T.18-4", + "T.222" + ] + }, + "Kilmer Management LP": { + "category": "Sports", + "registrations": [ + "C-GLJT" + ] + }, + "State of North Dakota": { + "category": "State/Law", + "registrations": [ + "N228ND", + "N200ND", + "N799GF", + "N202ND", + "N299SP", + "N6284S" + ] + }, + "Accidental Aviator": { + "category": "YouTubers", + "registrations": [ + "N282WB" + ] + }, + "Clayton Homes": { + "category": "Business", + "registrations": [ + "N1KA" + ] + }, + "Government of Croatia": { + "category": "Government", + "registrations": [ + "9A-CRO" + ] + }, + "Olympia Aviation (Detroit Red Wings/Tigers)": { + "category": "Sports", + "registrations": [ + "N559LC", + "N682RW" + ] + }, + "Sammy Hagar": { + "category": "Celebrity", + "registrations": [ + "N1013" + ] + }, + "State of Ohio": { + "category": "State/Law", + "registrations": [ + "N387LJ", + "N850H", + "N514HP", + "N71HP", + "N6HP", + "N490NR", + "N65HP", + "N716HP", + "N18HP", + "N717HP", + "N910HP", + "N113HP", + "N856H", + "N73HP", + "N12HP", + "N810H", + "N860H", + "N715HP", + "N311HP", + "N550NR", + "N480NR", + "N19HP", + "N72HP", + "N17HP" + ] + }, + "Coca-Cola": { + "category": "Business", + "registrations": [ + "N10274", + "N959RW", + "N982RW", + "N886RW", + "N902FH", + "N901FH" + ] + }, + "Government of Bulgaria": { + "category": "Government", + "registrations": [ + "LZ-AOB" + ] + }, + "David Rubenstein": { + "category": "People", + "registrations": [ + "N524EA" + ] + }, + "John Mara/NY Giants": { + "category": "Sports", + "registrations": [ + "N5117", + "N17NY" + ] + }, + "Sebastian Maniscalco": { + "category": "Celebrity", + "registrations": [ + "N877H" + ] + }, + "State of Oklahoma": { + "category": "State/Law", + "registrations": [ + "N880DT", + "N60HP", + "N200HP", + "N90HP", + "N370HP" + ] + }, + "Congra Brands": { + "category": "Business", + "registrations": [ + "N863CA", + "N820CA", + "N824CA" + ] + }, + "Government of Czech Republic": { + "category": "Government", + "registrations": [ + "2801", + "3085" + ] + }, + "Vasil Bojkov": { + "category": "People", + "registrations": [ + "LZ-VBE" + ] + }, + "Saints/Pelicans": { + "category": "Sports", + "registrations": [ + "N411ST" + ] + }, + "Shaq": { + "category": "Celebrity", + "registrations": [ + "N3250N" + ] + }, + "State of Oregon": { + "category": "State/Law", + "registrations": [ + "N9000V", + "N2237S", + "N17386", + "N2181N" + ] + }, + "Conoco": { + "category": "Business", + "registrations": [ + "N795CP", + "N405CP", + "N796CP", + "N794CP", + "N790CP", + "N793CP", + "N792CP", + "N621AR" + ] + }, + "Government of Poland": { + "category": "Government", + "registrations": [ + "0112", + "SP-LIG" + ] + }, + "Mark Zuckerberg": { + "category": "People", + "registrations": [ + "N3880", + "N68885" + ] + }, + "Ron Fowler/San Diego Padres": { + "category": "Sports", + "registrations": [ + "N78SD" + ] + }, + "Steven Spielberg": { + "category": "Celebrity", + "registrations": [ + "N700KS", + "N800KS" + ] + }, + "State of Pennsylvania": { + "category": "State/Law", + "registrations": [ + "N872ST", + "N878ST", + "N871ST", + "N874ST", + "N81PA", + "N875ST", + "N873ST", + "N879ST", + "N876St" + ] + }, + "ConocoPhillips": { + "category": "Business", + "registrations": [ + "N665P", + "N668P", + "N660P" + ] + }, + "Government of Slovenia": { + "category": "Government", + "registrations": [ + "L1-01" + ] + }, + "Mike Bloomberg": { + "category": "People", + "registrations": [ + "N8AG", + "N10MV", + "N6MV", + "N47EG", + "N5MV" + ] + }, + "John Middleton/Phillies": { + "category": "Sports", + "registrations": [ + "N604JJ" + ] + }, + "Toby Kieth": { + "category": "Celebrity", + "registrations": [ + "N405TK" + ] + }, + "Costar Realty": { + "category": "Business", + "registrations": [ + "N50KC" + ] + }, + "Government of Cote d'Ivoire": { + "category": "Government", + "registrations": [ + "TU-VAS", + "TU-VAJ", + "TU-VAE" + ] + }, + "Jim Ovia": { + "category": "People", + "registrations": [ + "N331AB" + ] + }, + "Cristiano Ronaldo": { + "category": "Sports", + "registrations": [ + "LX-GOL" + ] + }, + "Tom Cruise": { + "category": "Celebrity", + "registrations": [ + "N77VA" + ] + }, + "State of South Carolina": { + "category": "State/Law", + "registrations": [ + "N504SL", + "N502SL", + "N2SC", + "N1SC", + "N8WL", + "N19WL", + "N500SC" + ] + }, + "Business": { + "category": "Business", + "registrations": [ + "Section 5", + "Section 3", + "Section 2", + "Section 4" + ] + }, + "Government": { + "category": "Government", + "registrations": [ + "Section 3", + "Section 2", + "Section 4" + ] + }, + "People": { + "category": "People", + "registrations": [ + "Section 5", + "Section 3", + "Section 2", + "Section 4" + ] + }, + "Sports": { + "category": "Sports", + "registrations": [ + "Section 2" + ] + }, + "Celebrity": { + "category": "Celebrity", + "registrations": [ + "Section 2" + ] + }, + "State Govt./Law": { + "category": "State/Law", + "registrations": [ + "Section 2" + ] + }, + "Other": { + "category": "Other", + "registrations": [ + "Section 2" + ] + }, + "Test Aircraft": { + "category": "Test Aircraft", + "registrations": [ + "Section 2" + ] + }, + "YouTubers": { + "category": "YouTubers", + "registrations": [ + "Section 2" + ] + }, + "Formula 1 VIP's": { + "category": "Formula 1", + "registrations": [ + "Section 2" + ] + }, + "Silver Lake Technology Management": { + "category": "Business", + "registrations": [ + "N131DS" + ] + }, + "Government of Nigeria": { + "category": "Government", + "registrations": [ + "5N-FGZ", + "5N-FGS", + "5N-FGA", + "5N-FGW", + "5N-FG1", + "5N-FGU", + "5N-FGV", + "NAF-961", + "5N-FG2" + ] + }, + "David Geffen": { + "category": "People", + "registrations": [ + "N221DG" + ] + }, + "Jody Allen/Seahawks & Trail Blazers (Paul Allen Estate)": { + "category": "Sports", + "registrations": [ + "N650AF" + ] + }, + "Tyler Perry": { + "category": "Celebrity", + "registrations": [ + "N387TP", + "N378AP", + "N387AP", + "N378TP" + ] + }, + "State of South Dakota": { + "category": "State/Law", + "registrations": [ + "N975KA", + "N63628", + "N773SD", + "N2118A" + ] + }, + "Costco Wholesale": { + "category": "Business", + "registrations": [ + "N91CW", + "N82CW", + "N84CW N86CW", + "N83CW", + "N93CW" + ] + }, + "Government of Pakistan": { + "category": "Government", + "registrations": [ + "J-756", + "J-755" + ] + }, + "Laurene Powell Jobs": { + "category": "People", + "registrations": [ + "N2N" + ] + }, + "Rory McIlroy": { + "category": "Sports", + "registrations": [ + "N1989R" + ] + }, + "Dierks Bentley": { + "category": "Celebrity", + "registrations": [ + "N446CJ" + ] + }, + "State of Tennessee": { + "category": "State/Law", + "registrations": [ + "N10EC", + "N110EC", + "N760HP", + "N780HP", + "N510EC", + "N210EC", + "N750HP", + "N910EC" + ] + }, + "COX TV/Communications": { + "category": "Business", + "registrations": [ + "N1640", + "N1040C", + "N1040" + ] + }, + "Government of Gabon": { + "category": "Government", + "registrations": [ + "TR-KGM" + ] + }, + "Ralph Lauren": { + "category": "People", + "registrations": [ + "N711RL" + ] + }, + "John Elway": { + "category": "Sports", + "registrations": [ + "N750JE" + ] + }, + "Paris Hilton": { + "category": "Celebrity", + "registrations": [ + "N11PH" + ] + }, + "State of Texas": { + "category": "State/Law", + "registrations": [ + "N329TX", + "N824TX", + "N204TX", + "N702TX", + "N504TX", + "N219TX", + "N1727L", + "N243TX", + "N454TB", + "N124TX", + "N1TX", + "N956TX", + "N60TX", + "N191TX", + "N502TX", + "N200RR", + "N40TX", + "N90TX", + "N146TX", + "N244TX", + "N503TX", + "N405TX", + "N430TX", + "N215TX", + "N148TX", + "N147TX", + "N5271B", + "N844TX", + "N819TX" + ] + }, + "Cracker Barrel": { + "category": "Business", + "registrations": [ + "N68CB" + ] + }, + "Government of Brazil": { + "category": "Government", + "registrations": [ + "2585", + "2101" + ] + }, + "Adam Weitsman": { + "category": "People", + "registrations": [ + "N173JM" + ] + }, + "Adam Scott": { + "category": "Sports", + "registrations": [ + "N716AS" + ] + }, + "DJ Khaled": { + "category": "Celebrity", + "registrations": [ + "N2320" + ] + }, + "State of Utah": { + "category": "State/Law", + "registrations": [ + "N352HP", + "N354HP", + "N253HP", + "N773TP", + "N353HP" + ] + }, + "Cummins Inc": { + "category": "Business", + "registrations": [ + "N283CE", + "N282CE", + "N281CE", + "N804CE" + ] + }, + "Government of Panama": { + "category": "Government", + "registrations": [ + "HP-1A" + ] + }, + "Nancy Walton": { + "category": "People", + "registrations": [ + "N515PL" + ] + }, + "David Tepper": { + "category": "Sports", + "registrations": [ + "N793AP" + ] + }, + "CVS": { + "category": "Business", + "registrations": [ + "N327RX", + "N214TF", + "N812RX" + ] + }, + "Government of Italy": { + "category": "Government", + "registrations": [ + "MM62243" + ] + }, + "Tim Gillean": { + "category": "People", + "registrations": [ + "N915FG" + ] + }, + "Robert Kraft": { + "category": "Sports", + "registrations": [ + "N616KG", + "N618KG", + "N605KG" + ] + }, + "State of Virginia": { + "category": "State/Law", + "registrations": [ + "N26VA", + "N1VA", + "N34VA", + "N5VA", + "N30VA", + "N71VA", + "N27VA", + "N32VA", + "N35VA", + "N764VA", + "N39VA", + "N2VA", + "N28VA", + "N36VA" + ] + }, + "Dell": { + "category": "Business", + "registrations": [ + "N6D" + ] + }, + "Government of Switzerland": { + "category": "Government", + "registrations": [ + "T-786", + "T-785", + "T-787", + "T-752", + "T-784" + ] + }, + "Ha Du Long": { + "category": "People", + "registrations": [ + "P4-MLO" + ] + }, + "Jason Kelce": { + "category": "Sports", + "registrations": [ + "N620JK", + "N906MC" + ] + }, + "State of Washington": { + "category": "State/Law", + "registrations": [ + "N2446X", + "N565E", + "N305DK", + "N216KQ", + "N357PN", + "N207HB", + "N305RC", + "N102LP", + "N3532K" + ] + }, + "Dick's Sporting Goods": { + "category": "Business", + "registrations": [ + "N717DX", + "N607DX", + "N235DX" + ] + }, + "Government of Hungary": { + "category": "Government", + "registrations": [ + "606", + "607", + "605", + "604" + ] + }, + "Nick Woodman": { + "category": "People", + "registrations": [ + "N74VW" + ] + }, + "Craig Leipold/Minnesota Wild": { + "category": "Sports", + "registrations": [ + "N919CH", + "N360PZ" + ] + }, + "State of West Virginia": { + "category": "State/Law", + "registrations": [ + "N6WV", + "N3WV", + "N1WV", + "N5WV", + "N890SP" + ] + }, + "DigitalBridge": { + "category": "Business", + "registrations": [ + "N858MY" + ] + }, + "Government of Ireland": { + "category": "Government", + "registrations": [ + "258.0" + ] + }, + "Sawiris Family": { + "category": "People", + "registrations": [ + "M-YNNS", + "T7-MASHI", + "M-NSTR" + ] + }, + "Detroit Red Wings": { + "category": "Sports", + "registrations": [ + "N313TR" + ] + }, + "State of Wisconsin": { + "category": "State/Law", + "registrations": [ + "N204W", + "N832MA", + "N735UY", + "N100DB", + "N831MA", + "N395W", + "N6991H", + "N1050V", + "N833MA", + "N17UP", + "N389W", + "N2397S", + "N387W", + "N182NR", + "N337SS" + ] + }, + "Dillards Dept. Stores": { + "category": "Business", + "registrations": [ + "N914BD" + ] + }, + "Government of Chile": { + "category": "Government", + "registrations": [ + "921", + "913", + "922", + "914", + "912", + "911", + "985" + ] + }, + "Ted Turner": { + "category": "People", + "registrations": [ + "N17TE" + ] + }, + "Patrick Mahomes (Part Owner)": { + "category": "Sports", + "registrations": [ + "N84PH" + ] + }, + "State of Wyoming": { + "category": "State/Law", + "registrations": [ + "N104WY", + "N101WY", + "N102WY" + ] + }, + "Dippin Dots": { + "category": "Business", + "registrations": [ + "N590MC" + ] + }, + "Johor Royal Family": { + "category": "Government", + "registrations": [ + "9M-TMJ", + "9M-ZZZ", + "9M-III", + "9M-SJI", + "9M-JS1", + "9M-JJJ" + ] + }, + "Tilman Fertitta": { + "category": "People", + "registrations": [ + "M-BDWK", + "N625GN", + "N100GN", + "N252TF", + "N650FJ" + ] + }, + "Lionel Messi": { + "category": "Sports", + "registrations": [ + "LV-IRQ" + ] + }, + "Discovery Land Company Real Estate": { + "category": "Business", + "registrations": [ + "N290DL", + "N260DL" + ] + }, + "Government of Ecuador": { + "category": "Government", + "registrations": [ + "FAE052", + "FAE-051" + ] + }, + "Shahid Khan": { + "category": "People", + "registrations": [ + "N435FG", + "N335FG", + "N919FG" + ] + }, + "Disney": { + "category": "Business", + "registrations": [ + "N900ES", + "N200ES", + "N500ES", + "N100ES" + ] + }, + "Government of Thailand": { + "category": "Government", + "registrations": [ + "HS-TYV", + "HS-TYT" + ] + }, + "Santo Domingo Family": { + "category": "People", + "registrations": [ + "8P-BSD", + "8P-ASD" + ] + }, + "DMB Associates Real Estate": { + "category": "Business", + "registrations": [ + "N499JB" + ] + }, + "Andrew Forrest": { + "category": "People", + "registrations": [ + "VH-CPH", + "VH-FMG" + ] + }, + "Dollar General": { + "category": "Business", + "registrations": [ + "N855DG" + ] + }, + "Kingdom of Eswatini": { + "category": "Government", + "registrations": [ + "3DC-SDF" + ] + }, + "Steve Ballmer": { + "category": "People", + "registrations": [ + "N709DS" + ] + }, + "Dollar Tree": { + "category": "Business", + "registrations": [ + "N441DT" + ] + }, + "Government of Belarus": { + "category": "Government", + "registrations": [ + "EW-001PB", + "EW-301PJ", + "EW-001PA" + ] + }, + "Arthur Blank": { + "category": "People", + "registrations": [ + "N62LV", + "N611BF" + ] + }, + "Domino's": { + "category": "Business", + "registrations": [ + "N147CJ" + ] + }, + "Government of Germany": { + "category": "Government", + "registrations": [ + "14+02 3F4E27", + "15+02 3F551D", + "14+07 3EBE12", + "15+10 3F5407", + "14+04 3F7B3C", + "14+06 3EBD41", + "15+04 3F97FD", + "14+03 3F6533", + "16+01 3EB1A6", + "10+03 3E854F", + "14+05 3E95CA", + "16+02 3E89E7", + "15+01 3F7DC1" + ] + }, + "John W. Henry": { + "category": "People", + "registrations": [ + "N627JW" + ] + }, + "Draft Kings": { + "category": "Business", + "registrations": [ + "N34681" + ] + }, + "Government of Algeria": { + "category": "Government", + "registrations": [ + "7T-VPS", + "7T-VPM", + "7T-VPC", + "7T-VPG", + "7T-VPP" + ] + }, + "Jim Crane": { + "category": "People", + "registrations": [ + "N312JC" + ] + }, + "DS Advisors (Equitec)": { + "category": "Business", + "registrations": [ + "N652BA", + "N848JA" + ] + }, + "Government of Angola": { + "category": "Government", + "registrations": [ + "T7-ANG", + "D2-ANG", + "D2-ANT", + "D2-ANH" + ] + }, + "Jimmy Johnson": { + "category": "People", + "registrations": [ + "N480JJ" + ] + }, + "Duke Energy": { + "category": "Business", + "registrations": [ + "N139DE", + "N575MW", + "N407LT" + ] + }, + "Government of Argentina": { + "category": "Government", + "registrations": [ + "ARG-02", + "ARG-01" + ] + }, + "Stan Kronke": { + "category": "People", + "registrations": [ + "N843GG", + "N729KF", + "N218KF" + ] + }, + "Dutch Bros Coffee": { + "category": "Business", + "registrations": [ + "N992DB" + ] + }, + "Government of Armenia": { + "category": "Government", + "registrations": [ + "701.0" + ] + }, + "Sergey Brin": { + "category": "People", + "registrations": [ + "N998PB" + ] + }, + "Eli Lilly and Company": { + "category": "Business", + "registrations": [ + "N308EL", + "N307EL" + ] + }, + "Government of Azerbaijan": { + "category": "Government", + "registrations": [ + "4K-AZ888", + "4K-8888", + "4K-AI08", + "4K-AI88", + "4K-AI001", + "4K-AI07", + "4K-AI06", + "4k-AI01" + ] + }, + "Ted Leonsis": { + "category": "People", + "registrations": [ + "N814LL" + ] + }, + "Enterprise Car Rental": { + "category": "Business", + "registrations": [ + "N56EL", + "N57EL" + ] + }, + "Bahrain Royal Flight": { + "category": "Government", + "registrations": [ + "A9C-HAK", + "A9C-HMK", + "A9C-BHR", + "A9C-SLM", + "A9C-BDF", + "A9C-KOB", + "A9C-BAH", + "A9C-BRN", + "A9C-HMH", + "A9C-ISA" + ] + }, + "Phil Ruffin": { + "category": "People", + "registrations": [ + "N443PR", + "N44PR", + "N43PR" + ] + }, + "ExxonMobile": { + "category": "Business", + "registrations": [ + "N300A", + "N100A", + "N200A", + "N283EM", + "N285EM" + ] + }, + "Government of Belgium": { + "category": "Government", + "registrations": [ + "CD-01", + "OO-LUM", + "OO-FAE" + ] + }, + "Paul L. Foster": { + "category": "People", + "registrations": [ + "N5PF" + ] + }, + "FedEx": { + "category": "Business", + "registrations": [ + "N26FE", + "N35FE", + "N43FE", + "N1FE", + "N37FE", + "N21FE", + "N28FE", + "N39FE", + "N2FE", + "N6FE", + "N24FE" + ] + }, + "Government of Bolivia": { + "category": "Government", + "registrations": [ + "FAB-002", + "FAB-001" + ] + }, + "Wesley Edens": { + "category": "People", + "registrations": [ + "N888ZF" + ] + }, + "First Horizon Bank": { + "category": "Business", + "registrations": [ + "N47SC" + ] + }, + "Government of Tanzania": { + "category": "Government", + "registrations": [ + "5H-ONE" + ] + }, + "Jeff Bezos": { + "category": "People", + "registrations": [ + "N756LB", + "N11AF", + "N7WW", + "N2AF" + ] + }, + "Five Guys": { + "category": "Business", + "registrations": [ + "N881MJ" + ] + }, + "Government of Turkmenistan": { + "category": "Government", + "registrations": [ + "EZ-B023", + "EZ-A700", + "EZ-B022", + "EZ-B024", + "EZ-B021", + "EZ-G7500" + ] + }, + "Fertitta (Casinos + Houston Rockets)": { + "category": "People", + "registrations": [ + "N702F", + "N762F", + "N122GA", + "N721F", + "N723GD" + ] + }, + "Ford": { + "category": "Business", + "registrations": [ + "N328K", + "N330K", + "N326K" + ] + }, + "Republic of Tatarstan(RU)": { + "category": "Government", + "registrations": [ + "RA-09606" + ] + }, + "David MacNeil": { + "category": "People", + "registrations": [ + "N1DM" + ] + }, + "Franklin Templeton Investments": { + "category": "Business", + "registrations": [ + "N123FT", + "N388FT", + "N221FT", + "N328MM" + ] + }, + "Government of Jordan": { + "category": "Government", + "registrations": [ + "VQ-BJO", + "VP-BHM", + "VQ-BNZ" + ] + }, + "Mike Lindell": { + "category": "People", + "registrations": [ + "N356ML" + ] + }, + "GAP Inc.": { + "category": "Business", + "registrations": [ + "N812G" + ] + }, + "John Paulson": { + "category": "People", + "registrations": [ + "N288DG" + ] + }, + "General Dynamics": { + "category": "Business", + "registrations": [ + "N586G", + "N587G" + ] + }, + "Joe Manchin": { + "category": "People", + "registrations": [ + "N8439E" + ] + }, + "Globus Medical": { + "category": "Business", + "registrations": [ + "N775GM", + "N776GM" + ] + }, + "Dennis Washington": { + "category": "People", + "registrations": [ + "N162WC" + ] + }, + "Goldman Sachs": { + "category": "Business", + "registrations": [ + "N280WS", + "N650WS" + ] + }, + "Murdoch Family": { + "category": "People", + "registrations": [ + "N89NC", + "N988NC", + "N900NC", + "N898NC" + ] + }, + "Goodyear Tire & Rubber Company": { + "category": "Business", + "registrations": [ + "N20G", + "N24G", + "N22G" + ] + }, + "Dan Newlin": { + "category": "People", + "registrations": [ + "N444DN", + "N851PB" + ] + }, + "Google": { + "category": "Business", + "registrations": [ + "N10XG", + "N232G", + "N998PB", + "N904G", + "N222GV" + ] + }, + "Leon Black": { + "category": "People", + "registrations": [ + "N650XF" + ] + }, + "Grady White Boats": { + "category": "Business", + "registrations": [ + "N68GW" + ] + }, + "Great Clips": { + "category": "Business", + "registrations": [ + "N716GC" + ] + }, + "Mark Benioff": { + "category": "People", + "registrations": [ + "N808XX" + ] + }, + "Guggenheim Partners": { + "category": "Business", + "registrations": [ + "N2LA" + ] + }, + "Jim Breyer": { + "category": "People", + "registrations": [ + "N886AJ" + ] + }, + "Hallmark Cards": { + "category": "Business", + "registrations": [ + "N1910H" + ] + }, + "John Staluppi": { + "category": "People", + "registrations": [ + "N17JS" + ] + }, + "Hard Rock": { + "category": "Business", + "registrations": [ + "N126HR", + "N857ST" + ] + }, + "Jeffrey Soffer": { + "category": "People", + "registrations": [ + "N13JS" + ] + }, + "Hershey Foods": { + "category": "Business", + "registrations": [ + "N450MH", + "N604MH" + ] + }, + "Gulfstream C-37A": { + "category": "Government", + "registrations": [ + "https://rzjets.net/aircraft/?parentid=1550&typeid=123&frstatus=1" + ] + }, + "Peter Thiel": { + "category": "People", + "registrations": [ + "N41127" + ] + }, + "Hess Corp": { + "category": "Business", + "registrations": [ + "N1454H" + ] + }, + "Gulfstream C-37B": { + "category": "Government", + "registrations": [ + "https://rzjets.net/aircraft/?typ=74789" + ] + }, + "George William Davies": { + "category": "People", + "registrations": [ + "M-EGWD" + ] + }, + "Hilton Hotels": { + "category": "Business", + "registrations": [ + "N585JC", + "N519BH" + ] + }, + "Gulfstream C-20C": { + "category": "Government", + "registrations": [ + "https://rzjets.net/aircraft/?parentid=1550&typeid=121&frstatus=1" + ] + }, + "Winklevoss Twins (Crypto)": { + "category": "People", + "registrations": [ + "N631CD", + "N631AB" + ] + }, + "Hobby Lobby": { + "category": "Business", + "registrations": [ + "N872HL", + "N472HL", + "N72HL", + "N272HL", + "N2HL", + "N372HL" + ] + }, + "Gulfstream C-20H": { + "category": "Government", + "registrations": [ + "https://rzjets.net/aircraft/?parentid=1550&typeid=122&frstatus=1" + ] + }, + "Jacob Arabo": { + "category": "People", + "registrations": [ + "N190JA" + ] + }, + "Honeywell": { + "category": "Business", + "registrations": [ + "N389H", + "N933H", + "N705ML", + "N161B", + "N966H", + "N999TB", + "N151B", + "N988H", + "N139H" + ] + }, + "Cessna UC-35A/B": { + "category": "Government", + "registrations": [ + "https://rzjets.net/aircraft/?parentid=1550&typeid=67&frstatus=1" + ] + }, + "Donald Trump": { + "category": "People", + "registrations": [ + "N757AF" + ] + }, + "HP": { + "category": "Business", + "registrations": [ + "N2030P", + "N456GA" + ] + }, + "Beoing E4B": { + "category": "Government", + "registrations": [ + "73-1676", + "74-0787", + "73-1677", + "75-0125" + ] + }, + "Chairul Tanjung": { + "category": "People", + "registrations": [ + "VP-CTC" + ] + }, + "Huntsman Jet": { + "category": "Business", + "registrations": [ + "N620JH" + ] + }, + "Bombardier E-11A": { + "category": "Government", + "registrations": [ + "11-9001", + "11-9355", + "12-9506", + "22-9047", + "22-9046", + "21-9045" + ] + }, + "Trevor Milton": { + "category": "People", + "registrations": [ + "N155TM" + ] + }, + "Hy-Vee Grocery": { + "category": "Business", + "registrations": [ + "N78HV", + "N233CL", + "N565HV", + "N564HV" + ] + }, + "E-11A BACN & R1 Sentinel": { + "category": "Government", + "registrations": [ + "11-9001", + "12-9506", + "N691BD", + "11-9335", + "21-9045" + ] + }, + "Ted Waitt": { + "category": "People", + "registrations": [ + "N444WT", + "N163WT" + ] + }, + "Hyundai": { + "category": "Business", + "registrations": [ + "HL8290" + ] + }, + "IAI C-38A Courier": { + "category": "Government", + "registrations": [ + "94-1569" + ] + }, + "Stanley Druckenmiller": { + "category": "People", + "registrations": [ + "N97DQ" + ] + }, + "IBM": { + "category": "Business", + "registrations": [ + "N780RW", + "N790R", + "N780TW", + "N790J" + ] + }, + "Army ARES Bombardier Global": { + "category": "Government", + "registrations": [ + "N799JR" + ] + }, + "Thomas Siebel": { + "category": "People", + "registrations": [ + "N2TS", + "N1TS" + ] + }, + "Intel Air Shuttle (Intel)": { + "category": "Business", + "registrations": [ + "N386AZ", + "N486FM", + "N286SJ", + "N286DP", + "N286CH", + "N286FM" + ] + }, + "C-9B Skytrain II": { + "category": "Government", + "registrations": [ + "161529" + ] + }, + "Josh Altman": { + "category": "People", + "registrations": [ + "N858JL" + ] + }, + "Jacksons Food Stores": { + "category": "Business", + "registrations": [ + "N786WM", + "N428JE", + "N872J", + "N728LM", + "N873PC" + ] + }, + "RC-12X Guardrail": { + "category": "Government", + "registrations": [ + "AE1208", + "AE515E" + ] + }, + "Peter Lim": { + "category": "People", + "registrations": [ + "N757PL" + ] + }, + "JCB Manufacturing": { + "category": "Business", + "registrations": [ + "N200JB", + "M-JCBB" + ] + }, + "COMCO": { + "category": "Government", + "registrations": [ + "N226G", + "N610G" + ] + }, + "Robert F. Smith": { + "category": "People", + "registrations": [ + "N121RS", + "N401VE", + "N283DM" + ] + }, + "JDS Development": { + "category": "Business", + "registrations": [ + "N551GG" + ] + }, + "FEST (Foreign Emergency Support Team)": { + "category": "Government", + "registrations": [ + "025001", + "024452", + "009001" + ] + }, + "David Grain": { + "category": "People", + "registrations": [ + "N413PH" + ] + }, + "John Deere": { + "category": "Business", + "registrations": [ + "N600JD", + "N282JD", + "N550JD" + ] + }, + "RQ-4 Global Hawk": { + "category": "Government", + "registrations": [ + "05-2026", + "05-2025", + "07-2029", + "12-2050", + "05-2023", + "07-2027", + "08-2033", + "05-2022", + "09-2039", + "11-2046" + ] + }, + "David Sacks": { + "category": "People", + "registrations": [ + "N900VL" + ] + }, + "Johnson & Johnson": { + "category": "Business", + "registrations": [ + "N700J", + "N800J", + "N500J", + "N400J", + "N60QJ", + "N600J", + "N30QJ" + ] + }, + "WC-135R Constant Phoenix": { + "category": "Government", + "registrations": [ + "64-14836" + ] + }, + "Tommy Hilfiger": { + "category": "People", + "registrations": [ + "N818TH" + ] + }, + "Johnson Development": { + "category": "Business", + "registrations": [ + "N537GS" + ] + }, + "U.S. Marines C-40A": { + "category": "Government", + "registrations": [ + "17-0041" + ] + }, + "Edward Norton": { + "category": "People", + "registrations": [ + "N206SU" + ] + }, + "Johnsonville Brats": { + "category": "Business", + "registrations": [ + "N600JV" + ] + }, + "CIA Linked": { + "category": "Government", + "registrations": [ + "N3867X", + "N475LC", + "N437YV", + "N389DD", + "N197PA", + "N58AJ", + "N506KM" + ] + }, + "Ed DeBartolo": { + "category": "People", + "registrations": [ + "N100ED" + ] + }, + "JP Morgan": { + "category": "Business", + "registrations": [ + "N661CH", + "N662CH", + "N601CH" + ] + }, + "U.S. Govt. Special Missions": { + "category": "Government", + "registrations": [ + "N280PH" + ] + }, + "Jerry Jones": { + "category": "People", + "registrations": [ + "N992DC", + "N945DC", + "N1DC" + ] + }, + "JRK Property Holdings": { + "category": "Business", + "registrations": [ + "N637GA" + ] + }, + "B-29 Superfortress": { + "category": "Government", + "registrations": [ + "N69972", + "N529B" + ] + }, + "Fred Luddy": { + "category": "People", + "registrations": [ + "N4FL" + ] + }, + "L-3 Communications": { + "category": "Government", + "registrations": [ + "N523NB", + "N208SA", + "N3M", + "N320FC", + "N527GA", + "N552GA", + "N799JR", + "N551HA", + "N5055J", + "N529GA", + "N473AP", + "N281MH", + "N752LT" + ] + }, + "Dan Snyder": { + "category": "People", + "registrations": [ + "M-LDYS", + "M-DANS" + ] + }, + "Khosla Ventures": { + "category": "Business", + "registrations": [ + "N85NV", + "N604SB", + "N109HS" + ] + }, + "L3 Harris Technologies": { + "category": "Government", + "registrations": [ + "N527GA", + "N531GA", + "N530G", + "N529GA" + ] + }, + "Alejandro Roemmers": { + "category": "People", + "registrations": [ + "N313AG" + ] + }, + "Kiewit Engineering Co.": { + "category": "Business", + "registrations": [ + "N352K", + "N356K", + "N359K", + "N353K", + "N357K", + "N342K", + "N354K", + "N341K", + "N355K", + "N347K" + ] + }, + "Tenax Aerospace": { + "category": "Government", + "registrations": [ + "N9191" + ] + }, + "Paul Randy": { + "category": "People", + "registrations": [ + "N650KT" + ] + }, + "Knight-Swift Trucking": { + "category": "Business", + "registrations": [ + "N719KX", + "N390KX" + ] + }, + "ARTEMIS Platform": { + "category": "Government", + "registrations": [ + "N159L", + "N488CR" + ] + }, + "Charles Hoskinson": { + "category": "People", + "registrations": [ + "N1089" + ] + }, + "Koch Industries": { + "category": "Business", + "registrations": [ + "N302K", + "N265K" + ] + }, + "USAF/Big Safari/SierraNevCor": { + "category": "Government", + "registrations": [ + "N356ER", + "N590QP", + "N627GB", + "N986HA", + "N358ER", + "N645HM", + "N997MG", + "N29US" + ] + }, + "Jimmy John Liautaud": { + "category": "People", + "registrations": [ + "N15UB", + "N83JJ" + ] + }, + "Kohler Co.": { + "category": "Business", + "registrations": [ + "N797KK", + "N777KK", + "N101KK", + "N111KK" + ] + }, + "Ukraine War Survalliance Plane": { + "category": "Government", + "registrations": [ + "N488CR" + ] + }, + "Chase Coleman": { + "category": "People", + "registrations": [ + "N88C" + ] + }, + "Kroger": { + "category": "Business", + "registrations": [ + "N300KC", + "N50KR", + "N48KR", + "N304KC", + "N302KC", + "N49KR" + ] + }, + "Lockheed Gulfstream": { + "category": "Government", + "registrations": [ + "N30LX" + ] + }, + "Andy Albright": { + "category": "People", + "registrations": [ + "N247RU" + ] + }, + "Las Vegas Sands": { + "category": "Business", + "registrations": [ + "N804MS", + "N336LS", + "N885LS", + "N889LS", + "VP-BMH", + "N108MS", + "N623MS", + "VP-BMS", + "N500LS", + "VP-BLK", + "N383LS", + "N887LS", + "N883LS" + ] + }, + "Top Aces F16's": { + "category": "Government", + "registrations": [ + "N856TA", + "N858TA", + "N860TA", + "N865TA" + ] + }, + "Dmitry Balyasny": { + "category": "People", + "registrations": [ + "N193LS" + ] + }, + "Leisure Pools": { + "category": "Business", + "registrations": [ + "N9PF" + ] + }, + "AVdef": { + "category": "Government", + "registrations": [ + "F-GPAD" + ] + }, + "John Ruiz": { + "category": "People", + "registrations": [ + "N948PH", + "N830NR", + "N584ER", + "N267JR", + "N267RF" + ] + }, + "LG Electronics": { + "category": "Business", + "registrations": [ + "HL8299" + ] + }, + "Northrup Grumman": { + "category": "Government", + "registrations": [ + "N77NG", + "N37WH", + "N82CR", + "N72NG", + "N23NG", + "N804X" + ] + }, + "Mark Juncosa (SpaceX VP)": { + "category": "People", + "registrations": [ + "N16DF" + ] + }, + "Liberty Mutual Insurance": { + "category": "Business", + "registrations": [ + "N824SS", + "N801PR", + "N45JE", + "N270LE" + ] + }, + "Air Force Materiel Command-GRUMMAN": { + "category": "Government", + "registrations": [ + "N105TB" + ] + }, + "Jan Koum": { + "category": "People", + "registrations": [ + "N143", + "N518KA" + ] + }, + "Lockheed Martin": { + "category": "Business", + "registrations": [ + "N960DT", + "N344RS", + "N650VC", + "N359GS", + "N347NA" + ] + }, + "Military HALO Gulfstreams": { + "category": "Government", + "registrations": [ + "N551HA", + "N74A", + "N178B", + "N552HA", + "N779LC", + "N553HA" + ] + }, + "Taylor Gerring": { + "category": "People", + "registrations": [ + "N711PV" + ] + }, + "Lowes": { + "category": "Business", + "registrations": [ + "N307PD", + "N133RL", + "N33LC", + "N44LC", + "N55LC" + ] + }, + "Government 707": { + "category": "Government", + "registrations": [ + "77-0351", + "02-9111", + "76-1607", + "81-0894", + "71-1407" + ] + }, + "Chris Sacca": { + "category": "People", + "registrations": [ + "N117AL" + ] + }, + "Maersk Shipping Company": { + "category": "Business", + "registrations": [ + "OY-APM" + ] + }, + "MIT Lincoln Lab": { + "category": "Government", + "registrations": [ + "N108EW", + "N108RT", + "N331CL", + "N821AR", + "N359AR" + ] + }, + "John Doerr": { + "category": "People", + "registrations": [ + "N246BD" + ] + }, + "Mandalay Vegas Resorts": { + "category": "Business", + "registrations": [ + "N781MM", + "N783MM", + "N785MM", + "N721MM", + "N782MM" + ] + }, + "Marriott Hotels": { + "category": "Business", + "registrations": [ + "N57MH", + "N522MH" + ] + }, + "Larry Page": { + "category": "People", + "registrations": [ + "N813QS" + ] + }, + "Mary Kay Inc.": { + "category": "Business", + "registrations": [ + "N650NR" + ] + }, + "Jerry Yang": { + "category": "People", + "registrations": [ + "N999YY" + ] + }, + "McDonalds": { + "category": "Business", + "registrations": [ + "N1967M", + "N1969M", + "N1955M" + ] + }, + "Robert Pera": { + "category": "People", + "registrations": [ + "N4096Q" + ] + }, + "McNeil Consumer Healthcare (Tylenol)": { + "category": "Business", + "registrations": [ + "N772HM", + "N771HM" + ] + }, + "Roleof Botha": { + "category": "People", + "registrations": [ + "N39871" + ] + }, + "Plumb Bill Pay": { + "category": "Business", + "registrations": [ + "N3TS" + ] + }, + "Phillip Sarofim": { + "category": "People", + "registrations": [ + "N1111P" + ] + }, + "Meijer Stores": { + "category": "Business", + "registrations": [ + "N1219M", + "N519LM", + "N1907M" + ] + }, + "Joe Tsai": { + "category": "People", + "registrations": [ + "VP-COR" + ] + }, + "Menards": { + "category": "Business", + "registrations": [ + "N515CX", + "N586M", + "N549M", + "N538M", + "N563M", + "N540M" + ] + }, + "Learjet C-21A": { + "category": "Government", + "registrations": [ + "84-0124", + "84-0087", + "84-0120", + "84-0125", + "84-0129", + "84-0071", + "86-0374", + "84-0135", + "84-0075", + "84-0096", + "84-0137", + "84-0083", + "86-0377", + "84-0126", + "84-0085", + "84-0142", + "84-0079", + "84-0072" + ] + }, + "Amnon Shashua": { + "category": "People", + "registrations": [ + "M-MBLY" + ] + }, + "Merck": { + "category": "Business", + "registrations": [ + "N811MK", + "N822MK", + "N462MK" + ] + }, + "Eytan Stibbe": { + "category": "People", + "registrations": [ + "M-ANGO" + ] + }, + "Micron": { + "category": "Business", + "registrations": [ + "N858CG" + ] + }, + "Woody Johnson": { + "category": "People", + "registrations": [ + "N108PB" + ] + }, + "Miliken": { + "category": "Business", + "registrations": [ + "N854MC" + ] + }, + "Boeing C-40A/B Clipper": { + "category": "Government", + "registrations": [ + "01-0040", + "16-5833", + "16-5830", + "16-5832", + "16-5835", + "02-0203", + "09-0540", + "01-0015", + "02-0201", + "16-8981", + "16-5836", + "16-6693", + "16-5829", + "02-0202", + "16-9793", + "16-6695", + "17-0041", + "16-6696", + "05-0932", + "65-834", + "02-0042", + "16-9792", + "05-0730", + "16-6694", + "16-9036", + "16-8980", + "01-0041", + "17-0042", + "05-4613", + "16-5831", + "99-1025" + ] + }, + "Mark Burnett": { + "category": "People", + "registrations": [ + "N139MB" + ] + }, + "Morgan and Morgan Law Firm": { + "category": "Business", + "registrations": [ + "N946MM" + ] + }, + "Andr\u00e9 Esteves": { + "category": "People", + "registrations": [ + "PS-BTG" + ] + }, + "Morgan Stanley": { + "category": "Business", + "registrations": [ + "N669GD" + ] + }, + "Nick Marietta": { + "category": "People", + "registrations": [ + "N188FJ" + ] + }, + "Nanoworks": { + "category": "Business", + "registrations": [ + "N278L" + ] + }, + "Boeing E-3G Sentry": { + "category": "Government", + "registrations": [ + "79-0003", + "78-0577", + "75-0558", + "75-0560", + "77-0355", + "78-0576", + "75-0556", + "83-0009", + "75-0559", + "76-1604", + "80-0139", + "71-1408", + "78-0578", + "80-0138", + "76-1607", + "75-0557", + "77-0351", + "77-0356", + "79-0002", + "76-1605", + "77-0353", + "73-1675", + "79-0001", + "82-0007", + "82-0006", + "77-0352", + "80-0137", + "81-0004", + "76-1606", + "71-1407", + "81-0005" + ] + }, + "Nestle USA": { + "category": "Business", + "registrations": [ + "N608RP", + "N1TT" + ] + }, + "Jared Kushner": { + "category": "People", + "registrations": [ + "N1826K" + ] + }, + "Netflix": { + "category": "Business", + "registrations": [ + "N535GV", + "N512GV", + "N533GV" + ] + }, + "Charles Simonyi": { + "category": "People", + "registrations": [ + "N822LC", + "N1601H" + ] + }, + "Niagara Water Bottling": { + "category": "Business", + "registrations": [ + "N63NB" + ] + }, + "FAA": { + "category": "Government", + "registrations": [ + "N87", + "N2", + "N16", + "N1", + "N73", + "N47", + "N75", + "N80", + "N59", + "N86", + "N90", + "N67", + "N15", + "N17", + "N14", + "N68", + "N56", + "N11", + "N70", + "N88", + "N84", + "N55", + "N57", + "N66", + "N71", + "N35", + "N12", + "N85", + "N72", + "N89", + "N69", + "N54", + "N83", + "N79", + "N13", + "N76", + "N77", + "N81", + "N58", + "N78" + ] + }, + "Jon A Shirley": { + "category": "People", + "registrations": [ + "N74JK" + ] + }, + "Nike": { + "category": "Business", + "registrations": [ + "N6453", + "N1KE", + "N694GS", + "N19HT" + ] + }, + "Kevin Harvey": { + "category": "People", + "registrations": [ + "N661GT" + ] + }, + "Norfolk Southern Railroad": { + "category": "Business", + "registrations": [ + "N159NS", + "N157NS", + "N158NS" + ] + }, + "Jeffrey Vinik": { + "category": "People", + "registrations": [ + "N167TV" + ] + }, + "Oaktree Capital": { + "category": "Business", + "registrations": [ + "N950CM" + ] + }, + "B-52": { + "category": "Government", + "registrations": [ + "60-0022", + "60-0035", + "61-0004", + "61-0034", + "61-0012", + "61-0032", + "61-0003", + "60-0034", + "61-0036", + "61-0005", + "60-0001", + "60-0021", + "60-0062", + "61-0040", + "60-0061", + "60-0032", + "61-0007", + "61-0028", + "60-0050", + "61-0015", + "60-0051", + "60-0055", + "60-0031", + "60-0015", + "60-0023", + "60-0008", + "60-0059", + "60-0004", + "60-0028", + "61-0014", + "60-0045", + "60-0060", + "60-0024", + "60-0037", + "60-0042", + "60-0017", + "61-0016", + "60-0018", + "61-0029", + "61-0031", + "60-0007", + "61-0018", + "60-0056", + "61-0006", + "61-0013", + "60-0054", + "60-0003", + "61-0002", + "60-0026", + "61-0038", + "61-0010", + "60-0041", + "60-0044", + "60-0058", + "60-0009", + "60-0005", + "60-0025", + "60-0038", + "61-0020", + "60-0002", + "61-0017", + "61-0035", + "60-0036", + "60-0012", + "61-0019", + "61-0008", + "60-0029", + "60-0011", + "61-0021", + "60-0057", + "61-0039", + "61-0011", + "61-0001", + "60-0033", + "60-0048", + "60-0052", + "60-0013" + ] + }, + "Greg Wyler (OneWeb)": { + "category": "People", + "registrations": [ + "N11GW" + ] + }, + "Oracle": { + "category": "Business", + "registrations": [ + "N15GX", + "N703DS" + ] + }, + "B-1B": { + "category": "Government", + "registrations": [ + "86-0107", + "86-0102", + "86-0127" + ] + }, + "Meet Kevin (YouTuber)": { + "category": "People", + "registrations": [ + "N88W", + "N964PP" + ] + }, + "OtterBox": { + "category": "Business", + "registrations": [ + "N183BX" + ] + }, + "Gwyenn Shotwell (SpaceX)": { + "category": "People", + "registrations": [ + "N450GG" + ] + }, + "PACCAR": { + "category": "Business", + "registrations": [ + "N706P", + "N701P", + "N710P" + ] + }, + "Antonio Gracias (Valor Equity Partners)": { + "category": "People", + "registrations": [ + "N95VE" + ] + }, + "Palantir": { + "category": "Business", + "registrations": [ + "N814PS" + ] + }, + "David Katzman (SmileDirect)": { + "category": "People", + "registrations": [ + "N424PX" + ] + }, + "Panda Express": { + "category": "Business", + "registrations": [ + "N168PX" + ] + }, + "Wes Edens": { + "category": "People", + "registrations": [ + "N888ZF" + ] + }, + "Pap\u00e9 Machinery": { + "category": "Business", + "registrations": [ + "N101PG", + "N102PG" + ] + }, + "Remon Voss": { + "category": "People", + "registrations": [ + "OK-VOS" + ] + }, + "Paramount Pictures": { + "category": "Business", + "registrations": [ + "N75VB" + ] + }, + "Joseph Edelman": { + "category": "People", + "registrations": [ + "N416EL" + ] + }, + "Pasaca Capital": { + "category": "Business", + "registrations": [ + "N889CH", + "N889CL" + ] + }, + "Glennon Crowell Jr.": { + "category": "People", + "registrations": [ + "N999GC" + ] + }, + "Patek Philippe SA": { + "category": "Business", + "registrations": [ + "HB-JFP" + ] + }, + "Pritzker Family": { + "category": "People", + "registrations": [ + "N583GD", + "N582GD", + "N962GA" + ] + }, + "PayPal": { + "category": "Business", + "registrations": [ + "N4050" + ] + }, + "Aliko Dangote": { + "category": "People", + "registrations": [ + "N605DA" + ] + }, + "Penn National Gaming": { + "category": "Business", + "registrations": [ + "N10J", + "N910J" + ] + }, + "John Schnatter (Papa Johns)": { + "category": "People", + "registrations": [ + "N84PJ", + "N83ML" + ] + }, + "Pepsi": { + "category": "Business", + "registrations": [ + "N500PC", + "N508PC", + "N502PC", + "N501PC", + "N503PC" + ] + }, + "Stephanie Shojaee (Shoma Real Estate)": { + "category": "People", + "registrations": [ + "N85D" + ] + }, + "Perenco": { + "category": "Business", + "registrations": [ + "M-WAFA" + ] + }, + "Nelson Peltz": { + "category": "People", + "registrations": [ + "N115TR" + ] + }, + "Peterson Companies": { + "category": "Business", + "registrations": [ + "N273A" + ] + }, + "Jerry Savelle (televangelist )": { + "category": "People", + "registrations": [ + "N920JS" + ] + }, + "Pfizer": { + "category": "Business", + "registrations": [ + "N6CP", + "N3CP", + "N4CP", + "N5CP" + ] + }, + "Michael Niederst (Real estate)": { + "category": "People", + "registrations": [ + "N650MN" + ] + }, + "Prada": { + "category": "Business", + "registrations": [ + "I-XPRA" + ] + }, + "Eric Lefkofsky (Groupon)": { + "category": "People", + "registrations": [ + "N148L" + ] + }, + "Precision Castparts": { + "category": "Business", + "registrations": [ + "N756HA", + "N756PC", + "N673HA", + "N599HA" + ] + }, + "Brad Keywell (Groupon and Uptake Tech)": { + "category": "People", + "registrations": [ + "N148JL" + ] + }, + "Prime Inc.": { + "category": "Business", + "registrations": [ + "N650VL" + ] + }, + "James Williamson": { + "category": "People", + "registrations": [ + "N939CC" + ] + }, + "Principal Financial": { + "category": "Business", + "registrations": [ + "N79PG", + "N179PF" + ] + }, + "Michael Saylor (MicroStrategy)": { + "category": "People", + "registrations": [ + "N3877" + ] + }, + "Proctor & Gamble": { + "category": "Business", + "registrations": [ + "N2PG", + "N5PG", + "N7PG", + "N1PG", + "N6PG" + ] + }, + "Michael Milken": { + "category": "People", + "registrations": [ + "N704MF" + ] + }, + "Prudential Insurance": { + "category": "Business", + "registrations": [ + "N1875A", + "N82A" + ] + }, + "Patrick Dovigi": { + "category": "People", + "registrations": [ + "C-GFLU", + "C-GPJD" + ] + }, + "Publix Supermarkets": { + "category": "Business", + "registrations": [ + "N89PX", + "N30GJ", + "N929GW" + ] + }, + "John A. Sobrato": { + "category": "People", + "registrations": [ + "N539JS" + ] + }, + "Puma": { + "category": "Business", + "registrations": [ + "N1948Z" + ] + }, + "Ty Warner": { + "category": "People", + "registrations": [ + "N888TY" + ] + }, + "Purina Petcare": { + "category": "Business", + "registrations": [ + "N607RP", + "N50NP" + ] + }, + "Louis Bacon": { + "category": "People", + "registrations": [ + "N725LB", + "N508LB" + ] + }, + "Qualcomm": { + "category": "Business", + "registrations": [ + "N880WT", + "N886WT", + "N887WT", + "N692GD" + ] + }, + "Laurence Escalante (theleecollection)": { + "category": "People", + "registrations": [ + "VH-LON" + ] + }, + "Quest Diagnostics (BE58)": { + "category": "Business", + "registrations": [ + "N2143J", + "N1065B", + "N910SA", + "N14JH", + "N36TA", + "N3267N" + ] + }, + "Mohamed El Enein": { + "category": "People", + "registrations": [ + "N700ME" + ] + }, + "Quest Diagnostics (Other)": { + "category": "Business", + "registrations": [ + "N288DX", + "N197DX", + "N648DX", + "N899DX" + ] + }, + "Kris Krohn": { + "category": "People", + "registrations": [ + "N188FJ" + ] + }, + "Quest Diagnostics (PC12)": { + "category": "Business", + "registrations": [ + "N589QD", + "N26VW", + "N687QD", + "N120QD", + "N399SA", + "N432CV", + "N942TW", + "N567QD", + "N338QD", + "N465PC", + "N149QD" + ] + }, + "Danny Jenkins": { + "category": "People", + "registrations": [ + "N2425J" + ] + }, + "Raytheon": { + "category": "Business", + "registrations": [ + "N48RT", + "N46RT", + "N89RT", + "N67RT", + "N601RC" + ] + }, + "Erik Prince": { + "category": "People", + "registrations": [ + "N131EP" + ] + }, + "RealPage Real Estate": { + "category": "Business", + "registrations": [ + "N63RP" + ] + }, + "Alan Waxman Sixth Street Partners": { + "category": "People", + "registrations": [ + "N5456W" + ] + }, + "Related Companies (Stephen Ross)": { + "category": "Business", + "registrations": [ + "N510SR", + "N155TM", + "N551RC" + ] + }, + "Pierre Omidyar": { + "category": "People", + "registrations": [ + "N171EX" + ] + }, + "Resturant Brands Intl.": { + "category": "Business", + "registrations": [ + "N551SW" + ] + }, + "Richard T. Santulli": { + "category": "People", + "registrations": [ + "N307PS" + ] + }, + "Rocket Lab Helicopters": { + "category": "Business", + "registrations": [ + "ZK-HEV", + "ZK-HKQ", + "ZK-IXW" + ] + }, + "Vick Tipnes": { + "category": "People", + "registrations": [ + "N921MG" + ] + }, + "Tom and Steuart Walton": { + "category": "People", + "registrations": [ + "N128SK", + "N479W" + ] + }, + "Rooms to Go": { + "category": "Business", + "registrations": [ + "N660DX" + ] + }, + "Cohen Brothers": { + "category": "People", + "registrations": [ + "N979CB" + ] + }, + "RTW Investments": { + "category": "Business", + "registrations": [ + "N512GL" + ] + }, + "Ronald Perelman": { + "category": "People", + "registrations": [ + "N838MF" + ] + }, + "RyanAir Support Aircraft": { + "category": "Business", + "registrations": [ + "M-ABGV", + "M-ABTE", + "M-ABJA", + "M-ABRB", + "M-ABEU", + "M-ABSU" + ] + }, + "Tom Werner": { + "category": "People", + "registrations": [ + "N672WM" + ] + }, + "S C Johnson": { + "category": "Business", + "registrations": [ + "N989JW", + "N979JW" + ] + }, + "Jon Gray": { + "category": "People", + "registrations": [ + "N898MJ" + ] + }, + "Samsung": { + "category": "Business", + "registrations": [ + "HL9610", + "HL9609", + "HL8508" + ] + }, + "Robert Herjavec": { + "category": "People", + "registrations": [ + "N616RH" + ] + }, + "ScottsMiracle-Gro": { + "category": "Business", + "registrations": [ + "N50MG", + "N520MG", + "N12MG" + ] + }, + "Jeff Swickard": { + "category": "People", + "registrations": [ + "N609JS", + "N440C" + ] + }, + "Shell Oil": { + "category": "Business", + "registrations": [ + "VQ-BXF", + "VQ-BXD", + "VQ-BXG", + "VQ-BXH" + ] + }, + "Haim Saban": { + "category": "People", + "registrations": [ + "N451CS" + ] + }, + "Sierra Pacific Industries": { + "category": "Business", + "registrations": [ + "N979TM", + "N473HB", + "N505GD", + "N289PC" + ] + }, + "Steven Rattner": { + "category": "People", + "registrations": [ + "N12MW" + ] + }, + "Simon Property Group (Malls)": { + "category": "Business", + "registrations": [ + "N244DS" + ] + }, + "David Ellison": { + "category": "People", + "registrations": [ + "N651DE" + ] + }, + "Snapchat/Evan Spiegel": { + "category": "Business", + "registrations": [ + "N14KL", + "N3E" + ] + }, + "Alberto Rodr\u00edguez Baldi (Baldi Hot Springs Hotel)": { + "category": "People", + "registrations": [ + "N908BH" + ] + }, + "South Park Media": { + "category": "Business", + "registrations": [ + "N646Y" + ] + }, + "James Dyson": { + "category": "People", + "registrations": [ + "G-DWGI", + "G-GVII", + "G-DVIO", + "G-VIOF", + "G-ULFD", + "G-DVII" + ] + }, + "SpaceX": { + "category": "Business", + "registrations": [ + "N272BG", + "N154TS" + ] + }, + "Aiyawatt Srivaddhanaprabha": { + "category": "People", + "registrations": [ + "M-LCFC", + "HS-VSK", + "HS-KVS" + ] + }, + "Standard Industries": { + "category": "Business", + "registrations": [ + "N1886N", + "N40WR", + "N40NS", + "N1886G" + ] + }, + "Jay Penske": { + "category": "People", + "registrations": [ + "N7JP" + ] + } + } +} \ No newline at end of file diff --git a/backend/debug_fast.json.REMOVED.git-id b/backend/debug_fast.json.REMOVED.git-id new file mode 100644 index 0000000..d7f6dfe --- /dev/null +++ b/backend/debug_fast.json.REMOVED.git-id @@ -0,0 +1 @@ +5c3b1c768973ca54e9a1befee8dc075f38e8cc56 \ No newline at end of file diff --git a/backend/dump.json.REMOVED.git-id b/backend/dump.json.REMOVED.git-id new file mode 100644 index 0000000..2874b8a --- /dev/null +++ b/backend/dump.json.REMOVED.git-id @@ -0,0 +1 @@ +2b64633521ffb6f06da36e19f5c8eb86979e2187 \ No newline at end of file diff --git a/backend/extract_ovens.py b/backend/extract_ovens.py new file mode 100644 index 0000000..dd6ca8b --- /dev/null +++ b/backend/extract_ovens.py @@ -0,0 +1,25 @@ +import re +import json + +try: + with open('liveua_test.html', 'r', encoding='utf-8') as f: + html = f.read() + + m = re.search(r"var\s+ovens\s*=\s*(.*?);(?!function)", html, re.DOTALL) + if m: + json_str = m.group(1) + # Handle if it is a string containing base64 + if json_str.startswith("'") or json_str.startswith('"'): + json_str = json_str.strip('"\'') + import base64 + import urllib.parse + json_str = base64.b64decode(urllib.parse.unquote(json_str)).decode('utf-8') + + data = json.loads(json_str) + with open('out_liveua.json', 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) + print(f"Successfully extracted {len(data)} ovens items.") + else: + print("var ovens not found.") +except Exception as e: + print("Error:", e) diff --git a/backend/liveua_test.html b/backend/liveua_test.html new file mode 100644 index 0000000..85e30b4 --- /dev/null +++ b/backend/liveua_test.html @@ -0,0 +1,99 @@ + +Ukraine Interactive map - Ukraine Latest news on live map - liveuamap.com +
Explosions were reported in Zaporizhzhia
Explosions were reported in Belgorod14 hour ago
Explosions were reported in Belgorod
A missile alert was declared for the first time in the Sverdlovsk region.
Explosions were reported in Kursk
General Staff of Armed Forces of Ukraine confirmed strikes at the oil depot in Luhansk, also oil depot near Mariupol, Novotoretske and Koptieve
Another IAEA-brokered local ceasefire is now in effect to enable restoration of the 330 kV backup power supply to the Zaporizhzhya Nuclear Power Plant. “Demining activities are ongoing to ensure safe access for the repair teams,” Director General @RafaelMGrossi said
Russian aviation conducted airstrikes at Oleksandrohrad of Donetsk region, Ivanivka, Lisne, Malomykhaylivka, Pysantsi, Pokrovske of Dnipropetrovsk region, Verkhnya Tersa, Tersyanka, Zelene, Shevchenkivske, Vozdvyzhivka, Dolynka, Kopani, Orikhiv, Preobrazhenka, Veselyanka of Zaporizhzhia region, - General Staff of Armed Forces of Ukraine reports23 hour ago
Russian aviation conducted airstrikes at Oleksandrohrad of Donetsk region, Ivanivka, Lisne, Malomykhaylivka, Pysantsi, Pokrovske of Dnipropetrovsk region, Verkhnya Tersa, Tersyanka, Zelene, Shevchenkivske, Vozdvyzhivka, Dolynka, Kopani, Orikhiv, Preobrazhenka, Veselyanka of Zaporizhzhia region, - General Staff of Armed Forces of Ukraine reports
At Lyman direction clashes yesterday near Chervonyi Stav, Novoyehorivka, Drobysheve, Stavky, Lyman and near Zarichne, Novoselivka, - General Staff of Armed Forces of Ukraine reports
At Sloviansk direction clashes yesterday near Yampil, Zakitne and towards Ray-Oleksandrivka, - General Staff of Armed Forces of Ukraine reports
At South Slobozhansky(Kharkiv) direction clashes yesterday near Starytsya, Pischane, Kruhle, Nesterne, Chuhunivka and towards Zelene, Okhrimivka, - General Staff of Armed Forces of Ukraine reports23 hour ago
At South Slobozhansky(Kharkiv) direction clashes yesterday near Starytsya, Pischane, Kruhle, Nesterne, Chuhunivka and towards Zelene, Okhrimivka, - General Staff of Armed Forces of Ukraine reports
At Kramatorsk direction clashes yesterday near Orikhovo-Vasylivka and Bondarne, - General Staff of Armed Forces of Ukraine reports
At Kupyansk direction clashes yesterday near Kruhlyakivka and towards Kurylivka, Bohuslavka, Novoplatonivka, - General Staff of Armed Forces of Ukraine reports
At Kostiantynivka direction clashes yesterday near Oleksandro-Shultyne, Scherbynivka, Pleschiyivka, Rusyn Yar and towards Kostyantynivka, Ivanopillya, Illinivka, Berestok, Stepanivka, Sofiyivka, Novopavlivka, - General Staff of Armed Forces of Ukraine reports
At Oleksandrivka direction clashes yesterday near Ternove, Zlahoda and towards Verbove, Vyshneve, Oleksandrohrad, - General Staff of Armed Forces of Ukraine reports
At Huliaipole direction clashes yesterday near Dobropillya, Huliaipole and towards Zaliznychne, Staroukrayinka, Hirke, Varvarivka, Olenokostyantynivka, Svyatopetrivka, Charivne, - General Staff of Armed Forces of Ukraine reports23 hour ago
At Huliaipole direction clashes yesterday near Dobropillya, Huliaipole and towards Zaliznychne, Staroukrayinka, Hirke, Varvarivka, Olenokostyantynivka, Svyatopetrivka, Charivne, - General Staff of Armed Forces of Ukraine reports
At Kursk and North Slobozhansky(Sumy) direction Ukrainian forces have repelled 1 Russian army assault, - General Staff of Armed Forces of Ukraine reports23 hour ago
At Kursk and North Slobozhansky(Sumy) direction Ukrainian forces have repelled 1 Russian army assault, - General Staff of Armed Forces of Ukraine reports
At Pokrovsk direction clashes yesterday near Rodynske, Pokrovsk, Kotlyne, Molodetske, Udachne, Muravka, Filiya and towards Bilytske, Shevchenko, Hryshyne, Serhiyivka, Novopidhorodnye, - General Staff of Armed Forces of Ukraine reports
Russia launched 187 drones overnight, - Ukrainian Air Force
Fire at the oil depot in Luhansk after explosions
Explosions were reported in Belgorod
Explosions were reported in Sumy
2 people killed, 1 wounded as result of airstrikes in Druzhkivka1 day ago
2 people killed, 1 wounded as result of airstrikes in Druzhkivka
Satellite images showing Dorogobuzh chemical plant was completely destroyed as result of Ukrainian drone strike
Russia returned 1000 bodies of the fallen servicemen to Ukraine
Putin met with Lukashenka in Kremlin
Overnight Russia launched 2 hypersonic missiles Tsyrkon, 11 Iskander-M/S-400 ballistic missiles, 24 cruise missiles Kh-101, 2 Kh-59/69 aviation missiles and 420 drones of different types, - Ukrainian Air Force1 day ago
Overnight Russia launched 2 hypersonic missiles Tsyrkon, 11 Iskander-M/S-400 ballistic missiles, 24 cruise missiles Kh-101, 2 Kh-59/69 aviation missiles and 420 drones of different types, - Ukrainian Air Force
At Sloviansk direction clashes yesterday near Yampil and Platonivka, - General Staff of Armed Forces of Ukraine reports
Russian aviation conducted airstrikes at Luzhky of Sumy region, Pokrovske, Havrylivka, Orly, Velykomykhaylivka of Dnipropetrovsk region, Ostrovske, Charivne, Zaliznychne, Trudove, Svitla Dolyna, Vozdvyzhivka, Huliaipilske, Dolynka, Kopani, Lubytske, Tersyanka of Zaporizhzhia region, - General Staff of Armed Forces of Ukraine reports
At Kostiantynivka direction clashes yesterday near Kostyantynivka, Ivanopillya, Illinivka, Berestok, Rusyn Yar, Stepanivka, Novopavlivka and Sofiyivka, - General Staff of Armed Forces of Ukraine reports
At Pokrovsk direction clashes yesterday near Rodynske, Kotlyne, Molodetske, Udachne, Novomykolayivka, Muravka, Filiya and towards towns Bilytske, Hryshyne, Novopidhorodnye, Novooleksandrivka and Novopavlivka, - General Staff of Armed Forces of Ukraine reports
+ + diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..ca8c205 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,195 @@ +from fastapi import FastAPI, Request, Response +from fastapi.middleware.cors import CORSMiddleware +from contextlib import asynccontextmanager +from services.data_fetcher import start_scheduler, stop_scheduler, get_latest_data +from services.ais_stream import start_ais_stream, stop_ais_stream +from services.carrier_tracker import start_carrier_tracker, stop_carrier_tracker +import uvicorn +import logging +import hashlib +import json as json_mod + +logging.basicConfig(level=logging.INFO) + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup: Start background data fetching, AIS stream, and carrier tracker + start_carrier_tracker() + start_ais_stream() + start_scheduler() + yield + # Shutdown: Stop all background services + stop_ais_stream() + stop_scheduler() + stop_carrier_tracker() + +app = FastAPI(title="Live Risk Dashboard API", lifespan=lifespan) + +from fastapi.middleware.gzip import GZipMiddleware +app.add_middleware(GZipMiddleware, minimum_size=1000) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # For prototyping, allow all + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +from services.data_fetcher import update_all_data + +@app.get("/api/refresh") +async def force_refresh(): + # Force an immediate synchronous update of the data payload + import threading + t = threading.Thread(target=update_all_data) + t.start() + return {"status": "refreshing in background"} + +@app.get("/api/live-data") +async def live_data(): + return get_latest_data() + +@app.get("/api/live-data/fast") +async def live_data_fast(request: Request): + d = get_latest_data() + payload = { + "commercial_flights": d.get("commercial_flights", []), + "military_flights": d.get("military_flights", []), + "private_flights": d.get("private_flights", []), + "private_jets": d.get("private_jets", []), + "tracked_flights": d.get("tracked_flights", []), + "ships": d.get("ships", []), + "cctv": d.get("cctv", []), + "uavs": d.get("uavs", []), + "liveuamap": d.get("liveuamap", []), + "gps_jamming": d.get("gps_jamming", []), + } + # ETag includes last_updated timestamp so it changes on every data refresh, + # not just when item counts change (old bug: positions went stale) + last_updated = d.get("last_updated", "") + counts = "|".join(f"{k}:{len(v) if isinstance(v, list) else 0}" for k, v in payload.items()) + etag = hashlib.md5(f"{last_updated}|{counts}".encode()).hexdigest()[:16] + if request.headers.get("if-none-match") == etag: + return Response(status_code=304, headers={"ETag": etag, "Cache-Control": "no-cache"}) + return Response( + content=json_mod.dumps(payload), + media_type="application/json", + headers={"ETag": etag, "Cache-Control": "no-cache"} + ) + +@app.get("/api/live-data/slow") +async def live_data_slow(request: Request): + d = get_latest_data() + payload = { + "last_updated": d.get("last_updated"), + "news": d.get("news", []), + "stocks": d.get("stocks", {}), + "oil": d.get("oil", {}), + "weather": d.get("weather"), + "traffic": d.get("traffic", []), + "earthquakes": d.get("earthquakes", []), + "frontlines": d.get("frontlines"), + "gdelt": d.get("gdelt", []), + "airports": d.get("airports", []), + "satellites": d.get("satellites", []) + } + # ETag based on last_updated + item counts + last_updated = d.get("last_updated", "") + counts = "|".join(f"{k}:{len(v) if isinstance(v, list) else 0}" for k, v in payload.items()) + etag = hashlib.md5(f"slow|{last_updated}|{counts}".encode()).hexdigest()[:16] + if request.headers.get("if-none-match") == etag: + return Response(status_code=304, headers={"ETag": etag, "Cache-Control": "no-cache"}) + return Response( + content=json_mod.dumps(payload, default=str), + media_type="application/json", + headers={"ETag": etag, "Cache-Control": "no-cache"} + ) + +@app.get("/api/debug-latest") +async def debug_latest_data(): + return list(get_latest_data().keys()) + + +@app.get("/api/health") +async def health_check(): + return {"status": "ok"} + +from services.radio_intercept import get_top_broadcastify_feeds, get_openmhz_systems, get_recent_openmhz_calls, find_nearest_openmhz_system + +@app.get("/api/radio/top") +async def get_top_radios(): + return get_top_broadcastify_feeds() + +@app.get("/api/radio/openmhz/systems") +async def api_get_openmhz_systems(): + return get_openmhz_systems() + +@app.get("/api/radio/openmhz/calls/{sys_name}") +async def api_get_openmhz_calls(sys_name: str): + return get_recent_openmhz_calls(sys_name) + +@app.get("/api/radio/nearest") +async def api_get_nearest_radio(lat: float, lng: float): + return find_nearest_openmhz_system(lat, lng) + +from services.radio_intercept import find_nearest_openmhz_systems_list + +@app.get("/api/radio/nearest-list") +async def api_get_nearest_radios_list(lat: float, lng: float, limit: int = 5): + return find_nearest_openmhz_systems_list(lat, lng, limit=limit) + +from services.network_utils import fetch_with_curl + +@app.get("/api/route/{callsign}") +async def get_flight_route(callsign: str): + r = fetch_with_curl("https://api.adsb.lol/api/0/routeset", method="POST", json_data={"planes": [{"callsign": callsign}]}, timeout=10) + if r.status_code == 200: + data = r.json() + route_list = [] + if isinstance(data, dict): + route_list = data.get("value", []) + elif isinstance(data, list): + route_list = data + + if route_list and len(route_list) > 0: + route = route_list[0] + airports = route.get("_airports", []) + if len(airports) >= 2: + return { + "orig_loc": [airports[0].get("lon", 0), airports[0].get("lat", 0)], + "dest_loc": [airports[-1].get("lon", 0), airports[-1].get("lat", 0)] + } + return {} + +from services.region_dossier import get_region_dossier + +@app.get("/api/region-dossier") +def api_region_dossier(lat: float, lng: float): + """Sync def so FastAPI runs it in a threadpool — prevents blocking the event loop.""" + return get_region_dossier(lat, lng) + +# --------------------------------------------------------------------------- +# API Settings — key registry & management +# --------------------------------------------------------------------------- +from services.api_settings import get_api_keys, update_api_key +from pydantic import BaseModel + +class ApiKeyUpdate(BaseModel): + env_key: str + value: str + +@app.get("/api/settings/api-keys") +async def api_get_keys(): + return get_api_keys() + +@app.put("/api/settings/api-keys") +async def api_update_key(body: ApiKeyUpdate): + ok = update_api_key(body.env_key, body.value) + if ok: + return {"status": "updated", "env_key": body.env_key} + return {"status": "error", "message": "Failed to update .env file"} + +if __name__ == "__main__": + uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True) + +# Application successfully initialized with background scraping tasks diff --git a/backend/nyc_full.json b/backend/nyc_full.json new file mode 100644 index 0000000..efa6ff6 --- /dev/null +++ b/backend/nyc_full.json @@ -0,0 +1,1000 @@ +[{"full_complaint_id":"201906012119317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012175717","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-25T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012180117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-27T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012273417","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-16T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012413717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-20T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012523617","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-31T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012616917","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-11T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012762517","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-21T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112336617","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-18T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112366917","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-02T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112388617","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-14T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112480917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-03T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112732317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906212354417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906312261717","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-05-01T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612340517","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-19T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612501117","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-25T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612572617","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-10T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906712856617","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012369217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-07T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112834917","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907212157317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-17T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907212538417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-28T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812113917","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-29T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812572217","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-27T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012153917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006312172117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612157417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612384517","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612437417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006812511217","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-27T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012164217","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012209917","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-02-24T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012350017","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-30T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012395917","complaint_year_number":"2020","month_number":"5","record_create_date":"2020-05-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012576017","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012887617","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212105317","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-01-22T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212185817","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-07T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212674817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-18T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106012215417","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-20T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106112663417","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212262717","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212715417","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106312289717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-22T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612112717","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-03T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612221117","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-23T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612617417","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106812515417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-20T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106812599317","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-09T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107012930817","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107812535917","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-21T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012204617","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-07T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012207017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012210717","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-09T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112240217","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-24T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112254317","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112304217","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-24T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112312317","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112366417","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-23T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112662417","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206212775817","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612139117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612616817","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-11-01T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612642317","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-14T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612664617","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012367817","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012376217","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-09T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012413417","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012642417","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012699217","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012796917","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012878317","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-25T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012905717","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207212434417","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-17T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012285217","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-02T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012342117","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-25T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012358417","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-05-01T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012418117","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012881217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112174617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-16T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112692417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112738017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212289117","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-04T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212841417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212941117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612079617","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612283717","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612408717","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612634417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-28T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012242117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-09T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012245217","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012292917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-27T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012806017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307112891917","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212744017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-30T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307812640517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-10T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012419617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-29T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012780417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012795717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112142817","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-04T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112147517","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112174317","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112216517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112349017","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-09T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112376717","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112430717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112775817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-04T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112870417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212401517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-13T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212431117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-23T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212452717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-31T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212460417","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212616717","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-30T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212770617","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-27T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212812517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212900517","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612077517","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-03T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612213017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-13T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612342617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612371517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-06T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612391017","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612391217","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612581717","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406812342717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-25T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012467917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012930717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012176017","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-13T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012749417","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-22T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012823917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112089917","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112202917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112275417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112636117","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-09-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112654917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-15T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112758617","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-30T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112838117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-05T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212225417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-10T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212409417","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-21T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212437817","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-02T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212816717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-05T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312292917","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-04T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312581917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-25T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612215417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-17T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612244517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612324217","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-13T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612340117","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612391217","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-19T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612488517","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-15T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612542317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-18T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612583117","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-08T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612597217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-17T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612632517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612674417","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-28T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612697317","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506712638117","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-18T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012103617","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-13T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012783417","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507112232117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-26T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507212294017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-20T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312481617","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-10T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312804617","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-06T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907313114817","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-07T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907513323417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-26T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907513552917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-04T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907712567217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912098817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-13T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912181117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-17T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912356217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-01T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908312225217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-14T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412250117","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-07T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412296417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-02T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812370117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-06T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812467417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-10T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012412117","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012691217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-22T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012772317","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-27T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412104517","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-28T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412108317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-31T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412158317","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-13T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412162917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-16T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412514117","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-22T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007312227117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-25T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007312310317","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-23T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007712709917","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-20T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008412363017","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-04T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812094217","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-15T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812139417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202009412073817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-01-02T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202108412176817","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-03-09T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012348717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-26T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012694417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012694517","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109412200717","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-24T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208312079817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-05T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412264917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412656417","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412704417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-15T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208812488917","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-14T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202209012470917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-24T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202209012673117","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-13T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307312358617","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-18T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307513944317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-16T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307712444317","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-17T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307712810617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-29T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307912923117","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-30T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307913042617","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308312835017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-13T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412113517","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-20T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412761017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-29T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308812530017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309012456617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-13T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309012780917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309412156117","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-26T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407313369317","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-05T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407513973117","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912681717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-12T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912935317","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408112669317","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-08T00:00:00.000","complaint_precinct_code":"81","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312389217","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-09T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312477417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-10T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312845417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-21T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312865517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-28T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312869917","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-29T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312959417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-03T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312979117","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-11T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412248817","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-15T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412279517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-27T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412298817","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-13T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412330317","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-02T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412371517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-27T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507312346817","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-24T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912543717","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-19T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912573817","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-29T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912606817","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-10T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508312402717","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-05-07T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412278617","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412809917","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-30T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508812537517","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-28T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012435717","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-21T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509412201417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-31T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112154717","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-06T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112220917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112859817","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-14T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712139317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-15T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712174717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-15T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012139417","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-18T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012497017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-03T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901312175117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-02T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901413044417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-03T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000112245417","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-12T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000612477117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000712162017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001812252117","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112427017","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-15T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112757017","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112793717","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-14T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100512176917","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-08T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100612413017","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100612445417","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-19T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712186917","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712187017","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712241817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-08T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101312303217","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-04-26T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101312553617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101412385817","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-21T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101412978117","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-08T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101712402517","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-30T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101712518517","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-12-19T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112101017","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-13T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112106517","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112116617","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-19T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112129717","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-25T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112132417","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-26T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112212117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200512098817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-20T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712181317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712241817","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-22T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012118717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012180117","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-23T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012267317","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-20T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312096817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-12T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312356317","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-27T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312763617","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-30T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412273317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-25T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412328217","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-10T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201712105117","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-26T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201712180717","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-20T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201812221717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-03-03T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112220617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-28T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112765617","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112990717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300512248917","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-19T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300612527717","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-14T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312849917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-03T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312866717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312920417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-28T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301412377817","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-07T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301712176317","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-27T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301812411217","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-02T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112346217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-04-08T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112403717","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-26T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112489017","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-24T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512245417","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-03T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512329317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512436017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-15T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612289617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-06T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612531617","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612598217","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-06T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400912521117","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-10T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400912645317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-09T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012450217","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312153417","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-29T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312309317","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-22T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312664717","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-30T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401313012217","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-18T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401413766417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-16T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712252417","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-17T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712288917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-17T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712353517","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-08T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401812286117","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-07T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112087017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112146917","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-29T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112244617","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-06T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112515617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112770217","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-25T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612120117","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612526317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-12T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612565517","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-30T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612612117","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-24T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712347417","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712498017","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-20T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500912712717","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-04T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012116917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-03T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012182517","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-20T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012512417","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-17T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012553417","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-12T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501312236217","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-01T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501312353217","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412655017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412655117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413130317","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413433317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-19T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501712181917","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-07T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501812390617","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912231217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912232117","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912234417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912241717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912387417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012151217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412563417","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412611317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412641617","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902812176417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312091417","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-13T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903412620117","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-06T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903412664617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-28T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001912359517","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-25T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002012110917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-30T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002412493417","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-13T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002412572617","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-09T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002612310417","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-09-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202003412137417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-03T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101912398217","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-27T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101912903117","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-09T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012117017","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-08T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012389217","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-10T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102312493617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-05T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102412180417","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512556417","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-24T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512621817","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-15T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512625117","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-16T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512639817","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-22T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512650617","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-26T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512667817","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-03T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512723417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-27T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612190317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-22T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612190817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612219117","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-22T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102812300817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-23T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202103012120517","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-02-14T00:00:00.000","complaint_precinct_code":"30","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912561017","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912581317","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912598617","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-24T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912727017","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-04T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912809817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-30T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412126017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-06T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412150517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-20T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412154817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412154917","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412170017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412258917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-22T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412269717","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412292217","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-13T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412348817","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-14T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412488017","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412492917","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-08-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412493417","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-08-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202512119617","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-25T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202512162817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612109017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612204517","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-02T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612246917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-10T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612390017","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202812148417","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203312297717","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-09T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203412579917","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-15T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912270017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-14T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912423317","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912896317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-15T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912900517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912996317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-21T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913048817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-10T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913074117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913093517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012510017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-15T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302212088617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-14T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302212108517","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302412506417","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-14T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612152117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-16T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612422017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612436117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612477717","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-11T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202303312536917","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-17T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202303412253117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-17T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912144817","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-28T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912225417","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-03-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912281817","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-03-22T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912354817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912437317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912631017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912860717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012203817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012312117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-07-01T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012515917","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-10T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012549317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-12-02T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402212096217","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402212120917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412115317","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-28T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412351917","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-05T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412395917","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-08-01T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412578817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-20T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402512733917","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-10T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612141617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-05T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612174817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-04T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612379917","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612422717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202403412879117","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-24T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912148317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-01-28T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912222317","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912275117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-18T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912313017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912313117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912532217","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912789617","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012181317","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012436117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-06T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502212107517","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-10T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502212114217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-14T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412134917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-09T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412412717","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412417417","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-07-16T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412546217","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412586717","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-21T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412609717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-03T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612173917","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-03T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612228917","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-19T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612430717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502812473917","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-08-05T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202503412848517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-08T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412211717","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412247817","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-22T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412607917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-21T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212293317","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212454917","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-05T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911412118317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911412599717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-26T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911413095717","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-04T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911512903017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911513090217","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-27T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112114917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-13T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112357617","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-06T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011212356417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-21T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812262217","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-19T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812351717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812352617","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012416117","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012416317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012423617","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-02T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012426717","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-03T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012427217","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-03T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111112429217","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-22T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111212393717","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111412584617","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-01T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111413227517","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-11T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210412343917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210412384317","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-17T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210912925617","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-21T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211112242117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-16T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211512194217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-10T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310412788217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812245917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-15T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812370717","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-06T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310912324217","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-03-03T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012119917","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-15T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012141217","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-21T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012301117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-09T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012890217","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-18T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311212195917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-21T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311212313617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-01T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311412151817","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-23T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311413465117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513014017","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-30T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513062317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-13T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412077017","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-03T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412898917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-09T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412931417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-23T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812210917","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-27T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812802017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-09T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812964417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812999517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-27T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912402817","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-26T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912522917","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-27T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913255817","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-28T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913260017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-29T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913402917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-03T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411012608617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411013118317","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-20T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411112498717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212158117","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212467417","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212483017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-09-05T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212545217","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-10T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212616417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-19T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412410017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-27T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412523417","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-27T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412655117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-31T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512163417","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-26T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512208117","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-05T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512386517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-24T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412220417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-13T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412524417","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-13T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812692817","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812838217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-11-04T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812922017","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-09T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912380917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-24T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912501417","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-24T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510913055717","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510913406217","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-10T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012362317","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-28T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012370517","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012400217","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-08T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511013230317","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-09T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511112424117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212152717","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212155517","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212158817","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-13T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212182917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212186017","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212209117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212484717","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-09T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212704917","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-03T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511513213217","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-12-06T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511513223017","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-12-10T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910012328417","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-02T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910112649317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-24T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910212380117","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-08T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712182617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712201217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712594417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010112103217","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-19T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712091917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-13T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712131317","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-31T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712204017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-09T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712517617","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712518117","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712642717","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-19T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110112372817","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-14T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110212342517","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-25T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110212732117","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-14T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210112497617","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-30T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210212227417","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-13T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210312364217","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-14T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210312679117","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-19T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210512726617","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-26T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210712187017","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-02-24T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210712734317","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-06T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310212104617","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-16T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310512361017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-28T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310612953617","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-13T00:00:00.000","complaint_precinct_code":"106","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712177617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712357317","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-05-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712424217","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-26T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712770317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-12T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712845617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-09T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712929217","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410012224317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-17T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212226417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-02T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212266517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-18T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212483917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-11T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212649717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-16T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212746717","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-25T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212862817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410512480617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-10T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712480417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-14T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712549317","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-07-11T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712566517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-21T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712922517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411312807717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-27T00:00:00.000","complaint_precinct_code":"113","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510012233617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-15T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510112513717","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-18T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510212368817","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-07T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510312577417","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-05T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510512280417","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510512569317","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510712121717","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-22T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510712394617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112639917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-07T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904612620217","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-13T00:00:00.000","complaint_precinct_code":"46","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812757017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-22T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812845617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-21T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201905212482417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-05T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004412467317","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-25T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004412913817","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-01T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004512421317","complaint_year_number":"2020","month_number":"6","record_create_date":"2020-06-18T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004512685317","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-07T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202005012120817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-01-26T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202005012510717","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-09T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012330717","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-26T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012401617","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-06-04T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012112370517","complaint_year_number":"2020","month_number":"6","record_create_date":"2020-06-23T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012212345417","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-04T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104312188117","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-10T00:00:00.000","complaint_precinct_code":"43","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104713106317","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-02T00:00:00.000","complaint_precinct_code":"47","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104812391717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-12T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112012574617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-05T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112654017","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-10-12T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112717017","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-10T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112212207917","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112212677917","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-28T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204012862417","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-19T00:00:00.000","complaint_precinct_code":"40","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204013322517","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-31T00:00:00.000","complaint_precinct_code":"40","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204512373617","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012397617","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-14T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212314117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212372817","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-23T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212724617","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212312377417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-03T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304613195917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"46","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305012692517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213200317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-26T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112381517","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-14T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112454617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-13T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312212143917","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-09T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312312447217","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-21T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404212568617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"42","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404213039617","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"42","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404912490917","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-28T00:00:00.000","complaint_precinct_code":"49","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412012166517","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-31T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412012851617","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-23T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412112083917","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-05T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212211417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-16T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212353817","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-29T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212394717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-17T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212609417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412312161217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-28T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412312333117","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-15T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512202817","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-25T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512805217","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-29T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512940317","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-17T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512012414517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-18T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512012646017","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-23T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112543617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-07-19T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112581717","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-08-04T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112669117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212171217","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212189917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212352517","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-05T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212465517","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-05T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112640817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-08T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112653017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-14T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904412806417","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-21T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904512093117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-10T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812801517","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-07T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812811517","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-10T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812825617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-15T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112582217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-25T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612264317","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-05-02T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906812313617","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-05T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906812609417","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-26T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012188517","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012377817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112739717","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-15T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312839117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-16T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812264117","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-25T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812395217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412126817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-30T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412252917","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-08T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812112217","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-31T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412084317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-12T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412091217","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412229417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412480217","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-20T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910212216417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-18T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910512537817","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712191217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812517517","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-15T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812526917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812545017","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-30T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812641817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910912803517","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-15T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911012629817","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-17T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212343217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-04T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212345417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-07T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004413034117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-03T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012150017","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-06T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012212017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-06T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006112581117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-27T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007812077917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-06T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812085417","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-09T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202009012673117","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-01T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010012144317","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-12T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010112379517","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-14T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712132917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112093917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-24T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112312517","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-25T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112375117","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-21T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012085817","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-07T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012591217","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-13T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212287017","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-19T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212504117","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-30T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106712109717","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-13T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107612159617","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-12T00:00:00.000","complaint_precinct_code":"76","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012427617","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-04T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110412337517","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-30T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111112346017","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-17T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111212073717","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-02T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112012648217","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-05T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112347317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-24T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204912865217","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-04T00:00:00.000","complaint_precinct_code":"49","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012159417","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-19T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012649217","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-27T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112174317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-21T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112567817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-17T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612343317","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-09T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612630417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-08T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213222017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213226217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012479417","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-19T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612305817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-07T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307812576517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309412114117","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-30T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310412877817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-14T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712301017","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-06T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812678717","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-28T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812826417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513207117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-22T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312012905717","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-21T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202405012217217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-15T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112307017","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406312248717","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-04-01T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406312375117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409012768617","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-24T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409012875417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912073517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-01T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411112257517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-20T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112381617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-14T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412137517","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412278417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012729017","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-25T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012859117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-14T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412076117","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-03T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412105017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-17T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412137317","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912632517","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-27T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212459217","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-25T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212712017","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-07T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112120417","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-22T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112125917","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-24T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900612153717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712416717","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712505217","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712572817","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-07T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900912541517","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-30T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012103817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-24T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012610317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-12T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901812260517","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901812815517","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-11T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912226617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912350817","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-25T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912835917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012074117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-03T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012076117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-04T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902212103817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412242817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312203517","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-04T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000112180117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000512090517","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-13T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000512241617","complaint_year_number":"2020","month_number":"5","record_create_date":"2020-05-20T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000712108917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-27T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001312183717","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002612342817","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112755917","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712664517","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-12T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101413115417","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-12T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102212075817","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102212101117","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-08T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102312511717","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-12T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102412173717","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-25T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202103012093517","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-20T00:00:00.000","complaint_precinct_code":"30","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112942117","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-31T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200912796717","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-22T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412688017","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-02T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201413246817","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-28T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201413422217","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-04T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198617","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912215317","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912236017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202012317917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-12T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612199017","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612324817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-25T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112159917","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-03T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300612657317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312912617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-25T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301413488817","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-20T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301712524817","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-30T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912976017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012274117","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-06-02T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012440517","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-27T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012471417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012478017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-23T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612432717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-03T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400712199017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-19T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400712399517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-10T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012260617","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-05-07T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012260717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-07T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012552317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312554317","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-23T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401813225517","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-14T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912100117","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-12T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912504117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912506717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-14T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012269017","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412081017","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-05T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412509017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412511517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202403412103617","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-15T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500512185217","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-07T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500512635617","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-11T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612498217","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-29T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413327917","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-30T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501712109317","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912533017","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012190917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-26T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012269617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-16T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412188617","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612196517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900512257217","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-18T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901312880017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-26T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012611117","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-30T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312383317","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-27T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906312656817","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-29T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612347717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-24T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612480617","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-14T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112269717","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-04-12T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907512719217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012174317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-16T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012356917","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-08T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412503517","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-09T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412540317","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-23T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910512702117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-07T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812204617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-13T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911012419317","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-26T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912212334717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-10T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008412495517","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101812267917","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-20T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012242417","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-29T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107912842717","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-12T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110912895617","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-15T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312501217","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-19T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912717817","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-08-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012935917","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-28T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612431117","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206712321817","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-22T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212129717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212132317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212012812317","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-22T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012368017","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-08T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304812272017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-10T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304813023317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304813023417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112365817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-18T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112720317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212876317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212878717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-21T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012975917","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-05T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212820817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-05T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212824517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-07T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310012169617","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-14T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310212786417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712871217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311412664817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-28T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312012925717","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-26T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112809117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112815517","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-05T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400113102117","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401413048017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-04T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912421517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-15T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402312505517","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-07-05T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612655717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-06T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406812217617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-19T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012401217","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-08T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012866517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-23T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407712567817","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-26T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407712628217","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-23T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407812495917","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-12T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412471417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-12T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412609117","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-08T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412619417","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-12T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112209417","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-22T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412088117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-01-03T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912667817","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-10T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612104017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-29T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202503212412317","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-18T00:00:00.000","complaint_precinct_code":"32","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112451617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-16T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506812428217","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-23T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012894517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507712729017","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-03T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508812531517","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-24T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510212893117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-15T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812390317","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-16T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511413044117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-06T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212601417","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-21T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902512797017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-17T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112243017","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612502817","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112218917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-19T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012713017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-10-02T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112346817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-23T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112420417","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-27T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112660417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-11T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001312649417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-27T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001912730417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-29T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002512604117","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-24T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202003212159017","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"32","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612478217","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-22T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012216117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011212267617","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-04T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012102917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-14T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012283517","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, BY FIRE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012235517","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-25T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012237217","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-26T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107112261617","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-10T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200512446217","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200612506017","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712406717","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-02T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200912670117","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-24T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312414517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-05-19T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, BY FIRE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912197817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202012136917","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412171117","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203412193217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-28T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012166617","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-24T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012387117","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-09T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612578417","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207112335717","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-26T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412341117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-06-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-13T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212112673917","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-20T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300512307617","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-22T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312901417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302412611117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-15T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112745917","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012866117","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412766417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308812229517","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-21T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112208717","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407212362117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-10T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912733117","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-28T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712364917","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-05T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912766917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312373317","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-14T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812854017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-24T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"INVESTIGATION","offense_description":"INVESTIGATIONS/COMPLAINTS ONLY","pd_code_description":"INVESTIGATE CHILD ABUSE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112104017","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"VIOLATION","offense_description":"HARRASSMENT 2","pd_code_description":"HARASSMENT,SUBD 3,4,5","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112577217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-23T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112771317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"ROBBERY","pd_code_description":"ROBBERY,PERSONAL ELECTRONIC DEVICE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612528817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-11T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"VIOLATION","offense_description":"HARRASSMENT 2","pd_code_description":"HARASSMENT,SUBD 3,4,5","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612565017","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612592617","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-24T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"GRAND LARCENY","pd_code_description":"LARCENY,GRAND FROM PERSON,UNCL","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612645717","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-25T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612651617","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-30T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"MENACING,UNCLASSIFIED","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"}] diff --git a/backend/nyc_sample.json b/backend/nyc_sample.json new file mode 100644 index 0000000..efa6ff6 --- /dev/null +++ b/backend/nyc_sample.json @@ -0,0 +1,1000 @@ +[{"full_complaint_id":"201906012119317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012175717","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-25T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012180117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-27T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012273417","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-16T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012413717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-20T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012523617","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-31T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012616917","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-11T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906012762517","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-21T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112336617","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-18T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112366917","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-02T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112388617","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-14T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112480917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-03T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112732317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906212354417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906312261717","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-05-01T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612340517","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-19T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612501117","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-25T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612572617","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-10T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906712856617","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012369217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-07T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112834917","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907212157317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-17T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907212538417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-28T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812113917","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-29T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812572217","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-27T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012153917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006312172117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612157417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612384517","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612437417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006812511217","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-27T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012164217","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012209917","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-02-24T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012350017","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-30T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012395917","complaint_year_number":"2020","month_number":"5","record_create_date":"2020-05-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012576017","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012887617","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212105317","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-01-22T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212185817","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-07T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007212674817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-18T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106012215417","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-20T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106112663417","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212262717","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212715417","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106312289717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-22T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612112717","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-03T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612221117","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-23T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106612617417","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106812515417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-20T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106812599317","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-09T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107012930817","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107812535917","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-21T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012204617","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-07T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012207017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012210717","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-09T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112240217","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-24T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112254317","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112304217","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-24T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112312317","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112366417","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-23T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112662417","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206212775817","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612139117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612616817","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-11-01T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612642317","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-14T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612664617","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012367817","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012376217","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-09T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012413417","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012642417","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012699217","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012796917","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012878317","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-25T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207012905717","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207212434417","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-17T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012285217","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-02T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012342117","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-25T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012358417","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-05-01T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012418117","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012881217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-23T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112174617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-16T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112692417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112738017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212289117","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-04T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212841417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-07T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212941117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612079617","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612283717","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612408717","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612634417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-28T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012242117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-09T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012245217","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012292917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-27T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012806017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307112891917","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212744017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-30T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307812640517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-10T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012419617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-29T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012780417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-08T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406012795717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112142817","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-04T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112147517","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112174317","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112216517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112349017","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-09T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112376717","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112430717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112775817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-04T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112870417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212401517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-13T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212431117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-23T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212452717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-31T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212460417","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212616717","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-30T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212770617","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-27T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212812517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406212900517","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612077517","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-03T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612213017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-13T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612342617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612371517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-06T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612391017","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612391217","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-16T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612581717","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406812342717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-25T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012467917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012930717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012176017","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-13T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012749417","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-22T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506012823917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112089917","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112202917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112275417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-29T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112636117","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-09-08T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112654917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-15T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112758617","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-30T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112838117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-05T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212225417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-10T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212409417","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-21T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212437817","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-02T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506212816717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-05T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312292917","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-04T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312581917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-25T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612215417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-17T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612244517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612324217","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-13T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612340117","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-21T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612391217","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-19T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612488517","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-15T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612542317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-18T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612583117","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-08T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612597217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-17T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612632517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612674417","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-28T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506612697317","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506712638117","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-18T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012103617","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-13T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012783417","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507112232117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-26T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507212294017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-20T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312481617","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-10T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312804617","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-06T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907313114817","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-07T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907513323417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-26T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907513552917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-04T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907712567217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912098817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-13T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912181117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-17T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907912356217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-01T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908312225217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-14T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412250117","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-07T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412296417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-02T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812370117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-06T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812467417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-10T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012412117","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012691217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-22T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012772317","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-27T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412104517","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-28T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412108317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-31T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412158317","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-13T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412162917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-16T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412514117","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-22T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007312227117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-25T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007312310317","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-23T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007712709917","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-20T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008412363017","complaint_year_number":"2020","month_number":"8","record_create_date":"2020-08-04T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812094217","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-15T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812139417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202009412073817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-01-02T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202108412176817","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-03-09T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012348717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-26T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012694417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012694517","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-30T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109412200717","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-24T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208312079817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-05T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412264917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412656417","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412704417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-15T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208812488917","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-14T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202209012470917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-24T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202209012673117","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-13T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307312358617","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-18T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307513944317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-16T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307712444317","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-17T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307712810617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-29T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307912923117","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-30T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307913042617","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308312835017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-13T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412113517","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-20T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412761017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-29T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308812530017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309012456617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-13T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309012780917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309412156117","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-26T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407313369317","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-05T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407513973117","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912681717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-12T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912935317","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408112669317","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-08T00:00:00.000","complaint_precinct_code":"81","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312389217","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-09T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312477417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-10T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312845417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-21T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312865517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-28T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312869917","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-29T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312959417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-03T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408312979117","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-11T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412248817","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-15T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412279517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-27T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412298817","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-13T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412330317","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-02T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409412371517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-27T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507312346817","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-24T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912543717","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-19T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912573817","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-29T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507912606817","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-10T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508312402717","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-05-07T00:00:00.000","complaint_precinct_code":"83","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412278617","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412809917","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-30T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508812537517","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-28T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012435717","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-21T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509412201417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-31T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112154717","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-06T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112220917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112859817","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-14T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712139317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-15T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712174717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-15T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012139417","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-18T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012497017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-03T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901312175117","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-02T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901413044417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-03T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000112245417","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-12T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000612477117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000712162017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001812252117","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-04T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112427017","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-15T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112757017","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112793717","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-14T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100512176917","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-08T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100612413017","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100612445417","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-19T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712186917","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712187017","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712241817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-08T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101312303217","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-04-26T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101312553617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101412385817","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-21T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101412978117","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-08T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101712402517","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-30T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101712518517","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-12-19T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112101017","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-13T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112106517","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112116617","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-19T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112129717","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-25T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112132417","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-26T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112212117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200512098817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-20T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712181317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712241817","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-22T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012118717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012180117","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-23T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201012267317","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-20T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312096817","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-12T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312356317","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-27T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312763617","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-30T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412273317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-25T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412328217","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-10T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201712105117","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-26T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201712180717","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-20T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201812221717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-03-03T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112220617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-28T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112765617","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112990717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300512248917","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-19T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300612527717","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-14T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312849917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-03T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312866717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312920417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-28T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301412377817","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-07T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301712176317","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-27T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301812411217","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-02T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112346217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-04-08T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112403717","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-26T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400112489017","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-24T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512245417","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-03T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512329317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400512436017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-15T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612289617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-06T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612531617","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400612598217","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-06T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400912521117","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-10T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400912645317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-09T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012450217","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312153417","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-29T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312309317","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-22T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312664717","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-30T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401313012217","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-18T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401413766417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-16T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712252417","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-17T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712288917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-17T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401712353517","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-08T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401812286117","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-07T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112087017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-07T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112146917","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-29T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112244617","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-06T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112515617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112770217","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-25T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612120117","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612526317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-12T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612565517","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-30T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612612117","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-24T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712347417","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712498017","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-20T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500912712717","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-04T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012116917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-03T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012182517","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-20T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012512417","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-17T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501012553417","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-12T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501312236217","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-01T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501312353217","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412655017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412655117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413130317","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-22T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413433317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-19T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501712181917","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-07T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501812390617","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912231217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912232117","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912234417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912241717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912387417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012151217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412563417","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412611317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412641617","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902812176417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-07T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312091417","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-13T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903412620117","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-06T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903412664617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-28T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001912359517","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-25T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002012110917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-30T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002412493417","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-13T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002412572617","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-12-09T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002612310417","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-09-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202003412137417","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-03T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101912398217","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-27T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101912903117","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-09T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012117017","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-08T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012389217","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-10T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102312493617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-05T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102412180417","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512556417","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-24T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512621817","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-15T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512625117","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-16T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512639817","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-22T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512650617","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-26T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512667817","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-03T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102512723417","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-27T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612190317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-22T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612190817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102612219117","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-22T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102812300817","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-23T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202103012120517","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-02-14T00:00:00.000","complaint_precinct_code":"30","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912561017","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912581317","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912598617","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-24T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912727017","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-04T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912809817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-30T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412126017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-06T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412150517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-20T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412154817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412154917","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412170017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412258917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-22T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412269717","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412292217","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-13T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412348817","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-14T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412488017","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412492917","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-08-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412493417","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-08-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202512119617","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-01-25T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202512162817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612109017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612204517","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-02T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612246917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-10T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612390017","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-24T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202812148417","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203312297717","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-09T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203412579917","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-15T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912270017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-14T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912423317","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912896317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-15T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912900517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912996317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-21T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913048817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-10T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913074117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-19T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301913093517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012510017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-15T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302212088617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-14T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302212108517","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302412506417","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-14T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612152117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-16T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612422017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612436117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612477717","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-11T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202303312536917","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-17T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202303412253117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-17T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912144817","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-28T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912225417","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-03-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912281817","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-03-22T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912354817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912437317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912631017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912860717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-08T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012203817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012312117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-07-01T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012515917","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-10T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012549317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-12-02T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402212096217","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402212120917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412115317","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-28T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412351917","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-05T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412395917","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-08-01T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412578817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-20T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402512733917","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-10T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612141617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-05T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612174817","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-04T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612379917","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402612422717","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-31T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202403412879117","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-24T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912148317","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-01-28T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912222317","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912275117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-18T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912313017","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912313117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912532217","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912789617","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-26T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012181317","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012436117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-06T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502212107517","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-10T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502212114217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-14T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412134917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-09T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412412717","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412417417","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-07-16T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412546217","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-29T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412586717","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-21T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412609717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-03T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612173917","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-03T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612228917","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-19T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612430717","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502812473917","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-08-05T00:00:00.000","complaint_precinct_code":"28","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202503412848517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-08T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412211717","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412247817","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-22T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412607917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-21T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212293317","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212454917","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-05T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911412118317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911412599717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-26T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911413095717","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-04T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911512903017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911513090217","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-27T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112114917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-13T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112357617","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-06T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011212356417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-21T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812262217","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-19T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812351717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110812352617","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012416117","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012416317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012423617","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-02T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012426717","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-03T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111012427217","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-03T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111112429217","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-22T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111212393717","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111412584617","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-01T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111413227517","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-11T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210412343917","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-29T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210412384317","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-17T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210912925617","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-21T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211112242117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-16T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211512194217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-10T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310412788217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812245917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-15T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812370717","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-06T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310912324217","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-03-03T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012119917","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-15T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012141217","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-21T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012301117","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-09T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311012890217","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-18T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311212195917","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-21T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311212313617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-01T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311412151817","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-23T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311413465117","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513014017","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-30T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513062317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-13T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412077017","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-03T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412898917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-09T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410412931417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-23T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812210917","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-27T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812802017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-09T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812964417","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410812999517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-27T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912402817","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-26T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912522917","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-27T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913255817","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-28T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913260017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-29T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410913402917","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-03T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411012608617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-21T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411013118317","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-20T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411112498717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212158117","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212467417","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212483017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-09-05T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212545217","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-10T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411212616417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-19T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412410017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-27T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412523417","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-27T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411412655117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-31T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512163417","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-26T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512208117","complaint_year_number":"2024","month_number":"2","record_create_date":"2024-02-05T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411512386517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-24T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412220417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-13T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412524417","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-13T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812692817","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812838217","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-11-04T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812922017","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-09T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912380917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-24T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912501417","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-24T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510913055717","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510913406217","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-10T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012362317","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-28T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012370517","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-31T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511012400217","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-08T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511013230317","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-09T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511112424117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212152717","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212155517","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212158817","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-13T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212182917","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-26T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212186017","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212209117","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-11T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212484717","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-09T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212704917","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-03T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511513213217","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-12-06T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511513223017","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-12-10T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910012328417","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-02T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910112649317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-24T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910212380117","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-08T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712182617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712201217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712594417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010112103217","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-19T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712091917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-13T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712131317","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-31T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712204017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-09T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712517617","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712518117","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712642717","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-19T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110112372817","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-14T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110212342517","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-25T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110212732117","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-14T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210112497617","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-30T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210212227417","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-13T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210312364217","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-14T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210312679117","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-19T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210512726617","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-26T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210712187017","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-02-24T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202210712734317","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-06T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310212104617","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-16T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310512361017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-28T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310612953617","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-13T00:00:00.000","complaint_precinct_code":"106","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712177617","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712357317","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-05-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712424217","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-26T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712770317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-12T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712845617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-09T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712929217","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-15T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410012224317","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-17T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212226417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-02T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212266517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-18T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212483917","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-11T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212649717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-16T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212746717","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-25T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410212862817","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410512480617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-10T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712480417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-14T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712549317","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-07-11T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712566517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-21T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410712922517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-16T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411312807717","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-27T00:00:00.000","complaint_precinct_code":"113","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510012233617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-15T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510112513717","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-18T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510212368817","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-07T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510312577417","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-05T00:00:00.000","complaint_precinct_code":"103","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510512280417","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510512569317","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510712121717","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-22T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510712394617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-10T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112639917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-07T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904612620217","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-13T00:00:00.000","complaint_precinct_code":"46","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812757017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-22T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812845617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-21T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201905212482417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-05T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004412467317","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-25T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004412913817","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-01T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004512421317","complaint_year_number":"2020","month_number":"6","record_create_date":"2020-06-18T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004512685317","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-07T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202005012120817","complaint_year_number":"2020","month_number":"12","record_create_date":"2020-01-26T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202005012510717","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-09T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012330717","complaint_year_number":"2020","month_number":"4","record_create_date":"2020-04-26T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012401617","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-06-04T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012112370517","complaint_year_number":"2020","month_number":"6","record_create_date":"2020-06-23T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012212345417","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-04T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104312188117","complaint_year_number":"2021","month_number":"2","record_create_date":"2021-02-10T00:00:00.000","complaint_precinct_code":"43","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104713106317","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-02T00:00:00.000","complaint_precinct_code":"47","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202104812391717","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-12T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112012574617","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-05T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112654017","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-10-12T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112717017","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-10T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112212207917","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-30T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112212677917","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-28T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204012862417","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-19T00:00:00.000","complaint_precinct_code":"40","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204013322517","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-31T00:00:00.000","complaint_precinct_code":"40","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204512373617","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012397617","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-14T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212314117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-05-25T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212372817","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-23T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212212724617","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212312377417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-03T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304613195917","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"46","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305012692517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-08T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213200317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-26T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112381517","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-14T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112454617","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-13T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312212143917","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-09T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312312447217","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-21T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404212568617","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"42","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404213039617","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-15T00:00:00.000","complaint_precinct_code":"42","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202404912490917","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-28T00:00:00.000","complaint_precinct_code":"49","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412012166517","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-31T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412012851617","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-23T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412112083917","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-05T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212211417","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-16T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212353817","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-29T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212394717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-17T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412212609417","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412312161217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-28T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202412312333117","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-15T00:00:00.000","complaint_precinct_code":"123","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512202817","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-25T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512805217","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-29T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202504512940317","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-17T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512012414517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-18T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512012646017","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-23T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112543617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-07-19T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112581717","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-08-04T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512112669117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-11T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212171217","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-28T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212189917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-11T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212352517","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-05T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212465517","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-05T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"MISCELLANEOUS PENAL LAW","pd_code_description":"AGGRAVATED HARASSMENT 1","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112640817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-08T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904112653017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-14T00:00:00.000","complaint_precinct_code":"41","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904412806417","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-21T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904512093117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-10T00:00:00.000","complaint_precinct_code":"45","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812801517","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-07T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812811517","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-10T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812825617","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-15T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112582217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-25T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612264317","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-05-02T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906812313617","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-05T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906812609417","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-26T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012188517","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-18T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907012377817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-10T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112739717","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-15T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907312839117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-16T00:00:00.000","complaint_precinct_code":"73","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812264117","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-25T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907812395217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412126817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-30T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908412252917","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-08T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201908812112217","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-31T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412084317","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-12T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412091217","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412229417","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909412480217","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-20T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910212216417","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-18T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910512537817","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-17T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910712191217","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812517517","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-15T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812526917","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-20T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812545017","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-30T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812641817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910912803517","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-15T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911012629817","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-17T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212343217","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-04T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911212345417","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-07T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202004413034117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-03T00:00:00.000","complaint_precinct_code":"44","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012150017","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-06T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006012212017","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-06T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006112581117","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-27T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007812077917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-06T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008812085417","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-09T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202009012673117","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-01T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010012144317","complaint_year_number":"2020","month_number":"3","record_create_date":"2020-03-12T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010112379517","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-14T00:00:00.000","complaint_precinct_code":"101","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202010712132917","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-01T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112093917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-24T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112312517","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-25T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011112375117","complaint_year_number":"2020","month_number":"11","record_create_date":"2020-11-21T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012085817","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-07T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012591217","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-13T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212287017","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-19T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106212504117","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-30T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202106712109717","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-13T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107612159617","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-12T00:00:00.000","complaint_precinct_code":"76","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202109012427617","complaint_year_number":"2021","month_number":"7","record_create_date":"2021-07-04T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110412337517","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-30T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111112346017","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-17T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202111212073717","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-02T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112012648217","complaint_year_number":"2021","month_number":"9","record_create_date":"2021-09-05T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202112112347317","complaint_year_number":"2021","month_number":"5","record_create_date":"2021-05-24T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202204912865217","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-04T00:00:00.000","complaint_precinct_code":"49","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012159417","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-19T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012649217","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-27T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112174317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-21T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206112567817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-17T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612343317","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-09T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612630417","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-08T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213222017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202305213226217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"52","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306012479417","complaint_year_number":"2023","month_number":"6","record_create_date":"2023-06-19T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306612305817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-07T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307812576517","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-27T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202309412114117","complaint_year_number":"2023","month_number":"1","record_create_date":"2023-01-30T00:00:00.000","complaint_precinct_code":"94","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310412877817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-14T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712301017","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-06T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812678717","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-28T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310812826417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311513207117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-22T00:00:00.000","complaint_precinct_code":"115","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312012905717","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-21T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202405012217217","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-15T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112307017","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-04-19T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406312248717","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-04-01T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406312375117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409012768617","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-24T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202409012875417","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-12-12T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202410912073517","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-01T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202411112257517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-20T00:00:00.000","complaint_precinct_code":"111","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112381617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-14T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412137517","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508412278417","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-04-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012729017","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-25T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202509012859117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-14T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412076117","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-03T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412105017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-17T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510412137317","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510912632517","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-27T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212459217","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-25T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511212712017","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-07T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112120417","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-22T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900112125917","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-24T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900612153717","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712416717","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-25T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712505217","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-22T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900712572817","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-07T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900912541517","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-30T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012103817","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-24T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901012610317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-12T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901812260517","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-11T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901812815517","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-11T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912226617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-05T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912350817","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-25T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901912835917","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012074117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-03T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012076117","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-04T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902212103817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902412242817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312203517","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-04T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000112180117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000512090517","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-13T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000512241617","complaint_year_number":"2020","month_number":"5","record_create_date":"2020-05-20T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202000712108917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-27T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001312183717","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-09T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002612342817","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-06T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100112755917","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-30T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202100712664517","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-12T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101413115417","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-12T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102212075817","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-18T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102212101117","complaint_year_number":"2021","month_number":"12","record_create_date":"2021-12-08T00:00:00.000","complaint_precinct_code":"22","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102312511717","complaint_year_number":"2021","month_number":"8","record_create_date":"2021-08-12T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102412173717","complaint_year_number":"2021","month_number":"3","record_create_date":"2021-03-25T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202103012093517","complaint_year_number":"2021","month_number":"1","record_create_date":"2021-01-20T00:00:00.000","complaint_precinct_code":"30","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200112942117","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-31T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200912796717","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-22T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201412688017","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-02T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201413246817","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-28T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201413422217","complaint_year_number":"2022","month_number":"11","record_create_date":"2022-11-04T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198617","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912215317","complaint_year_number":"2022","month_number":"1","record_create_date":"2022-02-23T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912236017","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202012317917","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-12T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612199017","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-27T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202612324817","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-25T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300112159917","complaint_year_number":"2023","month_number":"2","record_create_date":"2023-02-03T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300612657317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312912617","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-25T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301413488817","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-20T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301712524817","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-30T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301912976017","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012274117","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-06-02T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012440517","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-27T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012471417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-18T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012478017","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-23T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302612432717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-03T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400712199017","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-19T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400712399517","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-10T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012260617","complaint_year_number":"2024","month_number":"4","record_create_date":"2024-05-07T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012260717","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-07T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401012552317","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-08T00:00:00.000","complaint_precinct_code":"10","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401312554317","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-23T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401813225517","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-14T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912100117","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-12T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912504117","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-13T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912506717","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-14T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402012269017","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-03T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412081017","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-01-05T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412186517","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-17T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412509017","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402412511517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-12T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202403412103617","complaint_year_number":"2024","month_number":"1","record_create_date":"2024-01-15T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500512185217","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-07T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500512635617","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-11T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500612498217","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-29T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501413327917","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-30T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501712109317","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-01T00:00:00.000","complaint_precinct_code":"17","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912533017","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-20T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012190917","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-26T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502012269617","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-16T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502412188617","complaint_year_number":"2025","month_number":"3","record_create_date":"2025-03-10T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612196517","complaint_year_number":"2025","month_number":"4","record_create_date":"2025-04-23T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF 4TH, GRAFFIT","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201900512257217","complaint_year_number":"2019","month_number":"4","record_create_date":"2019-04-18T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201901312880017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-26T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902012611117","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-30T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201903312383317","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-27T00:00:00.000","complaint_precinct_code":"33","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906312656817","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-29T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612347717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-24T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612480617","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-14T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112269717","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-04-12T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907512719217","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-09T00:00:00.000","complaint_precinct_code":"75","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012174317","complaint_year_number":"2019","month_number":"2","record_create_date":"2019-02-16T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012356917","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-08T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412503517","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-09T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910412540317","complaint_year_number":"2019","month_number":"7","record_create_date":"2019-07-23T00:00:00.000","complaint_precinct_code":"104","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910512702117","complaint_year_number":"2019","month_number":"8","record_create_date":"2019-08-07T00:00:00.000","complaint_precinct_code":"105","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201910812204617","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-13T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201911012419317","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-26T00:00:00.000","complaint_precinct_code":"110","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912212334717","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-10T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202008412495517","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-23T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202101812267917","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-20T00:00:00.000","complaint_precinct_code":"18","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012242417","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-29T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107912842717","complaint_year_number":"2021","month_number":"11","record_create_date":"2021-11-12T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202110912895617","complaint_year_number":"2021","month_number":"10","record_create_date":"2021-10-15T00:00:00.000","complaint_precinct_code":"109","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312501217","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-19T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912717817","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-08-01T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206012935917","complaint_year_number":"2022","month_number":"12","record_create_date":"2022-12-28T00:00:00.000","complaint_precinct_code":"60","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612431117","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206712321817","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-22T00:00:00.000","complaint_precinct_code":"67","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212129717","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212132317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-14T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212012812317","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-22T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302012368017","complaint_year_number":"2023","month_number":"8","record_create_date":"2023-08-08T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304812272017","complaint_year_number":"2023","month_number":"3","record_create_date":"2023-03-10T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304813023317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202304813023417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112365817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-18T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112720317","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212876317","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306212878717","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-21T00:00:00.000","complaint_precinct_code":"62","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012975917","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-05T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212820817","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-05T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307212824517","complaint_year_number":"2023","month_number":"12","record_create_date":"2023-12-07T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310012169617","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-14T00:00:00.000","complaint_precinct_code":"100","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310212786417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-19T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202310712871217","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"107","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202311412664817","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-28T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312012925717","complaint_year_number":"2023","month_number":"9","record_create_date":"2023-09-26T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112809117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-02T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202312112815517","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-05T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202400113102117","complaint_year_number":"2024","month_number":"12","record_create_date":"2024-12-16T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401413048017","complaint_year_number":"2024","month_number":"7","record_create_date":"2024-07-04T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202401912421517","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-15T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202402312505517","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-07-05T00:00:00.000","complaint_precinct_code":"23","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406612655717","complaint_year_number":"2024","month_number":"11","record_create_date":"2024-11-06T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406812217617","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-19T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012401217","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-08T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407012866517","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-23T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407712567817","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-26T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407712628217","complaint_year_number":"2024","month_number":"9","record_create_date":"2024-09-23T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407812495917","complaint_year_number":"2024","month_number":"10","record_create_date":"2024-10-12T00:00:00.000","complaint_precinct_code":"78","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412471417","complaint_year_number":"2024","month_number":"6","record_create_date":"2024-06-12T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412609117","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-08T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202408412619417","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-12T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500112209417","complaint_year_number":"2025","month_number":"2","record_create_date":"2025-02-22T00:00:00.000","complaint_precinct_code":"1","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501412088117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-01-03T00:00:00.000","complaint_precinct_code":"14","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912667817","complaint_year_number":"2025","month_number":"8","record_create_date":"2025-08-10T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202502612104017","complaint_year_number":"2025","month_number":"1","record_create_date":"2025-01-29T00:00:00.000","complaint_precinct_code":"26","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202503212412317","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-18T00:00:00.000","complaint_precinct_code":"32","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506112451617","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-16T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506812428217","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-23T00:00:00.000","complaint_precinct_code":"68","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507012894517","complaint_year_number":"2025","month_number":"11","record_create_date":"2025-11-06T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 3 & 2, OF M","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202507712729017","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-03T00:00:00.000","complaint_precinct_code":"77","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202508812531517","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-24T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510212893117","complaint_year_number":"2025","month_number":"12","record_create_date":"2025-12-15T00:00:00.000","complaint_precinct_code":"102","patrol_borough_name":"PATROL BORO QUEENS SOUTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202510812390317","complaint_year_number":"2025","month_number":"5","record_create_date":"2025-05-16T00:00:00.000","complaint_precinct_code":"108","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202511413044117","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-06T00:00:00.000","complaint_precinct_code":"114","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MIS 2 & 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202512212601417","complaint_year_number":"2025","month_number":"10","record_create_date":"2025-10-21T00:00:00.000","complaint_precinct_code":"122","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"FELONY","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF,CRIMINAL, UNCL 2ND","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201902512797017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-17T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112243017","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612502817","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-26T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201907112218917","complaint_year_number":"2019","month_number":"3","record_create_date":"2019-03-19T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201909012713017","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-10-02T00:00:00.000","complaint_precinct_code":"90","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112346817","complaint_year_number":"2019","month_number":"5","record_create_date":"2019-05-23T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112420417","complaint_year_number":"2019","month_number":"6","record_create_date":"2019-06-27T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201912112660417","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-11T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001312649417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-27T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202001912730417","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-29T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202002512604117","complaint_year_number":"2020","month_number":"9","record_create_date":"2020-09-24T00:00:00.000","complaint_precinct_code":"25","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202003212159017","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-12T00:00:00.000","complaint_precinct_code":"32","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202006612478217","complaint_year_number":"2020","month_number":"10","record_create_date":"2020-10-22T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202007012216117","complaint_year_number":"2020","month_number":"2","record_create_date":"2020-02-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202011212267617","complaint_year_number":"2020","month_number":"7","record_create_date":"2020-07-04T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202012012102917","complaint_year_number":"2020","month_number":"1","record_create_date":"2020-01-14T00:00:00.000","complaint_precinct_code":"120","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202102012283517","complaint_year_number":"2021","month_number":"6","record_create_date":"2021-06-19T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, BY FIRE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012235517","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-25T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202105012237217","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-26T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202107112261617","complaint_year_number":"2021","month_number":"4","record_create_date":"2021-04-10T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200512446217","complaint_year_number":"2022","month_number":"8","record_create_date":"2022-08-26T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200612506017","complaint_year_number":"2022","month_number":"7","record_create_date":"2022-07-31T00:00:00.000","complaint_precinct_code":"6","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200712406717","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-02T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202200912670117","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-24T00:00:00.000","complaint_precinct_code":"9","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201312414517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-05-19T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, BY FIRE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912197817","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202201912198517","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202012136917","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-17T00:00:00.000","complaint_precinct_code":"20","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202202412171117","complaint_year_number":"2022","month_number":"3","record_create_date":"2022-03-04T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202203412193217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-28T00:00:00.000","complaint_precinct_code":"34","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012166617","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-24T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202205012387117","complaint_year_number":"2022","month_number":"6","record_create_date":"2022-06-09T00:00:00.000","complaint_precinct_code":"50","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202206612578417","complaint_year_number":"2022","month_number":"10","record_create_date":"2022-10-12T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202207112335717","complaint_year_number":"2022","month_number":"4","record_create_date":"2022-04-26T00:00:00.000","complaint_precinct_code":"71","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202208412341117","complaint_year_number":"2022","month_number":"5","record_create_date":"2022-06-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130017","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130117","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130217","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-12T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202211212130317","complaint_year_number":"2022","month_number":"2","record_create_date":"2022-02-13T00:00:00.000","complaint_precinct_code":"112","patrol_borough_name":"PATROL BORO QUEENS NORTH","county":"QUEENS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"MISCHIEF, CRIMINAL 4, OF MOTOR","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202212112673917","complaint_year_number":"2022","month_number":"9","record_create_date":"2022-09-20T00:00:00.000","complaint_precinct_code":"121","patrol_borough_name":"PATROL BORO STATEN ISLAND","county":"RICHMOND","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202300512307617","complaint_year_number":"2023","month_number":"5","record_create_date":"2023-05-22T00:00:00.000","complaint_precinct_code":"5","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202301312901417","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-20T00:00:00.000","complaint_precinct_code":"13","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202302412611117","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-15T00:00:00.000","complaint_precinct_code":"24","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202306112745917","complaint_year_number":"2023","month_number":"11","record_create_date":"2023-11-11T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202307012866117","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-10-26T00:00:00.000","complaint_precinct_code":"70","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308412766417","complaint_year_number":"2023","month_number":"10","record_create_date":"2023-11-01T00:00:00.000","complaint_precinct_code":"84","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202308812229517","complaint_year_number":"2023","month_number":"4","record_create_date":"2023-04-21T00:00:00.000","complaint_precinct_code":"88","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202406112208717","complaint_year_number":"2024","month_number":"3","record_create_date":"2024-03-06T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407212362117","complaint_year_number":"2024","month_number":"5","record_create_date":"2024-05-10T00:00:00.000","complaint_precinct_code":"72","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202407912733117","complaint_year_number":"2024","month_number":"8","record_create_date":"2024-08-28T00:00:00.000","complaint_precinct_code":"79","patrol_borough_name":"PATROL BORO BKLYN NORTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202500712364917","complaint_year_number":"2025","month_number":"7","record_create_date":"2025-07-05T00:00:00.000","complaint_precinct_code":"7","patrol_borough_name":"PATROL BORO MAN SOUTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202501912766917","complaint_year_number":"2025","month_number":"9","record_create_date":"2025-09-17T00:00:00.000","complaint_precinct_code":"19","patrol_borough_name":"PATROL BORO MAN NORTH","county":"NEW YORK","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"202506312373317","complaint_year_number":"2025","month_number":"6","record_create_date":"2025-06-14T00:00:00.000","complaint_precinct_code":"63","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"CRIMINAL MISCHIEF & RELATED OF","pd_code_description":"CRIMINAL MISCHIEF,UNCLASSIFIED 4","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201904812854017","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-24T00:00:00.000","complaint_precinct_code":"48","patrol_borough_name":"PATROL BORO BRONX","county":"BRONX","law_code_category_description":"INVESTIGATION","offense_description":"INVESTIGATIONS/COMPLAINTS ONLY","pd_code_description":"INVESTIGATE CHILD ABUSE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112104017","complaint_year_number":"2019","month_number":"1","record_create_date":"2019-01-17T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"VIOLATION","offense_description":"HARRASSMENT 2","pd_code_description":"HARASSMENT,SUBD 3,4,5","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112577217","complaint_year_number":"2019","month_number":"9","record_create_date":"2019-09-23T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906112771317","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-31T00:00:00.000","complaint_precinct_code":"61","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"ROBBERY","pd_code_description":"ROBBERY,PERSONAL ELECTRONIC DEVICE","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612528817","complaint_year_number":"2019","month_number":"10","record_create_date":"2019-10-11T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"VIOLATION","offense_description":"HARRASSMENT 2","pd_code_description":"HARASSMENT,SUBD 3,4,5","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612565017","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-05T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612592617","complaint_year_number":"2019","month_number":"11","record_create_date":"2019-11-24T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"FELONY","offense_description":"GRAND LARCENY","pd_code_description":"LARCENY,GRAND FROM PERSON,UNCL","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612645717","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-25T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"ASSAULT 3","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"} +,{"full_complaint_id":"201906612651617","complaint_year_number":"2019","month_number":"12","record_create_date":"2019-12-30T00:00:00.000","complaint_precinct_code":"66","patrol_borough_name":"PATROL BORO BKLYN SOUTH","county":"KINGS","law_code_category_description":"MISDEMEANOR","offense_description":"ASSAULT 3 & RELATED OFFENSES","pd_code_description":"MENACING,UNCLASSIFIED","bias_motive_description":"ANTI-JEWISH","offense_category":"Religion/Religious Practice"}] diff --git a/backend/out.json b/backend/out.json new file mode 100644 index 0000000..18d9b32 --- /dev/null +++ b/backend/out.json @@ -0,0 +1 @@ +{"callsign": "JWZ7", "country": "N625GN", "lng": -111.914754, "lat": 33.620235, "alt": 0, "heading": 0, "type": "tracked_flight", "origin_loc": null, "dest_loc": null, "origin_name": "UNKNOWN", "dest_name": "UNKNOWN", "registration": "N625GN", "model": "GLF5", "icao24": "a82973", "speed_knots": 6.8, "squawk": "1200", "airline_code": "", "aircraft_category": "plane", "alert_operator": "Tilman Fertitta", "alert_category": "People", "alert_color": "pink", "trail": [[33.62024, -111.91475, 0, 1772302052]]} \ No newline at end of file diff --git a/backend/out_liveua.json b/backend/out_liveua.json new file mode 100644 index 0000000..661cd6b --- /dev/null +++ b/backend/out_liveua.json @@ -0,0 +1,2159 @@ +{ + "last": 0, + "venues": [ + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822678, + "time": "1 day ago", + "name": "At Pokrovsk direction clashes yesterday near Rodynske, Kotlyne, Molodetske, Udachne, Novomykolayivka, Muravka, Filiya and towards towns Bilytske, Hryshyne, Novopidhorodnye, Novooleksandrivka and Novopavlivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15749", + "lat": "48.13278", + "lng": "36.80197", + "picture": "https://liveuamap.com/pics/2026/02/26/22822678_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772092800, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 91, + "lat": 48.35095, + "lng": 37.20807 + }, + { + "id": 92, + "lat": 48.25176, + "lng": 37.04408 + }, + { + "id": 93, + "lat": 48.23766, + "lng": 36.93701 + }, + { + "id": 94, + "lat": 48.24269, + "lng": 36.99881 + }, + { + "id": 95, + "lat": 48.19145, + "lng": 36.91551 + }, + { + "id": 96, + "lat": 48.17749, + "lng": 36.89464 + }, + { + "id": 97, + "lat": 48.0812, + "lng": 36.7491 + }, + { + "id": 98, + "lat": 48.40529, + "lng": 37.2028 + }, + { + "id": 99, + "lat": 48.33324, + "lng": 37.10905 + }, + { + "id": 100, + "lat": 48.23887, + "lng": 36.912 + }, + { + "id": 101, + "lat": 48.20403, + "lng": 36.97509 + }, + { + "id": 102, + "lat": 48.13278, + "lng": 36.80197 + } + ], + "link": "https://liveuamap.com/en/2026/26-february-08-at-pokrovsk-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Dnipropetrovsk region", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822680, + "time": "1 day ago", + "name": "At Kostiantynivka direction clashes yesterday near Kostyantynivka, Ivanopillya, Illinivka, Berestok, Rusyn Yar, Stepanivka, Novopavlivka and Sofiyivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15748", + "lat": "48.48937", + "lng": "37.38446", + "picture": "https://liveuamap.com/pics/2026/02/26/22822680_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772092800, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 103, + "lat": 48.52243, + "lng": 37.74508 + }, + { + "id": 104, + "lat": 48.47334, + "lng": 37.76227 + }, + { + "id": 105, + "lat": 48.47228, + "lng": 37.69389 + }, + { + "id": 106, + "lat": 48.46452, + "lng": 37.51093 + }, + { + "id": 107, + "lat": 48.46019, + "lng": 37.63208 + }, + { + "id": 108, + "lat": 48.51064, + "lng": 37.41759 + }, + { + "id": 109, + "lat": 48.48937, + "lng": 37.38446 + } + ], + "link": "https://liveuamap.com/en/2026/26-february-08-at-kostiantynivka-direction-clashes-yesterday", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-1", + "picpath_over": "bomb-1", + "id": 22822681, + "time": "1 day ago", + "name": "Russian aviation conducted airstrikes at Luzhky of Sumy region, Pokrovske, Havrylivka, Orly, Velykomykhaylivka of Dnipropetrovsk region, Ostrovske, Charivne, Zaliznychne, Trudove, Svitla Dolyna, Vozdvyzhivka, Huliaipilske, Dolynka, Kopani, Lubytske, Tersyanka of Zaporizhzhia region, - General Staff of Armed Forces of Ukraine reports ", + "source": "https://t.me/lumsrc/15742", + "lat": "47.88116", + "lng": "35.8889", + "picture": "https://liveuamap.com/pics/2026/02/26/22822681_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772092800, + "color_id": 1, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 14, + "lat": 51.79264, + "lng": 34.14362 + }, + { + "id": 15, + "lat": 47.97976, + "lng": 36.23068 + }, + { + "id": 16, + "lat": 48.07053, + "lng": 36.52079 + }, + { + "id": 17, + "lat": 48.03025, + "lng": 36.39513 + }, + { + "id": 18, + "lat": 47.96822, + "lng": 36.46311 + }, + { + "id": 19, + "lat": 47.96719, + "lng": 35.85285 + }, + { + "id": 20, + "lat": 47.57643, + "lng": 36.04013 + }, + { + "id": 21, + "lat": 47.63904, + "lng": 36.16991 + }, + { + "id": 22, + "lat": 47.95179, + "lng": 36.01439 + }, + { + "id": 23, + "lat": 47.87287, + "lng": 35.97508 + }, + { + "id": 24, + "lat": 47.74289, + "lng": 36.08456 + }, + { + "id": 25, + "lat": 47.61269, + "lng": 36.0585 + }, + { + "id": 26, + "lat": 47.70354, + "lng": 36.01936 + }, + { + "id": 27, + "lat": 47.68691, + "lng": 36.02417 + }, + { + "id": 28, + "lat": 47.76475, + "lng": 35.94624 + }, + { + "id": 29, + "lat": 47.88116, + "lng": 35.8889 + } + ], + "link": "https://liveuamap.com/en/2026/26-february-08-russian-aviation-conducted-airstrikes-at-luzhky", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Zaporizhia Oblast, Ukraine", + "keywords": "ampamp", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822682, + "time": "1 day ago", + "name": "At Sloviansk direction clashes yesterday near Yampil and Platonivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15746", + "lat": "48.89397", + "lng": "38.00995", + "picture": "https://liveuamap.com/pics/2026/02/26/22822682_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772092800, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 110, + "lat": 48.92715, + "lng": 37.93802 + }, + { + "id": 111, + "lat": 48.89397, + "lng": 38.00995 + } + ], + "link": "https://liveuamap.com/en/2026/26-february-08-at-sloviansk-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "aa-2", + "picpath_over": "aa-2", + "id": 22822667, + "time": "1 day ago", + "name": "Overnight Russia launched 2 hypersonic missiles Tsyrkon, 11 Iskander-M/S-400 ballistic missiles, 24 cruise missiles Kh-101, 2 Kh-59/69 aviation missiles and 420 drones of different types, - Ukrainian Air Force ", + "source": "https://t.me/kpszsu/56598", + "lat": "50.45051", + "lng": "29.99268", + "picture": "https://liveuamap.com/pics/2026/02/26/22822667_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772093700, + "color_id": 2, + "cat_id": 42, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-08-overnight-russia-launched-2-hypersonic-missiles", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Kyiv", + "keywords": "ampamp, ampamp, ampampn", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "speech-1", + "picpath_over": "speech-1", + "id": 22822688, + "time": "1 day ago", + "name": "Putin met with Lukashenka in Kremlin", + "source": "https://t.me/tassovkaru/67078", + "lat": "55.75022", + "lng": "37.61478", + "picture": "https://liveuamap.com/pics/2026/02/26/22822688_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772104860, + "color_id": 1, + "cat_id": 14, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 3, + "lat": 55.75022, + "lng": 37.61478 + } + ], + "link": "https://liveuamap.com/en/2026/26-february-11-putin-met-with-lukashenka-in-kremlin", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Belarus\",\"link\":\"https:\\/\\/belarus.liveuamap.com\",\"id\":31},{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18}]", + "location": "Moskva, Moscow", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "dead-2", + "picpath_over": "dead-2", + "id": 22822689, + "time": "1 day ago", + "name": "Russia returned 1000 bodies of the fallen servicemen to Ukraine", + "source": "https://t.me/ukrinform_news/159466", + "lat": "51.52431", + "lng": "29.00665", + "picture": "https://liveuamap.com/pics/2026/02/26/22822689_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772106420, + "color_id": 2, + "cat_id": 7, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [ + "https://liveuamap.com/pics/2026/02/26/22822689_1.jpg", + "https://liveuamap.com/pics/2026/02/26/22822689_2.jpg" + ], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-11-russia-returned-1000-bodies-of-the-fallen", + "images": [ + {}, + {}, + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Zhytomyr Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "destroy-2", + "picpath_over": "destroy-2", + "id": 22822703, + "time": "1 day ago", + "name": "Satellite images showing Dorogobuzh chemical plant was completely destroyed as result of Ukrainian drone strike", + "source": "https://t.me/kiber_boroshno/12600", + "lat": "54.94786", + "lng": "33.36796", + "picture": "", + "twitpic": "", + "lang": null, + "video": "https://livemapmedia.com/v/#kiber_boroshno_12600", + "gi": 0, + "videotype": 5, + "timestamp": 1772115420, + "color_id": 2, + "cat_id": 37, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-14-satellite-images-showing-dorogobuzh-chemical", + "images": [ + {}, + {} + ], + "otherregions": "[{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18}]", + "location": "Smolensk region", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": "https://livemapmedia.com/v/#kiber_boroshno_12600", + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-1", + "picpath_over": "bomb-1", + "id": 22822710, + "time": "1 day ago", + "name": "2 people killed, 1 wounded as result of airstrikes in Druzhkivka", + "source": "https://t.me/Operatyvnyi_Donbas/133365", + "lat": "48.61534", + "lng": "37.53531", + "picture": "https://liveuamap.com/pics/2026/02/26/22822710_0.jpeg", + "twitpic": "", + "lang": null, + "video": "https://livemapmedia.com/v/#Operatyvnyi_Donbas_133365", + "gi": 0, + "videotype": 5, + "timestamp": 1772119440, + "color_id": 1, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [ + "https://liveuamap.com/pics/2026/02/26/22822710_1.jpeg", + "https://liveuamap.com/pics/2026/02/26/22822710_2.jpeg", + "https://liveuamap.com/pics/2026/02/26/22822710_3.jpeg", + "https://liveuamap.com/pics/2026/02/26/22822710_4.jpeg", + "https://liveuamap.com/pics/2026/02/26/22822710_5.jpeg" + ], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-15-2-people-killed-1-wounded-as-result-of-airstrikes", + "images": [ + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Druzhkivka", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": "https://livemapmedia.com/v/#Operatyvnyi_Donbas_133365", + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-1", + "picpath_over": "bomb-1", + "id": 22822711, + "time": "1 day ago", + "name": "Explosions were reported in Sumy", + "source": "https://t.me/suspilnenews/63599", + "lat": "50.90284", + "lng": "34.82838", + "picture": "", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772119500, + "color_id": 1, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-15-explosions-were-reported-in-sumy", + "images": [ + {}, + {} + ], + "otherregions": "[{\"name\":\"Central and Eastern Europe\",\"link\":\"https:\\/\\/cee.liveuamap.com\",\"id\":129},{\"name\":\"Europe\",\"link\":\"https:\\/\\/europe.liveuamap.com\",\"id\":10}]", + "location": "Sumy, Sums'ka oblast", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-2", + "picpath_over": "bomb-2", + "id": 22822751, + "time": "1 day ago", + "name": "Explosions were reported in Belgorod", + "source": "https://t.me/supernova_plus/48708", + "lat": "50.59381", + "lng": "36.614", + "picture": "https://liveuamap.com/pics/2026/02/26/22822751_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772140380, + "color_id": 2, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [ + "https://liveuamap.com/pics/2026/02/26/22822751_1.jpg" + ], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-21-explosions-were-reported-in-belgorod", + "images": [ + {}, + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18},{\"name\":\"Central and Eastern Europe\",\"link\":\"https:\\/\\/cee.liveuamap.com\",\"id\":129}]", + "location": "Belgorod, Belgorodskaya oblast'", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-2", + "picpath_over": "bomb-2", + "id": 22822839, + "time": "1 day ago", + "name": "Fire at the oil depot in Luhansk after explosions", + "source": "https://t.me/supernova_plus/48724", + "lat": "48.51618", + "lng": "39.29629", + "picture": "https://liveuamap.com/pics/2026/02/27/22822839_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772149320, + "color_id": 2, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/26-february-23-fire-at-the-oil-depot-in-luhansk-after-explosions", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Central and Eastern Europe\",\"link\":\"https:\\/\\/cee.liveuamap.com\",\"id\":129},{\"name\":\"Energy\",\"link\":\"https:\\/\\/energy.liveuamap.com\",\"id\":143}]", + "location": "Luhans'k, Luhans'ka oblast", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "aa-2", + "picpath_over": "aa-2", + "id": 22822761, + "time": "1 day ago", + "name": "Russia launched 187 drones overnight, - Ukrainian Air Force ", + "source": "https://t.me/kpszsu/56649", + "lat": "49.12422", + "lng": "35.01343", + "picture": "https://liveuamap.com/pics/2026/02/27/22822761_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772173980, + "color_id": 2, + "cat_id": 42, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/27-february-06-russia-launched-187-drones-overnight--ukrainian", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Dnipropetrovsk Oblast, Ukraine", + "keywords": "ampamp, ampamp, ampampn", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822825, + "time": "23 hour ago", + "name": "At Pokrovsk direction clashes yesterday near Rodynske, Pokrovsk, Kotlyne, Molodetske, Udachne, Muravka, Filiya and towards Bilytske, Shevchenko, Hryshyne, Serhiyivka, Novopidhorodnye, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15762", + "lat": "48.24175", + "lng": "36.91259", + "picture": "https://liveuamap.com/pics/2026/02/27/22822825_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 35, + "lat": 48.35091, + "lng": 37.20778 + }, + { + "id": 36, + "lat": 48.28435, + "lng": 37.17842 + }, + { + "id": 37, + "lat": 48.24653, + "lng": 37.05465 + }, + { + "id": 38, + "lat": 48.23875, + "lng": 36.9393 + }, + { + "id": 39, + "lat": 48.24276, + "lng": 36.98324 + }, + { + "id": 40, + "lat": 48.17721, + "lng": 36.89587 + }, + { + "id": 41, + "lat": 48.08131, + "lng": 36.7527 + }, + { + "id": 42, + "lat": 48.40472, + "lng": 37.1973 + }, + { + "id": 43, + "lat": 48.37337, + "lng": 37.1283 + }, + { + "id": 44, + "lat": 48.33563, + "lng": 37.10907 + }, + { + "id": 45, + "lat": 48.28882, + "lng": 36.93937 + }, + { + "id": 46, + "lat": 48.24175, + "lng": 36.91259 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-pokrovsk-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822826, + "time": "23 hour ago", + "name": "At Kursk and North Slobozhansky(Sumy) direction Ukrainian forces have repelled 1 Russian army assault, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15765", + "lat": "51.07669", + "lng": "35.31343", + "picture": "https://liveuamap.com/pics/2026/02/27/22822826_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 128, + "lat": 51.07669, + "lng": 35.31343 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-kursk-and-north-slobozhanskysumy-direction", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Kursk", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822827, + "time": "23 hour ago", + "name": "At Huliaipole direction clashes yesterday near Dobropillya, Huliaipole and towards Zaliznychne, Staroukrayinka, Hirke, Varvarivka, Olenokostyantynivka, Svyatopetrivka, Charivne, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15764", + "lat": "47.56951", + "lng": "36.06076", + "picture": "https://liveuamap.com/pics/2026/02/27/22822827_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 129, + "lat": 47.65905, + "lng": 36.23703 + }, + { + "id": 130, + "lat": 47.7793, + "lng": 36.18891 + }, + { + "id": 131, + "lat": 47.65559, + "lng": 36.17074 + }, + { + "id": 132, + "lat": 47.67027, + "lng": 36.15615 + }, + { + "id": 133, + "lat": 47.6683, + "lng": 36.11649 + }, + { + "id": 134, + "lat": 47.73314, + "lng": 36.18003 + }, + { + "id": 135, + "lat": 47.72461, + "lng": 36.17875 + }, + { + "id": 136, + "lat": 47.68613, + "lng": 36.15273 + }, + { + "id": 137, + "lat": 47.56951, + "lng": 36.06076 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-huliaipole-direction-clashes-yesterday", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Zaporizhzhia", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822828, + "time": "23 hour ago", + "name": "At Oleksandrivka direction clashes yesterday near Ternove, Zlahoda and towards Verbove, Vyshneve, Oleksandrohrad, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15763", + "lat": "47.82044", + "lng": "36.33363", + "picture": "https://liveuamap.com/pics/2026/02/27/22822828_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 138, + "lat": 47.87665, + "lng": 36.53126 + }, + { + "id": 139, + "lat": 47.9712, + "lng": 36.61932 + }, + { + "id": 140, + "lat": 47.8729, + "lng": 36.39295 + }, + { + "id": 141, + "lat": 47.87095, + "lng": 36.33424 + }, + { + "id": 142, + "lat": 47.82044, + "lng": 36.33363 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-oleksandrivka-direction-clashes-yesterday", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Zaporizhia Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822829, + "time": "23 hour ago", + "name": "At Kostiantynivka direction clashes yesterday near Oleksandro-Shultyne, Scherbynivka, Pleschiyivka, Rusyn Yar and towards Kostyantynivka, Ivanopillya, Illinivka, Berestok, Stepanivka, Sofiyivka, Novopavlivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15761", + "lat": "48.51514", + "lng": "37.42132", + "picture": "https://liveuamap.com/pics/2026/02/27/22822829_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 47, + "lat": 48.50126, + "lng": 37.81065 + }, + { + "id": 48, + "lat": 48.42085, + "lng": 37.79026 + }, + { + "id": 49, + "lat": 48.45628, + "lng": 37.78191 + }, + { + "id": 50, + "lat": 48.45461, + "lng": 37.55751 + }, + { + "id": 51, + "lat": 48.51138, + "lng": 37.75641 + }, + { + "id": 52, + "lat": 48.47124, + "lng": 37.76224 + }, + { + "id": 53, + "lat": 48.48023, + "lng": 37.66611 + }, + { + "id": 54, + "lat": 48.47109, + "lng": 37.6941 + }, + { + "id": 55, + "lat": 48.46097, + "lng": 37.62114 + }, + { + "id": 56, + "lat": 48.48821, + "lng": 37.39088 + }, + { + "id": 57, + "lat": 48.51514, + "lng": 37.42132 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-kostiantynivka-direction-clashes-yesterday", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822831, + "time": "23 hour ago", + "name": "At Kupyansk direction clashes yesterday near Kruhlyakivka and towards Kurylivka, Bohuslavka, Novoplatonivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15757", + "lat": "49.42428", + "lng": "37.67332", + "picture": "https://liveuamap.com/pics/2026/02/27/22822831_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 58, + "lat": 49.52355, + "lng": 37.71572 + }, + { + "id": 59, + "lat": 49.6502, + "lng": 37.71332 + }, + { + "id": 60, + "lat": 49.48487, + "lng": 37.70336 + }, + { + "id": 61, + "lat": 49.42428, + "lng": 37.67332 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-kupyansk-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Kharkiv Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822832, + "time": "23 hour ago", + "name": "At Kramatorsk direction clashes yesterday near Orikhovo-Vasylivka and Bondarne, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15760", + "lat": "48.74263", + "lng": "37.93888", + "picture": "https://liveuamap.com/pics/2026/02/27/22822832_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 143, + "lat": 48.67885, + "lng": 37.88773 + }, + { + "id": 144, + "lat": 48.74138, + "lng": 37.92927 + }, + { + "id": 145, + "lat": 48.67536, + "lng": 37.88601 + }, + { + "id": 146, + "lat": 48.74263, + "lng": 37.93888 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-kramatorsk-direction-clashes-yesterday", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822833, + "time": "23 hour ago", + "name": "At South Slobozhansky(Kharkiv) direction clashes yesterday near Starytsya, Pischane, Kruhle, Nesterne, Chuhunivka and towards Zelene, Okhrimivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15756", + "lat": "50.3412", + "lng": "37.21756", + "picture": "https://liveuamap.com/pics/2026/02/27/22822833_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 62, + "lat": 50.23877, + "lng": 36.79476 + }, + { + "id": 63, + "lat": 50.42658, + "lng": 37.36725 + }, + { + "id": 64, + "lat": 50.42035, + "lng": 37.41703 + }, + { + "id": 65, + "lat": 50.42243, + "lng": 37.38613 + }, + { + "id": 66, + "lat": 50.17637, + "lng": 37.62302 + }, + { + "id": 67, + "lat": 50.21516, + "lng": 36.58928 + }, + { + "id": 68, + "lat": 50.3412, + "lng": 37.21756 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-south-slobozhanskykharkiv-direction-clashes", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Vovchansk", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822834, + "time": "23 hour ago", + "name": "At Sloviansk direction clashes yesterday near Yampil, Zakitne and towards Ray-Oleksandrivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15759", + "lat": "48.89036", + "lng": "37.97974", + "picture": "https://liveuamap.com/pics/2026/02/27/22822834_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 147, + "lat": 48.92466, + "lng": 37.92686 + }, + { + "id": 148, + "lat": 48.80734, + "lng": 37.9315 + }, + { + "id": 149, + "lat": 48.89036, + "lng": 37.97974 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-sloviansk-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "ak-1", + "picpath_over": "ak-1", + "id": 22822836, + "time": "23 hour ago", + "name": "At Lyman direction clashes yesterday near Chervonyi Stav, Novoyehorivka, Drobysheve, Stavky, Lyman and near Zarichne, Novoselivka, - General Staff of Armed Forces of Ukraine reports", + "source": "https://t.me/lumsrc/15758", + "lat": "49.06983", + "lng": "37.70198", + "picture": "https://liveuamap.com/pics/2026/02/27/22822836_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 25, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 150, + "lat": 49.04846, + "lng": 37.84773 + }, + { + "id": 151, + "lat": 49.3285, + "lng": 37.92824 + }, + { + "id": 152, + "lat": 49.28302, + "lng": 37.86596 + }, + { + "id": 153, + "lat": 48.97305, + "lng": 37.84687 + }, + { + "id": 154, + "lat": 49.01539, + "lng": 37.92377 + }, + { + "id": 155, + "lat": 49.06983, + "lng": 37.70198 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-at-lyman-direction-clashes-yesterday-near", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Donetsk Oblast, Ukraine", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-1", + "picpath_over": "bomb-1", + "id": 22822842, + "time": "23 hour ago", + "name": "Russian aviation conducted airstrikes at Oleksandrohrad of Donetsk region, Ivanivka, Lisne, Malomykhaylivka, Pysantsi, Pokrovske of Dnipropetrovsk region, Verkhnya Tersa, Tersyanka, Zelene, Shevchenkivske, Vozdvyzhivka, Dolynka, Kopani, Orikhiv, Preobrazhenka, Veselyanka of Zaporizhzhia region, - General Staff of Armed Forces of Ukraine reports ", + "source": "https://t.me/lumsrc/15755", + "lat": "47.67814", + "lng": "35.37872", + "picture": "https://liveuamap.com/pics/2026/02/27/22822842_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772179200, + "color_id": 1, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 156, + "lat": 47.99016, + "lng": 36.5328 + }, + { + "id": 157, + "lat": 48.09627, + "lng": 36.62662 + }, + { + "id": 158, + "lat": 47.97556, + "lng": 36.60739 + }, + { + "id": 159, + "lat": 48.08752, + "lng": 36.41247 + }, + { + "id": 160, + "lat": 47.94651, + "lng": 36.18176 + }, + { + "id": 161, + "lat": 47.9718, + "lng": 36.21677 + }, + { + "id": 162, + "lat": 47.69109, + "lng": 36.07704 + }, + { + "id": 163, + "lat": 47.87702, + "lng": 35.88684 + }, + { + "id": 164, + "lat": 47.70587, + "lng": 36.19446 + }, + { + "id": 165, + "lat": 47.93156, + "lng": 36.0585 + }, + { + "id": 166, + "lat": 47.74536, + "lng": 36.08151 + }, + { + "id": 167, + "lat": 47.70633, + "lng": 36.02829 + }, + { + "id": 168, + "lat": 47.68785, + "lng": 36.02451 + }, + { + "id": 169, + "lat": 47.56637, + "lng": 35.79483 + }, + { + "id": 170, + "lat": 47.58258, + "lng": 35.78762 + }, + { + "id": 171, + "lat": 47.67814, + "lng": 35.37872 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-russian-aviation-conducted-airstrikes-at-oleksandrohrad", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[]", + "location": "Zaporizhzhia", + "keywords": "ampamp", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "speech-5", + "picpath_over": "speech-5", + "id": 22822848, + "time": "23 hour ago", + "name": "Another IAEA-brokered local ceasefire is now in effect to enable restoration of the 330 kV backup power supply to the Zaporizhzhya Nuclear Power Plant. \u201cDemining activities are ongoing to ensure safe access for the repair teams,\u201d Director General @RafaelMGrossi said", + "source": "https://x.com/iaeaorg/status/2027297416555135465", + "lat": "47.50845", + "lng": "34.5932", + "picture": "", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772180340, + "color_id": 5, + "cat_id": 14, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 176, + "lat": 47.50845, + "lng": 34.5932 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-08-another-iaeabrokered-local-ceasefire-is-now", + "images": [ + {}, + {} + ], + "otherregions": "[{\"name\":\"Energy\",\"link\":\"https:\\/\\/energy.liveuamap.com\",\"id\":143}]", + "location": "Enerhodar,Zaporiz'ka oblast", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-2", + "picpath_over": "bomb-2", + "id": 22822840, + "time": "21 hour ago", + "name": "General Staff of Armed Forces of Ukraine confirmed strikes at the oil depot in Luhansk, also oil depot near Mariupol, Novotoretske and Koptieve ", + "source": "https://t.me/GeneralStaffZSU/35482", + "lat": "48.51656", + "lng": "39.29681", + "picture": "https://liveuamap.com/pics/2026/02/27/22822840_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772186940, + "color_id": 2, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 10, + "lat": 48.58131, + "lng": 39.32661 + }, + { + "id": 11, + "lat": 48.51656, + "lng": 39.29681 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-10-general-staff-of-armed-forces-of-ukraine-confirmed", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Energy\",\"link\":\"https:\\/\\/energy.liveuamap.com\",\"id\":143}]", + "location": "Luhans'k, Luhans'ka oblast", + "keywords": "ampamp, ampamp, ampampn", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "explode-1", + "picpath_over": "explode-1", + "id": 22822844, + "time": "21 hour ago", + "name": "Explosions were reported in Kursk", + "source": "https://t.me/supernova_plus/48730", + "lat": "51.72929", + "lng": "36.19154", + "picture": "https://liveuamap.com/pics/2026/02/27/22822844_0.jpeg", + "twitpic": "", + "lang": null, + "video": "https://livemapmedia.com/v/#supernova_plus_48730", + "gi": 0, + "videotype": 5, + "timestamp": 1772189340, + "color_id": 1, + "cat_id": 26, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [ + "https://liveuamap.com/pics/2026/02/27/22822844_1.jpeg", + "https://liveuamap.com/pics/2026/02/27/22822844_2.jpeg", + "https://liveuamap.com/pics/2026/02/27/22822844_3.jpeg", + "https://liveuamap.com/pics/2026/02/27/22822844_4.jpeg", + "https://liveuamap.com/pics/2026/02/27/22822844_5.jpeg", + "https://liveuamap.com/pics/2026/02/27/22822844_6.jpeg" + ], + "points": [], + "link": "https://liveuamap.com/en/2026/27-february-10-explosions-were-reported-in-kursk", + "images": [ + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18}]", + "location": "Kursk,Kurskaya oblast'", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": "https://livemapmedia.com/v/#supernova_plus_48730", + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "air_alert-1", + "picpath_over": "air_alert-1", + "id": 22822850, + "time": "20 hour ago", + "name": "A missile alert was declared for the first time in the Sverdlovsk region.", + "source": "https://t.me/ejdailyru/386224", + "lat": "56.81315", + "lng": "60.5539", + "picture": "", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772190780, + "color_id": 1, + "cat_id": 105, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [ + { + "id": 11, + "lat": 56.81315, + "lng": 60.5539 + } + ], + "link": "https://liveuamap.com/en/2026/27-february-11-a-missile-alert-was-declared-for-the-first", + "images": [ + {}, + {} + ], + "otherregions": "[{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18}]", + "location": "Yekaterinburg, Sverdlovskaya oblast'", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-2", + "picpath_over": "bomb-2", + "id": 22822889, + "time": "14 hour ago", + "name": "Explosions were reported in Belgorod ", + "source": "https://t.me/exilenova_plus/16815", + "lat": "50.50449", + "lng": "36.57743", + "picture": "https://liveuamap.com/pics/2026/02/27/22822889_0.jpg", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772211900, + "color_id": 2, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/27-february-17-explosions-were-reported-in-belgorod-", + "images": [ + {}, + {}, + {} + ], + "otherregions": "[{\"name\":\"Russia\",\"link\":\"https:\\/\\/russia.liveuamap.com\",\"id\":18}]", + "location": "Belgorod", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + }, + { + "picpath": "bomb-1", + "picpath_over": "bomb-1", + "id": 22822924, + "time": "12 hour ago", + "name": "Explosions were reported in Zaporizhzhia", + "source": "https://t.me/zaporizka_sish/97252", + "lat": "47.85408", + "lng": "35.17822", + "picture": "", + "twitpic": "", + "lang": null, + "video": "", + "gi": 0, + "videotype": 0, + "timestamp": 1772219160, + "color_id": 1, + "cat_id": 27, + "status_id": 0, + "description": "", + "udescription": "", + "picw": 39, + "pich": 39, + "picwo": 49, + "picho": 49, + "picx": 0, + "picy": 0, + "picxo": 0, + "picyo": 0, + "ps": [], + "points": [], + "link": "https://liveuamap.com/en/2026/27-february-19-explosions-were-reported-in-zaporizhzhia", + "images": [ + {}, + {} + ], + "otherregions": "[]", + "location": "Zaporizhzhia, Zaporiz'ka oblast", + "keywords": "", + "resource": 0, + "langs": "", + "langNames": [], + "runway": null, + "moreSources": [], + "videocode": null, + "target": null, + "sel_link": null, + "img_share": "" + } + ], + "fields": [], + "datats": 1772265250, + "datac": "28", + "datamn": "February", + "datam": "February", + "datay": "2026", + "amount": 30, + "globaltime": 1772265250 +} \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..91beed8 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "backend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "ws": "^8.19.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..4414d1d --- /dev/null +++ b/backend/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ws": "^8.19.0" + } +} diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..0624188 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,10 @@ +fastapi==0.103.1 +uvicorn==0.23.2 +yfinance>=0.2.40 +feedparser==6.0.10 +requests==2.31.0 +apscheduler==3.10.3 +pydantic==2.3.0 +pydantic-settings==2.0.3 +playwright>=1.58.0 +beautifulsoup4>=4.12.0 diff --git a/backend/seattle_sample.json b/backend/seattle_sample.json new file mode 100644 index 0000000..7bf97de --- /dev/null +++ b/backend/seattle_sample.json @@ -0,0 +1,8 @@ +{ + "code" : "dataset.missing", + "error" : true, + "message" : "Not found", + "data" : { + "id" : "xqwu-hwdm" + } +} diff --git a/backend/services/__init__.py b/backend/services/__init__.py new file mode 100644 index 0000000..005d550 --- /dev/null +++ b/backend/services/__init__.py @@ -0,0 +1 @@ +# Empty init diff --git a/backend/services/ais_cache.json.REMOVED.git-id b/backend/services/ais_cache.json.REMOVED.git-id new file mode 100644 index 0000000..0a5e1e6 --- /dev/null +++ b/backend/services/ais_cache.json.REMOVED.git-id @@ -0,0 +1 @@ +83ba61e7af89c1dc7b4d9b972e08d3edf3493966 \ No newline at end of file diff --git a/backend/services/ais_stream.py b/backend/services/ais_stream.py new file mode 100644 index 0000000..34abe10 --- /dev/null +++ b/backend/services/ais_stream.py @@ -0,0 +1,359 @@ +""" +AIS Stream WebSocket client for real-time maritime vessel tracking. +Connects to aisstream.io and maintains a live dictionary of global vessel positions. +""" + +import asyncio +import json +import logging +import threading +import time +from datetime import datetime, timezone +import os + +logger = logging.getLogger(__name__) + +AIS_WS_URL = "wss://stream.aisstream.io/v0/stream" +API_KEY = os.environ.get("AIS_API_KEY", "75cc39af03c9cc23c90e8a7b3c3bc2b2a507c5fb") + +# AIS vessel type code classification +# See: https://coast.noaa.gov/data/marinecadastre/ais/VesselTypeCodes2018.pdf +def classify_vessel(ais_type: int, mmsi: int) -> str: + """Classify a vessel by its AIS type code into a rendering category.""" + if 80 <= ais_type <= 89: + return "tanker" # Oil/Chemical/Gas tankers → RED + if 70 <= ais_type <= 79: + return "cargo" # Cargo ships, container vessels → RED + if 60 <= ais_type <= 69: + return "passenger" # Cruise ships, ferries → GRAY + if ais_type in (36, 37): + return "yacht" # Sailing/Pleasure craft → DARK BLUE + if ais_type == 35: + return "military_vessel" # Military → YELLOW + # MMSI-based military detection: military MMSIs often start with certain prefixes + mmsi_str = str(mmsi) + if mmsi_str.startswith("3380") or mmsi_str.startswith("3381"): + return "military_vessel" # US Navy + if ais_type in (30, 31, 32, 33, 34): + return "other" # Fishing, towing, dredging, diving, etc. + if ais_type in (50, 51, 52, 53, 54, 55, 56, 57, 58, 59): + return "other" # Pilot, SAR, tug, port tender, etc. + return "unknown" # Not yet classified — will update when ShipStaticData arrives + + +# MMSI Maritime Identification Digit (MID) → Country mapping +# First 3 digits of MMSI (for 9-digit MMSIs) encode the flag state +MID_COUNTRY = { + 201: "Albania", 202: "Andorra", 203: "Austria", 204: "Portugal", 205: "Belgium", + 206: "Belarus", 207: "Bulgaria", 208: "Vatican", 209: "Cyprus", 210: "Cyprus", + 211: "Germany", 212: "Cyprus", 213: "Georgia", 214: "Moldova", 215: "Malta", + 216: "Armenia", 218: "Germany", 219: "Denmark", 220: "Denmark", 224: "Spain", + 225: "Spain", 226: "France", 227: "France", 228: "France", 229: "Malta", + 230: "Finland", 231: "Faroe Islands", 232: "United Kingdom", 233: "United Kingdom", + 234: "United Kingdom", 235: "United Kingdom", 236: "Gibraltar", 237: "Greece", + 238: "Croatia", 239: "Greece", 240: "Greece", 241: "Greece", 242: "Morocco", + 243: "Hungary", 244: "Netherlands", 245: "Netherlands", 246: "Netherlands", + 247: "Italy", 248: "Malta", 249: "Malta", 250: "Ireland", 251: "Iceland", + 252: "Liechtenstein", 253: "Luxembourg", 254: "Monaco", 255: "Portugal", + 256: "Malta", 257: "Norway", 258: "Norway", 259: "Norway", 261: "Poland", + 263: "Portugal", 264: "Romania", 265: "Sweden", 266: "Sweden", 267: "Slovakia", + 268: "San Marino", 269: "Switzerland", 270: "Czech Republic", 271: "Turkey", + 272: "Ukraine", 273: "Russia", 274: "North Macedonia", 275: "Latvia", + 276: "Estonia", 277: "Lithuania", 278: "Slovenia", + 301: "Anguilla", 303: "Alaska", 304: "Antigua", 305: "Antigua", + 306: "Netherlands Antilles", 307: "Aruba", 308: "Bahamas", 309: "Bahamas", + 310: "Bermuda", 311: "Bahamas", 312: "Belize", 314: "Barbados", 316: "Canada", + 319: "Cayman Islands", 321: "Costa Rica", 323: "Cuba", 325: "Dominica", + 327: "Dominican Republic", 329: "Guadeloupe", 330: "Grenada", 331: "Greenland", + 332: "Guatemala", 334: "Honduras", 336: "Haiti", 338: "United States", + 339: "Jamaica", 341: "Saint Kitts", 343: "Saint Lucia", 345: "Mexico", + 347: "Martinique", 348: "Montserrat", 350: "Nicaragua", 351: "Panama", + 352: "Panama", 353: "Panama", 354: "Panama", 355: "Panama", + 356: "Panama", 357: "Panama", 358: "Puerto Rico", 359: "El Salvador", + 361: "Saint Pierre", 362: "Trinidad", 364: "Turks and Caicos", + 366: "United States", 367: "United States", 368: "United States", 369: "United States", + 370: "Panama", 371: "Panama", 372: "Panama", 373: "Panama", + 374: "Panama", 375: "Saint Vincent", 376: "Saint Vincent", 377: "Saint Vincent", + 378: "British Virgin Islands", 379: "US Virgin Islands", + 401: "Afghanistan", 403: "Saudi Arabia", 405: "Bangladesh", 408: "Bahrain", + 410: "Bhutan", 412: "China", 413: "China", 414: "China", + 416: "Taiwan", 417: "Sri Lanka", 419: "India", 422: "Iran", + 423: "Azerbaijan", 425: "Iraq", 428: "Israel", 431: "Japan", + 432: "Japan", 434: "Turkmenistan", 436: "Kazakhstan", 437: "Uzbekistan", + 438: "Jordan", 440: "South Korea", 441: "South Korea", 443: "Palestine", + 445: "North Korea", 447: "Kuwait", 450: "Lebanon", 451: "Kyrgyzstan", + 453: "Macao", 455: "Maldives", 457: "Mongolia", 459: "Nepal", + 461: "Oman", 463: "Pakistan", 466: "Qatar", 468: "Syria", + 470: "UAE", 472: "Tajikistan", 473: "Yemen", 475: "Tonga", + 477: "Hong Kong", 478: "Bosnia", + 501: "Antarctica", 503: "Australia", 506: "Myanmar", + 508: "Brunei", 510: "Micronesia", 511: "Palau", 512: "New Zealand", + 514: "Cambodia", 515: "Cambodia", 516: "Christmas Island", + 518: "Cook Islands", 520: "Fiji", 523: "Cocos Islands", + 525: "Indonesia", 529: "Kiribati", 531: "Laos", 533: "Malaysia", + 536: "Northern Mariana Islands", 538: "Marshall Islands", + 540: "New Caledonia", 542: "Niue", 544: "Nauru", 546: "French Polynesia", + 548: "Philippines", 553: "Papua New Guinea", 555: "Pitcairn", + 557: "Solomon Islands", 559: "American Samoa", 561: "Samoa", + 563: "Singapore", 564: "Singapore", 565: "Singapore", 566: "Singapore", + 567: "Thailand", 570: "Tonga", 572: "Tuvalu", 574: "Vietnam", + 576: "Vanuatu", 577: "Vanuatu", 578: "Wallis and Futuna", + 601: "South Africa", 603: "Angola", 605: "Algeria", 607: "Benin", + 609: "Botswana", 610: "Burundi", 611: "Cameroon", 612: "Cape Verde", + 613: "Central African Republic", 615: "Congo", 616: "Comoros", + 617: "DR Congo", 618: "Ivory Coast", 619: "Djibouti", + 620: "Egypt", 621: "Equatorial Guinea", 622: "Ethiopia", + 624: "Eritrea", 625: "Gabon", 626: "Gambia", 627: "Ghana", + 629: "Guinea", 630: "Guinea-Bissau", 631: "Kenya", 632: "Lesotho", + 633: "Liberia", 634: "Liberia", 635: "Liberia", 636: "Liberia", + 637: "Libya", 642: "Madagascar", 644: "Malawi", 645: "Mali", + 647: "Mauritania", 649: "Mauritius", 650: "Mozambique", + 654: "Namibia", 655: "Niger", 656: "Nigeria", 657: "Guinea", + 659: "Rwanda", 660: "Senegal", 661: "Sierra Leone", + 662: "Somalia", 663: "South Africa", 664: "Sudan", + 667: "Tanzania", 668: "Togo", 669: "Tunisia", 670: "Uganda", + 671: "Egypt", 672: "Tanzania", 674: "Zambia", 675: "Zimbabwe", + 676: "Comoros", 677: "Tanzania", +} + +def get_country_from_mmsi(mmsi: int) -> str: + """Look up flag state from MMSI Maritime Identification Digit.""" + mmsi_str = str(mmsi) + if len(mmsi_str) == 9: + mid = int(mmsi_str[:3]) + return MID_COUNTRY.get(mid, "UNKNOWN") + return "UNKNOWN" + + +# Global vessel store: MMSI → vessel dict +_vessels: dict[int, dict] = {} +_vessels_lock = threading.Lock() +_ws_thread: threading.Thread | None = None +_ws_running = False + +import os +CACHE_FILE = os.path.join(os.path.dirname(__file__), "ais_cache.json") + + +def _save_cache(): + """Save vessel data to disk for persistence across restarts.""" + try: + with _vessels_lock: + # Convert int keys to strings for JSON + data = {str(k): v for k, v in _vessels.items()} + with open(CACHE_FILE, 'w') as f: + json.dump(data, f) + logger.info(f"AIS cache saved: {len(data)} vessels") + except Exception as e: + logger.error(f"Failed to save AIS cache: {e}") + + +def _load_cache(): + """Load vessel data from disk on startup.""" + global _vessels + if not os.path.exists(CACHE_FILE): + return + try: + with open(CACHE_FILE, 'r') as f: + data = json.load(f) + now = time.time() + stale_cutoff = now - 3600 # Accept vessels up to 1 hour old on restart + loaded = 0 + with _vessels_lock: + for k, v in data.items(): + if v.get("_updated", 0) > stale_cutoff: + _vessels[int(k)] = v + loaded += 1 + logger.info(f"AIS cache loaded: {loaded} vessels from disk") + except Exception as e: + logger.error(f"Failed to load AIS cache: {e}") + + +def get_ais_vessels() -> list[dict]: + """Return a snapshot of tracked AIS vessels, excluding 'other' type, pruning stale.""" + now = time.time() + stale_cutoff = now - 900 # 15 minutes + + with _vessels_lock: + # Prune stale vessels + stale_keys = [k for k, v in _vessels.items() if v.get("_updated", 0) < stale_cutoff] + for k in stale_keys: + del _vessels[k] + + result = [] + for mmsi, v in _vessels.items(): + v_type = v.get("type", "unknown") + # Skip 'other' vessels (fishing, tug, pilot, etc.) to reduce load + if v_type == "other": + continue + # Skip vessels without valid position + if not v.get("lat") or not v.get("lng"): + continue + + result.append({ + "mmsi": mmsi, + "name": v.get("name", "UNKNOWN"), + "type": v_type, + "lat": round(v.get("lat", 0), 5), + "lng": round(v.get("lng", 0), 5), + "heading": v.get("heading", 0), + "sog": round(v.get("sog", 0), 1), + "cog": round(v.get("cog", 0), 1), + "callsign": v.get("callsign", ""), + "destination": v.get("destination", "") or "UNKNOWN", + "imo": v.get("imo", 0), + "country": get_country_from_mmsi(mmsi), + }) + return result + + +def _ais_stream_loop(): + """Main loop: spawn node proxy and process messages from stdout.""" + import subprocess + import os + + proxy_script = os.path.join(os.path.dirname(os.path.dirname(__file__)), "ais_proxy.js") + + while _ws_running: + try: + logger.info("Starting Node.js AIS Stream Proxy...") + process = subprocess.Popen( + ['node', proxy_script, API_KEY], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + bufsize=1 + ) + + # Drain stderr in a background thread to prevent deadlock + import threading + def _drain_stderr(): + for errline in iter(process.stderr.readline, ''): + errline = errline.strip() + if errline: + logger.warning(f"AIS proxy stderr: {errline}") + threading.Thread(target=_drain_stderr, daemon=True).start() + + logger.info("AIS Stream proxy started — receiving vessel data") + + msg_count = 0 + for raw_msg in iter(process.stdout.readline, ''): + if not _ws_running: + process.terminate() + break + + raw_msg = raw_msg.strip() + if not raw_msg: + continue + + try: + data = json.loads(raw_msg) + except json.JSONDecodeError: + continue + + if "error" in data: + logger.error(f"AIS Stream error: {data['error']}") + continue + + msg_type = data.get("MessageType", "") + metadata = data.get("MetaData", {}) + message = data.get("Message", {}) + + mmsi = metadata.get("MMSI", 0) + if not mmsi: + continue + + with _vessels_lock: + if mmsi not in _vessels: + _vessels[mmsi] = {"_updated": time.time()} + vessel = _vessels[mmsi] + + # Update position from PositionReport or StandardClassBPositionReport + if msg_type in ("PositionReport", "StandardClassBPositionReport"): + report = message.get(msg_type, {}) + lat = report.get("Latitude", metadata.get("latitude", 0)) + lng = report.get("Longitude", metadata.get("longitude", 0)) + + # Skip invalid positions + if lat == 0 and lng == 0: + continue + if abs(lat) > 90 or abs(lng) > 180: + continue + + with _vessels_lock: + vessel["lat"] = lat + vessel["lng"] = lng + vessel["sog"] = report.get("Sog", 0) + vessel["cog"] = report.get("Cog", 0) + heading = report.get("TrueHeading", 511) + vessel["heading"] = heading if heading != 511 else report.get("Cog", 0) + vessel["_updated"] = time.time() + # Use metadata name if we don't have one yet + if not vessel.get("name") or vessel["name"] == "UNKNOWN": + vessel["name"] = metadata.get("ShipName", "UNKNOWN").strip() or "UNKNOWN" + + # Update static data from ShipStaticData + elif msg_type == "ShipStaticData": + static = message.get("ShipStaticData", {}) + ais_type = static.get("Type", 0) + + with _vessels_lock: + vessel["name"] = (static.get("Name", "") or metadata.get("ShipName", "UNKNOWN")).strip() or "UNKNOWN" + vessel["callsign"] = (static.get("CallSign", "") or "").strip() + vessel["imo"] = static.get("ImoNumber", 0) + vessel["destination"] = (static.get("Destination", "") or "").strip().replace("@", "") + vessel["ais_type_code"] = ais_type + vessel["type"] = classify_vessel(ais_type, mmsi) + vessel["_updated"] = time.time() + + msg_count += 1 + if msg_count % 5000 == 0: + with _vessels_lock: + # Inline pruning: remove vessels not updated in 15 minutes + prune_cutoff = time.time() - 900 + stale = [k for k, v in _vessels.items() if v.get("_updated", 0) < prune_cutoff] + for k in stale: + del _vessels[k] + count = len(_vessels) + if stale: + logger.info(f"AIS pruned {len(stale)} stale vessels") + logger.info(f"AIS Stream: processed {msg_count} messages, tracking {count} vessels") + _save_cache() # Auto-save every 5000 messages (~60 seconds) + + except Exception as e: + logger.error(f"AIS proxy connection error: {e}") + if _ws_running: + logger.info("Restarting AIS proxy in 5 seconds...") + time.sleep(5) + + +def _run_ais_loop(): + """Thread target: run the AIS loop.""" + try: + _ais_stream_loop() + except Exception as e: + logger.error(f"AIS Stream thread crashed: {e}") + + +def start_ais_stream(): + """Start the AIS WebSocket stream in a background thread.""" + global _ws_thread, _ws_running + if _ws_thread and _ws_thread.is_alive(): + logger.info("AIS Stream already running") + return + + # Load cached vessel data from disk + _load_cache() + + _ws_running = True + _ws_thread = threading.Thread(target=_run_ais_loop, daemon=True, name="ais-stream") + _ws_thread.start() + logger.info("AIS Stream background thread started") + + +def stop_ais_stream(): + """Stop the AIS WebSocket stream and save cache.""" + global _ws_running + _ws_running = False + _save_cache() # Save on shutdown + logger.info("AIS Stream stopping...") diff --git a/backend/services/api_settings.py b/backend/services/api_settings.py new file mode 100644 index 0000000..c085bd3 --- /dev/null +++ b/backend/services/api_settings.py @@ -0,0 +1,175 @@ +""" +API Settings management — serves the API key registry and allows updates. +Keys are stored in the backend .env file and loaded via python-dotenv. +""" +import os +import re +from pathlib import Path + +# Path to the backend .env file +ENV_PATH = Path(__file__).parent.parent / ".env" + +# --------------------------------------------------------------------------- +# API Registry — every external service the dashboard depends on +# --------------------------------------------------------------------------- +API_REGISTRY = [ + { + "id": "opensky_client_id", + "env_key": "OPENSKY_CLIENT_ID", + "name": "OpenSky Network — Client ID", + "description": "OAuth2 client ID for the OpenSky Network API. Provides global flight state vectors with 400 requests/day.", + "category": "Aviation", + "url": "https://opensky-network.org/", + "required": True, + }, + { + "id": "opensky_client_secret", + "env_key": "OPENSKY_CLIENT_SECRET", + "name": "OpenSky Network — Client Secret", + "description": "OAuth2 client secret paired with the Client ID above. Used for authenticated token refresh.", + "category": "Aviation", + "url": "https://opensky-network.org/", + "required": True, + }, + { + "id": "ais_api_key", + "env_key": "AIS_API_KEY", + "name": "AIS Stream", + "description": "WebSocket API key for real-time Automatic Identification System (AIS) vessel tracking data worldwide.", + "category": "Maritime", + "url": "https://aisstream.io/", + "required": True, + }, + { + "id": "adsb_lol", + "env_key": None, + "name": "ADS-B Exchange (adsb.lol)", + "description": "Community-maintained ADS-B flight tracking API. No key required — public endpoint.", + "category": "Aviation", + "url": "https://api.adsb.lol/", + "required": False, + }, + { + "id": "usgs_earthquakes", + "env_key": None, + "name": "USGS Earthquake Hazards", + "description": "Real-time earthquake data feed from the United States Geological Survey. No key required.", + "category": "Geophysical", + "url": "https://earthquake.usgs.gov/", + "required": False, + }, + { + "id": "celestrak", + "env_key": None, + "name": "CelesTrak (NORAD TLEs)", + "description": "Satellite orbital element data from CelesTrak. Provides TLE sets for 2,000+ active satellites. No key required.", + "category": "Space", + "url": "https://celestrak.org/", + "required": False, + }, + { + "id": "gdelt", + "env_key": None, + "name": "GDELT Project", + "description": "Global Database of Events, Language, and Tone. Monitors news media for geopolitical events worldwide. No key required.", + "category": "Intelligence", + "url": "https://www.gdeltproject.org/", + "required": False, + }, + { + "id": "nominatim", + "env_key": None, + "name": "Nominatim (OpenStreetMap)", + "description": "Reverse geocoding service. Converts lat/lng coordinates to human-readable location names. No key required.", + "category": "Geolocation", + "url": "https://nominatim.openstreetmap.org/", + "required": False, + }, + { + "id": "rainviewer", + "env_key": None, + "name": "RainViewer", + "description": "Weather radar tile overlay. Provides global precipitation data as map tiles. No key required.", + "category": "Weather", + "url": "https://www.rainviewer.com/", + "required": False, + }, + { + "id": "rss_feeds", + "env_key": None, + "name": "RSS News Feeds", + "description": "Aggregates from NPR, BBC, Al Jazeera, NYT, Reuters, and AP for global news coverage. No key required.", + "category": "Intelligence", + "url": None, + "required": False, + }, + { + "id": "yfinance", + "env_key": None, + "name": "Yahoo Finance (yfinance)", + "description": "Defense sector stock tickers and commodity prices. Uses the yfinance Python library. No key required.", + "category": "Markets", + "url": "https://finance.yahoo.com/", + "required": False, + }, + { + "id": "openmhz", + "env_key": None, + "name": "OpenMHz", + "description": "Public radio scanner feeds for SIGINT interception. Streams police/fire/EMS radio traffic. No key required.", + "category": "SIGINT", + "url": "https://openmhz.com/", + "required": False, + }, +] + + +def _obfuscate(value: str) -> str: + """Show first 4 chars, mask the rest with bullets.""" + if not value or len(value) <= 4: + return "••••••••" + return value[:4] + "•" * (len(value) - 4) + + +def get_api_keys(): + """Return the full API registry with obfuscated key values.""" + result = [] + for api in API_REGISTRY: + entry = { + "id": api["id"], + "name": api["name"], + "description": api["description"], + "category": api["category"], + "url": api["url"], + "required": api["required"], + "has_key": api["env_key"] is not None, + "env_key": api["env_key"], + "value_obfuscated": None, + "value_plain": None, + } + if api["env_key"]: + raw = os.environ.get(api["env_key"], "") + entry["value_obfuscated"] = _obfuscate(raw) + entry["value_plain"] = raw # Sent only when reveal is requested + result.append(entry) + return result + + +def update_api_key(env_key: str, new_value: str) -> bool: + """Update a single key in the .env file and in the current process env.""" + if not ENV_PATH.exists(): + return False + + # Update os.environ immediately + os.environ[env_key] = new_value + + # Update the .env file on disk + content = ENV_PATH.read_text(encoding="utf-8") + pattern = re.compile(rf"^{re.escape(env_key)}=.*$", re.MULTILINE) + if pattern.search(content): + content = pattern.sub(f"{env_key}={new_value}", content) + else: + content = content.rstrip("\n") + f"\n{env_key}={new_value}\n" + + ENV_PATH.write_text(content, encoding="utf-8") + return True diff --git a/backend/services/carrier_tracker.py b/backend/services/carrier_tracker.py new file mode 100644 index 0000000..d863f20 --- /dev/null +++ b/backend/services/carrier_tracker.py @@ -0,0 +1,455 @@ +""" +Carrier Strike Group OSINT Tracker +=================================== +Scrapes multiple OSINT sources to maintain current estimated positions +for US Navy Carrier Strike Groups. Updates on startup + 00:00 & 12:00 UTC. + +Sources: + 1. GDELT News API — recent carrier movement headlines + 2. WikiVoyage / public port-call databases + 3. Fallback — last-known or static OSINT estimates +""" + +import re +import json +import time +import logging +import threading +from datetime import datetime, timezone +from pathlib import Path +from typing import Dict, List, Optional +from services.network_utils import fetch_with_curl + +logger = logging.getLogger(__name__) + +# ----------------------------------------------------------------- +# Carrier registry: hull number → metadata + fallback position +# ----------------------------------------------------------------- +CARRIER_REGISTRY: Dict[str, dict] = { + "CVN-68": { + "name": "USS Nimitz (CVN-68)", + "wiki": "https://en.wikipedia.org/wiki/USS_Nimitz", + "homeport": "Bremerton, WA", + "homeport_lat": 47.56, "homeport_lng": -122.63, + "fallback_lat": 21.35, "fallback_lng": -157.95, + "fallback_heading": 270, + "fallback_desc": "Pacific Fleet / Pearl Harbor" + }, + "CVN-69": { + "name": "USS Dwight D. Eisenhower (CVN-69)", + "wiki": "https://en.wikipedia.org/wiki/USS_Dwight_D._Eisenhower", + "homeport": "Norfolk, VA", + "homeport_lat": 36.95, "homeport_lng": -76.33, + "fallback_lat": 18.0, "fallback_lng": 39.5, + "fallback_heading": 120, + "fallback_desc": "Red Sea / CENTCOM AOR" + }, + "CVN-78": { + "name": "USS Gerald R. Ford (CVN-78)", + "wiki": "https://en.wikipedia.org/wiki/USS_Gerald_R._Ford", + "homeport": "Norfolk, VA", + "homeport_lat": 36.95, "homeport_lng": -76.33, + "fallback_lat": 34.0, "fallback_lng": 25.0, + "fallback_heading": 90, + "fallback_desc": "Eastern Mediterranean deterrence" + }, + "CVN-70": { + "name": "USS Carl Vinson (CVN-70)", + "wiki": "https://en.wikipedia.org/wiki/USS_Carl_Vinson", + "homeport": "San Diego, CA", + "homeport_lat": 32.68, "homeport_lng": -117.15, + "fallback_lat": 15.0, "fallback_lng": 115.0, + "fallback_heading": 45, + "fallback_desc": "South China Sea patrol" + }, + "CVN-71": { + "name": "USS Theodore Roosevelt (CVN-71)", + "wiki": "https://en.wikipedia.org/wiki/USS_Theodore_Roosevelt_(CVN-71)", + "homeport": "San Diego, CA", + "homeport_lat": 32.68, "homeport_lng": -117.15, + "fallback_lat": 22.0, "fallback_lng": 122.0, + "fallback_heading": 300, + "fallback_desc": "Philippine Sea / Taiwan Strait" + }, + "CVN-72": { + "name": "USS Abraham Lincoln (CVN-72)", + "wiki": "https://en.wikipedia.org/wiki/USS_Abraham_Lincoln_(CVN-72)", + "homeport": "San Diego, CA", + "homeport_lat": 32.68, "homeport_lng": -117.15, + "fallback_lat": 21.0, "fallback_lng": -158.0, + "fallback_heading": 270, + "fallback_desc": "Pacific deployment" + }, + "CVN-73": { + "name": "USS George Washington (CVN-73)", + "wiki": "https://en.wikipedia.org/wiki/USS_George_Washington_(CVN-73)", + "homeport": "Yokosuka, Japan", + "homeport_lat": 35.28, "homeport_lng": 139.67, + "fallback_lat": 35.0, "fallback_lng": 139.0, + "fallback_heading": 0, + "fallback_desc": "Yokosuka, Japan (Forward deployed)" + }, + "CVN-74": { + "name": "USS John C. Stennis (CVN-74)", + "wiki": "https://en.wikipedia.org/wiki/USS_John_C._Stennis", + "homeport": "Norfolk, VA", + "homeport_lat": 36.95, "homeport_lng": -76.33, + "fallback_lat": 36.95, "fallback_lng": -76.33, + "fallback_heading": 0, + "fallback_desc": "RCOH / Norfolk (maintenance)" + }, + "CVN-75": { + "name": "USS Harry S. Truman (CVN-75)", + "wiki": "https://en.wikipedia.org/wiki/USS_Harry_S._Truman", + "homeport": "Norfolk, VA", + "homeport_lat": 36.95, "homeport_lng": -76.33, + "fallback_lat": 36.0, "fallback_lng": 15.0, + "fallback_heading": 90, + "fallback_desc": "Mediterranean deployment" + }, + "CVN-76": { + "name": "USS Ronald Reagan (CVN-76)", + "wiki": "https://en.wikipedia.org/wiki/USS_Ronald_Reagan", + "homeport": "Bremerton, WA", + "homeport_lat": 47.56, "homeport_lng": -122.63, + "fallback_lat": 47.56, "fallback_lng": -122.63, + "fallback_heading": 0, + "fallback_desc": "Bremerton, WA (Homeport)" + }, + "CVN-77": { + "name": "USS George H.W. Bush (CVN-77)", + "wiki": "https://en.wikipedia.org/wiki/USS_George_H.W._Bush", + "homeport": "Norfolk, VA", + "homeport_lat": 36.95, "homeport_lng": -76.33, + "fallback_lat": 36.95, "fallback_lng": -76.33, + "fallback_heading": 0, + "fallback_desc": "Norfolk, VA (Homeport)" + }, +} + +# ----------------------------------------------------------------- +# Region → approximate center coordinates +# Used to map textual geographic descriptions to lat/lng +# ----------------------------------------------------------------- +REGION_COORDS: Dict[str, tuple] = { + # Oceans & Seas + "eastern mediterranean": (34.0, 25.0), + "mediterranean": (36.0, 15.0), + "western mediterranean": (37.0, 2.0), + "red sea": (18.0, 39.5), + "arabian sea": (16.0, 64.0), + "persian gulf": (26.5, 51.5), + "gulf of oman": (24.5, 58.5), + "north arabian sea": (20.0, 64.0), + "south china sea": (15.0, 115.0), + "east china sea": (28.0, 125.0), + "philippine sea": (20.0, 130.0), + "sea of japan": (40.0, 135.0), + "taiwan strait": (24.0, 119.5), + "western pacific": (20.0, 140.0), + "pacific": (20.0, -150.0), + "indian ocean": (-5.0, 70.0), + "north atlantic": (40.0, -40.0), + "atlantic": (30.0, -50.0), + "gulf of aden": (12.5, 45.0), + "horn of africa": (10.0, 50.0), + "strait of hormuz": (26.5, 56.3), + "bab el-mandeb": (12.6, 43.3), + "suez canal": (30.5, 32.3), + "baltic sea": (57.0, 18.0), + "north sea": (56.0, 3.0), + "black sea": (43.0, 34.0), + "south atlantic": (-20.0, -20.0), + "coral sea": (-18.0, 155.0), + "gulf of mexico": (25.0, -90.0), + "caribbean": (15.0, -75.0), + + # Specific bases / ports + "norfolk": (36.95, -76.33), + "san diego": (32.68, -117.15), + "yokosuka": (35.28, 139.67), + "pearl harbor": (21.35, -157.95), + "guam": (13.45, 144.79), + "bahrain": (26.23, 50.55), + "rota": (36.62, -6.35), + "naples": (40.85, 14.27), + "bremerton": (47.56, -122.63), + "puget sound": (47.56, -122.63), + "newport news": (36.98, -76.43), + + # Areas of operation + "centcom": (25.0, 55.0), + "indopacom": (20.0, 130.0), + "eucom": (48.0, 15.0), + "southcom": (10.0, -80.0), + "5th fleet": (25.0, 55.0), + "6th fleet": (36.0, 15.0), + "7th fleet": (25.0, 130.0), + "3rd fleet": (30.0, -130.0), + "2nd fleet": (35.0, -60.0), +} + +# ----------------------------------------------------------------- +# Cache file for persisting positions between restarts +# ----------------------------------------------------------------- +CACHE_FILE = Path(__file__).parent.parent / "carrier_cache.json" + +_carrier_positions: Dict[str, dict] = {} +_positions_lock = threading.Lock() +_last_update: Optional[datetime] = None + + +def _load_cache() -> Dict[str, dict]: + """Load cached carrier positions from disk.""" + try: + if CACHE_FILE.exists(): + data = json.loads(CACHE_FILE.read_text()) + logger.info(f"Carrier cache loaded: {len(data)} carriers from {CACHE_FILE}") + return data + except Exception as e: + logger.warning(f"Failed to load carrier cache: {e}") + return {} + + +def _save_cache(positions: Dict[str, dict]): + """Persist carrier positions to disk.""" + try: + CACHE_FILE.write_text(json.dumps(positions, indent=2)) + logger.info(f"Carrier cache saved: {len(positions)} carriers") + except Exception as e: + logger.warning(f"Failed to save carrier cache: {e}") + + +def _match_region(text: str) -> Optional[tuple]: + """Match a text string against known regions, return (lat, lng) or None.""" + text_lower = text.lower() + for region, coords in sorted(REGION_COORDS.items(), key=lambda x: -len(x[0])): + if region in text_lower: + return coords + return None + + +def _match_carrier(text: str) -> Optional[str]: + """Match a text string against known carrier names/hull numbers.""" + text_lower = text.lower() + for hull, info in CARRIER_REGISTRY.items(): + hull_check = hull.lower().replace("-", "") + name_parts = info["name"].lower() + # Match hull number (e.g., "CVN-78", "CVN78") + if hull.lower() in text_lower or hull_check in text_lower.replace("-", ""): + return hull + # Match ship name (e.g., "Ford", "Eisenhower", "Vinson") + ship_name = name_parts.split("(")[0].strip() + last_name = ship_name.split()[-1] if ship_name else "" + if last_name and len(last_name) > 3 and last_name in text_lower: + return hull + return None + + +def _fetch_gdelt_carrier_news() -> List[dict]: + """Search GDELT for recent carrier movement news.""" + results = [] + search_terms = [ + "aircraft+carrier+deployed", + "carrier+strike+group+navy", + "USS+Nimitz+carrier", "USS+Ford+carrier", "USS+Eisenhower+carrier", + "USS+Vinson+carrier", "USS+Roosevelt+carrier+navy", + "USS+Lincoln+carrier", "USS+Truman+carrier", + "USS+Reagan+carrier", "USS+Washington+carrier+navy", + "USS+Bush+carrier", "USS+Stennis+carrier", + ] + + for term in search_terms: + try: + url = f"https://api.gdeltproject.org/api/v2/doc/doc?query={term}&mode=artlist&maxrecords=5&format=json×pan=14d" + raw = fetch_with_curl(url, timeout=8) + if not raw: + continue + data = json.loads(raw) + articles = data.get("articles", []) + for art in articles: + title = art.get("title", "") + url = art.get("url", "") + results.append({"title": title, "url": url}) + except Exception as e: + logger.debug(f"GDELT search failed for '{term}': {e}") + continue + + logger.info(f"Carrier OSINT: found {len(results)} GDELT articles") + return results + + +def _parse_carrier_positions_from_news(articles: List[dict]) -> Dict[str, dict]: + """Parse carrier positions from news article titles and descriptions.""" + updates: Dict[str, dict] = {} + + for article in articles: + title = article.get("title", "") + + # Try to match a carrier from the title + hull = _match_carrier(title) + if not hull: + continue + + # Try to match a region from the title + coords = _match_region(title) + if not coords: + continue + + # Only update if we haven't seen this carrier yet (first match wins — most recent) + if hull not in updates: + updates[hull] = { + "lat": coords[0], + "lng": coords[1], + "desc": title[:100], + "source": "GDELT OSINT", + "updated": datetime.now(timezone.utc).isoformat() + } + logger.info(f"Carrier update: {CARRIER_REGISTRY[hull]['name']} → {coords} (from: {title[:80]})") + + return updates + + +def update_carrier_positions(): + """Main update function — called on startup and every 12h.""" + global _last_update + + logger.info("Carrier tracker: updating positions from OSINT sources...") + + # Start with fallback positions + positions: Dict[str, dict] = {} + for hull, info in CARRIER_REGISTRY.items(): + positions[hull] = { + "name": info["name"], + "lat": info["fallback_lat"], + "lng": info["fallback_lng"], + "heading": info["fallback_heading"], + "desc": info["fallback_desc"], + "wiki": info["wiki"], + "source": "Static OSINT estimate", + "updated": datetime.now(timezone.utc).isoformat() + } + + # Load cached positions (may have better data from previous runs) + cached = _load_cache() + for hull, cached_pos in cached.items(): + if hull in positions: + # Only use cache if it has a real OSINT source (not just static) + if cached_pos.get("source", "").startswith("GDELT") or cached_pos.get("source", "").startswith("News"): + positions[hull].update({ + "lat": cached_pos["lat"], + "lng": cached_pos["lng"], + "desc": cached_pos.get("desc", positions[hull]["desc"]), + "source": cached_pos.get("source", "Cached OSINT"), + "updated": cached_pos.get("updated", "") + }) + + # Try GDELT news for fresh positions + try: + articles = _fetch_gdelt_carrier_news() + news_positions = _parse_carrier_positions_from_news(articles) + for hull, pos in news_positions.items(): + if hull in positions: + positions[hull].update(pos) + logger.info(f"Carrier OSINT: updated {CARRIER_REGISTRY[hull]['name']} from news") + except Exception as e: + logger.warning(f"GDELT carrier fetch failed: {e}") + + # Save and update the global state + with _positions_lock: + _carrier_positions.clear() + _carrier_positions.update(positions) + _last_update = datetime.now(timezone.utc) + + _save_cache(positions) + + sources = {} + for p in positions.values(): + src = p.get("source", "unknown") + sources[src] = sources.get(src, 0) + 1 + logger.info(f"Carrier tracker: {len(positions)} carriers updated. Sources: {sources}") + + +def get_carrier_positions() -> List[dict]: + """Return current carrier positions for the data pipeline.""" + with _positions_lock: + result = [] + for hull, pos in _carrier_positions.items(): + info = CARRIER_REGISTRY.get(hull, {}) + result.append({ + "name": pos.get("name", info.get("name", hull)), + "type": "carrier", + "lat": pos["lat"], + "lng": pos["lng"], + "heading": pos.get("heading", 0), + "sog": 0, + "cog": 0, + "country": "United States", + "desc": pos.get("desc", ""), + "wiki": pos.get("wiki", info.get("wiki", "")), + "estimated": True, + "source": pos.get("source", "OSINT estimated position"), + "last_osint_update": pos.get("updated", "") + }) + return result + + +# ----------------------------------------------------------------- +# Scheduler: runs at startup, then at 00:00 and 12:00 UTC daily +# ----------------------------------------------------------------- +_scheduler_thread: Optional[threading.Thread] = None +_scheduler_stop = threading.Event() + + +def _scheduler_loop(): + """Background thread that triggers updates at 00:00 and 12:00 UTC.""" + # Initial update on startup + try: + update_carrier_positions() + except Exception as e: + logger.error(f"Carrier tracker initial update failed: {e}") + + while not _scheduler_stop.is_set(): + now = datetime.now(timezone.utc) + # Next target: 00:00 or 12:00 UTC, whichever is sooner + hour = now.hour + if hour < 12: + next_hour = 12 + else: + next_hour = 24 # midnight = next day 00:00 + + next_run = now.replace(hour=next_hour % 24, minute=0, second=0, microsecond=0) + if next_hour == 24: + from datetime import timedelta + next_run = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) + + wait_seconds = (next_run - now).total_seconds() + logger.info(f"Carrier tracker: next update at {next_run.isoformat()} ({wait_seconds/3600:.1f}h)") + + # Wait until next scheduled time, or until stop event + if _scheduler_stop.wait(timeout=wait_seconds): + break # Stop event was set + + try: + update_carrier_positions() + except Exception as e: + logger.error(f"Carrier tracker scheduled update failed: {e}") + + +def start_carrier_tracker(): + """Start the carrier tracker background thread.""" + global _scheduler_thread + if _scheduler_thread and _scheduler_thread.is_alive(): + return + _scheduler_stop.clear() + _scheduler_thread = threading.Thread(target=_scheduler_loop, daemon=True, name="carrier-tracker") + _scheduler_thread.start() + logger.info("Carrier tracker started") + + +def stop_carrier_tracker(): + """Stop the carrier tracker background thread.""" + _scheduler_stop.set() + if _scheduler_thread: + _scheduler_thread.join(timeout=5) + logger.info("Carrier tracker stopped") diff --git a/backend/services/cctv_pipeline.py b/backend/services/cctv_pipeline.py new file mode 100644 index 0000000..86f7126 --- /dev/null +++ b/backend/services/cctv_pipeline.py @@ -0,0 +1,274 @@ +import sqlite3 +import requests +from services.network_utils import fetch_with_curl +import logging +from abc import ABC, abstractmethod +from typing import List, Dict, Any + +logger = logging.getLogger(__name__) + +DB_PATH = "cctv.db" + +def init_db(): + conn = sqlite3.connect(DB_PATH) + cursor = conn.cursor() + cursor.execute(""" + CREATE TABLE IF NOT EXISTS cameras ( + id TEXT PRIMARY KEY, + source_agency TEXT, + lat REAL, + lon REAL, + direction_facing TEXT, + media_url TEXT, + refresh_rate_seconds INTEGER, + last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + conn.commit() + conn.close() + +class BaseCCTVIngestor(ABC): + def __init__(self): + self.conn = sqlite3.connect(DB_PATH) + + @abstractmethod + def fetch_data(self) -> List[Dict[str, Any]]: + pass + + def ingest(self): + try: + cameras = self.fetch_data() + cursor = self.conn.cursor() + for cam in cameras: + cursor.execute(""" + INSERT INTO cameras + (id, source_agency, lat, lon, direction_facing, media_url, refresh_rate_seconds) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + media_url=excluded.media_url, + last_updated=CURRENT_TIMESTAMP + """, ( + cam.get("id"), + cam.get("source_agency"), + cam.get("lat"), + cam.get("lon"), + cam.get("direction_facing", "Unknown"), + cam.get("media_url"), + cam.get("refresh_rate_seconds", 60) + )) + self.conn.commit() + logger.info(f"Successfully ingested {len(cameras)} cameras from {self.__class__.__name__}") + except Exception as e: + logger.error(f"Failed to ingest cameras in {self.__class__.__name__}: {e}") + +class TFLJamCamIngestor(BaseCCTVIngestor): + def fetch_data(self) -> List[Dict[str, Any]]: + # Transport for London Open Data API + url = "https://api.tfl.gov.uk/Place/Type/JamCam" + response = fetch_with_curl(url, timeout=15) + response.raise_for_status() + + data = response.json() + cameras = [] + for item in data: + # TfL returns URLs without protocols sometimes or with a base path + vid_url = None + img_url = None + + for prop in item.get('additionalProperties', []): + if prop.get('key') == 'videoUrl': + vid_url = prop.get('value') + elif prop.get('key') == 'imageUrl': + img_url = prop.get('value') + + media = vid_url if vid_url else img_url + if media: + cameras.append({ + "id": f"TFL-{item.get('id')}", + "source_agency": "TfL", + "lat": item.get('lat'), + "lon": item.get('lon'), + "direction_facing": item.get('commonName', 'Unknown'), + "media_url": media, + "refresh_rate_seconds": 15 + }) + return cameras + +class LTASingaporeIngestor(BaseCCTVIngestor): + def fetch_data(self) -> List[Dict[str, Any]]: + # Singapore Land Transport Authority (LTA) Traffic Images API + url = "https://api.data.gov.sg/v1/transport/traffic-images" + response = fetch_with_curl(url, timeout=15) + response.raise_for_status() + + data = response.json() + cameras = [] + if "items" in data and len(data["items"]) > 0: + for item in data["items"][0].get("cameras", []): + loc = item.get("location", {}) + if "latitude" in loc and "longitude" in loc and "image" in item: + cameras.append({ + "id": f"SGP-{item.get('camera_id', 'UNK')}", + "source_agency": "Singapore LTA", + "lat": loc.get("latitude"), + "lon": loc.get("longitude"), + "direction_facing": f"Camera {item.get('camera_id')}", + "media_url": item.get("image"), + "refresh_rate_seconds": 60 + }) + return cameras + + + +class AustinTXIngestor(BaseCCTVIngestor): + def fetch_data(self) -> List[Dict[str, Any]]: + # City of Austin Traffic Cameras Open Data + url = "https://data.austintexas.gov/resource/b4k4-adkb.json?$limit=2000" + response = fetch_with_curl(url, timeout=15) + response.raise_for_status() + + data = response.json() + cameras = [] + for item in data: + cam_id = item.get("camera_id") + if not cam_id: continue + + loc = item.get("location", {}) + coords = loc.get("coordinates", []) + + # coords is usually [lon, lat] + if len(coords) == 2: + cameras.append({ + "id": f"ATX-{cam_id}", + "source_agency": "Austin TxDOT", + "lat": coords[1], + "lon": coords[0], + "direction_facing": item.get("location_name", "Austin TX Camera"), + "media_url": f"https://cctv.austinmobility.io/image/{cam_id}.jpg", + "refresh_rate_seconds": 60 + }) + return cameras + +class NYCDOTIngestor(BaseCCTVIngestor): + def fetch_data(self) -> List[Dict[str, Any]]: + url = "https://webcams.nyctmc.org/api/cameras" + response = fetch_with_curl(url, timeout=15) + response.raise_for_status() + + data = response.json() + cameras = [] + for item in data: + cam_id = item.get("id") + if not cam_id: continue + + lat = item.get("latitude") + lon = item.get("longitude") + if lat and lon: + cameras.append({ + "id": f"NYC-{cam_id}", + "source_agency": "NYC DOT", + "lat": lat, + "lon": lon, + "direction_facing": item.get("name", "NYC Camera"), + "media_url": f"https://webcams.nyctmc.org/api/cameras/{cam_id}/image", + "refresh_rate_seconds": 30 + }) + return cameras + +class GlobalOSMCrawlingIngestor(BaseCCTVIngestor): + def fetch_data(self) -> List[Dict[str, Any]]: + # This will pull physical street surveillance cameras across all global hotspots + # using OpenStreetMap Overpass mapping their exact geospatial coordinates to Google Street View + regions = [ + ("35.6,139.6,35.8,139.8", "Tokyo"), + ("48.8,2.3,48.9,2.4", "Paris"), + ("40.6,-74.1,40.8,-73.9", "NYC Expanded"), + ("34.0,-118.4,34.2,-118.2", "Los Angeles"), + ("-33.9,151.1,-33.7,151.3", "Sydney"), + ("52.4,13.3,52.6,13.5", "Berlin"), + ("25.1,55.2,25.3,55.4", "Dubai"), + ("19.3,-99.2,19.5,-99.0", "Mexico City"), + ("-23.6,-46.7,-23.4,-46.5", "Sao Paulo"), + ("39.6,-105.1,39.9,-104.8", "Denver") + ] + + query_parts = [f'node["man_made"="surveillance"]({bbox});' for bbox, city in regions] + query = "".join(query_parts) + url = f"https://overpass-api.de/api/interpreter?data=[out:json];({query});out%202000;" + + try: + response = fetch_with_curl(url, timeout=15) + response.raise_for_status() + data = response.json() + + cameras = [] + for item in data.get('elements', []): + lat = item.get("lat") + lon = item.get("lon") + cam_id = item.get("id") + + if lat and lon: + # Find which city this belongs to + source_city = "Global OSINT" + for bbox, city in regions: + s, w, n, e = map(float, bbox.split(',')) + if s <= lat <= n and w <= lon <= e: + source_city = f"OSINT: {city}" + break + + # Attempt to parse camera direction for a cool realistic bearing angle if OSM mapped it + direction_str = item.get("tags", {}).get("camera:direction", "0") + try: + bearing = int(float(direction_str)) + except: + bearing = 0 + + mapbox_key = "YOUR_MAPBOX_TOKEN_HERE" + mapbox_url = f"https://api.mapbox.com/styles/v1/mapbox/satellite-streets-v12/static/{lon},{lat},18,{bearing},60/600x400?access_token={mapbox_key}" + + cameras.append({ + "id": f"OSM-{cam_id}", + "source_agency": source_city, + "lat": lat, + "lon": lon, + "direction_facing": item.get("tags", {}).get("surveillance:type", "Street Level Camera"), + "media_url": mapbox_url, + "refresh_rate_seconds": 3600 + }) + return cameras + except Exception: + return [] + + + +def _detect_media_type(url: str) -> str: + """Detect the media type from a camera URL for proper frontend rendering.""" + if not url: + return "image" + url_lower = url.lower() + if any(ext in url_lower for ext in ['.mp4', '.webm', '.ogg']): + return "video" + if any(kw in url_lower for kw in ['.mjpg', '.mjpeg', 'mjpg', 'axis-cgi/mjpg', 'mode=motion']): + return "mjpeg" + if '.m3u8' in url_lower or 'hls' in url_lower: + return "hls" + if any(kw in url_lower for kw in ['embed', 'maps/embed', 'iframe']): + return "embed" + if 'mapbox.com' in url_lower or 'satellite' in url_lower: + return "satellite" + return "image" + +def get_all_cameras() -> List[Dict[str, Any]]: + conn = sqlite3.connect(DB_PATH) + conn.row_factory = sqlite3.Row + cursor = conn.cursor() + cursor.execute("SELECT * FROM cameras") + rows = cursor.fetchall() + conn.close() + cameras = [] + for row in rows: + cam = dict(row) + cam['media_type'] = _detect_media_type(cam.get('media_url', '')) + cameras.append(cam) + return cameras + diff --git a/backend/services/data_fetcher.py b/backend/services/data_fetcher.py new file mode 100644 index 0000000..a9b223f --- /dev/null +++ b/backend/services/data_fetcher.py @@ -0,0 +1,1755 @@ +import yfinance as yf +import feedparser +import requests +import logging +from services.network_utils import fetch_with_curl +import csv +import os +import re +import random +import math +import json +import time +import threading +import io +from apscheduler.schedulers.background import BackgroundScheduler +import concurrent.futures +from sgp4.api import Satrec, WGS72 +from sgp4.api import jday +from datetime import datetime +from dotenv import load_dotenv +load_dotenv() +from services.cctv_pipeline import init_db, TFLJamCamIngestor, LTASingaporeIngestor, AustinTXIngestor, NYCDOTIngestor, get_all_cameras + +logger = logging.getLogger(__name__) + +def _gmst(jd_ut1): + """Greenwich Mean Sidereal Time in radians from Julian Date.""" + t = (jd_ut1 - 2451545.0) / 36525.0 + gmst_sec = 67310.54841 + (876600.0 * 3600 + 8640184.812866) * t + 0.093104 * t * t - 6.2e-6 * t * t * t + gmst_rad = (gmst_sec % 86400) / 86400.0 * 2 * math.pi + return gmst_rad + +# Pre-compiled regex patterns for airline code extraction (used in hot loop) +_RE_AIRLINE_CODE_1 = re.compile(r'^([A-Z]{3})\d') +_RE_AIRLINE_CODE_2 = re.compile(r'^([A-Z]{3})[A-Z\d]') + + +# --------------------------------------------------------------------------- +# OpenSky Network API Client (OAuth2) +# --------------------------------------------------------------------------- +class OpenSkyClient: + def __init__(self, client_id, client_secret): + self.client_id = client_id + self.client_secret = client_secret + self.token = None + self.expires_at = 0 + + def get_token(self): + import time + if self.token and time.time() < self.expires_at - 60: + return self.token + + url = "https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token" + data = { + "grant_type": "client_credentials", + "client_id": self.client_id, + "client_secret": self.client_secret + } + try: + r = requests.post(url, data=data, timeout=10) + if r.status_code == 200: + res = r.json() + self.token = res.get("access_token") + self.expires_at = time.time() + res.get("expires_in", 1800) + logger.info("OpenSky OAuth2 token refreshed.") + return self.token + else: + logger.error(f"OpenSky Auth Failed: {r.status_code} {r.text}") + except Exception as e: + logger.error(f"OpenSky Auth Exception: {e}") + return None + +# User provided credentials +opensky_client = OpenSkyClient( + client_id=os.environ.get("OPENSKY_CLIENT_ID", "vancecook-api-client"), + client_secret=os.environ.get("OPENSKY_CLIENT_SECRET", "0hWKkj1lpZItUMo2usi4YUjqu8I8YOoD") +) + +# Throttling and caching for OpenSky to observe the 400 req/day limit +last_opensky_fetch = 0 +cached_opensky_flights = [] + + + +# In-memory store +latest_data = { + "last_updated": None, + "news": [], + "stocks": {}, + "oil": {}, + "flights": [], + "ships": [], + "military_flights": [], + "tracked_flights": [], + "cctv": [], + "weather": None, + # bikeshare removed per user request + "traffic": [], + "earthquakes": [], + "uavs": [], + "frontlines": None, + "gdelt": [], + "liveuamap": [] +} + +# Thread lock for safe reads/writes to latest_data +_data_lock = threading.Lock() + +# --------------------------------------------------------------------------- +# Plane-Alert DB — load tracked aircraft from CSV on startup +# --------------------------------------------------------------------------- + +# Category → color mapping +_PINK_CATEGORIES = { + "Dictator Alert", "Head of State", "Da Comrade", "Oligarch", + "Governments", "Royal Aircraft", "Quango", +} +_RED_CATEGORIES = { + "Don't you know who I am?", "As Seen on TV", "Joe Cool", + "Vanity Plate", "Football", "Bizjets", +} +_DARKBLUE_CATEGORIES = { + "USAF", "United States Navy", "United States Marine Corps", + "Special Forces", "Hired Gun", "Oxcart", "Gunship", "Nuclear", + "CAP", "Zoomies", +} + +def _category_to_color(cat: str) -> str: + if cat in _PINK_CATEGORIES: + return "pink" + if cat in _RED_CATEGORIES: + return "red" + if cat in _DARKBLUE_CATEGORIES: + return "darkblue" + return "white" + +# Load once on module import +_PLANE_ALERT_DB: dict = {} # uppercase ICAO hex → dict of aircraft info + +def _load_plane_alert_db(): + """Parse plane_alert_db.json into a dict keyed by uppercase ICAO hex.""" + global _PLANE_ALERT_DB + import json + json_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "data", "plane_alert_db.json" + ) + if not os.path.exists(json_path): + logger.warning(f"Plane-Alert JSON DB not found at {json_path}") + return + try: + with open(json_path, "r", encoding="utf-8") as fh: + data = json.load(fh) + for icao_hex, info in data.items(): + info["color"] = _category_to_color(info.get("category", "")) + _PLANE_ALERT_DB[icao_hex] = info + logger.info(f"Plane-Alert JSON DB loaded: {len(_PLANE_ALERT_DB)} aircraft") + except Exception as e: + logger.error(f"Failed to load Plane-Alert JSON DB: {e}") + +_load_plane_alert_db() + +def enrich_with_plane_alert(flight: dict) -> dict: + """If flight's icao24 is in the Plane-Alert DB, add alert metadata.""" + icao = flight.get("icao24", "").strip().upper() + if icao and icao in _PLANE_ALERT_DB: + info = _PLANE_ALERT_DB[icao] + flight["alert_category"] = info["category"] + flight["alert_color"] = info["color"] + flight["alert_operator"] = info["operator"] + flight["alert_type"] = info["ac_type"] + flight["alert_tag1"] = info["tag1"] + flight["alert_tag2"] = info["tag2"] + flight["alert_tag3"] = info["tag3"] + flight["alert_link"] = info["link"] + # Override registration if DB has a better one + if info["registration"]: + flight["registration"] = info["registration"] + + return flight + +# (json imported at module top) +_TRACKED_NAMES_DB: dict = {} # Map from uppercase registration to {name, category} + +def _load_tracked_names(): + global _TRACKED_NAMES_DB + json_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "data", "tracked_names.json" + ) + if not os.path.exists(json_path): + return + try: + with open(json_path, "r", encoding="utf-8") as f: + data = json.load(f) + # data has: + # "names": [ {"name": "...", "category": "..."} ] + # "details": { "Name": { "category": "...", "registrations": ["..."] } } + for name, info in data.get("details", {}).items(): + cat = info.get("category", "Other") + for reg in info.get("registrations", []): + reg_clean = reg.strip().upper() + if reg_clean: + _TRACKED_NAMES_DB[reg_clean] = {"name": name, "category": cat} + logger.info(f"Tracked Names DB loaded: {len(_TRACKED_NAMES_DB)} registrations") + except Exception as e: + logger.error(f"Failed to load Tracked Names DB: {e}") + +_load_tracked_names() + +def enrich_with_tracked_names(flight: dict) -> dict: + """If flight's registration matches our Excel extraction, tag it as tracked.""" + reg = flight.get("registration", "").strip().upper() + callsign = flight.get("callsign", "").strip().upper() + + match = None + if reg and reg in _TRACKED_NAMES_DB: + match = _TRACKED_NAMES_DB[reg] + elif callsign and callsign in _TRACKED_NAMES_DB: + match = _TRACKED_NAMES_DB[callsign] + + if match: + # Don't overwrite Plane-Alert DB operator if it exists unless we want Excel to take precedence. + # Let's let Excel take precedence as it has cleaner individual names (e.g. Elon Musk instead of FALCON LANDING LLC). + flight["alert_operator"] = match["name"] + flight["alert_category"] = match["category"] + if "alert_color" not in flight: + flight["alert_color"] = "pink" + + return flight + + +def generate_machine_assessment(title, description, risk_score): + if risk_score < 8: + return None + + import random + keywords = [word.lower() for word in title.split() + description.split()] + + assessment = "ANALYSIS: " + if any(k in keywords for k in ["strike", "missile", "attack", "bomb", "drone"]): + assessment += f"{random.randint(75, 95)}% probability of kinetic escalation within 24 hours. Recommend immediate asset relocation from projected blast radius." + elif any(k in keywords for k in ["sanction", "trade", "economy", "tariff", "boycott"]): + assessment += f"Significant economic severing detected. {random.randint(60, 85)}% chance of reciprocal sanctions. Global supply chains may experience cascading latency." + elif any(k in keywords for k in ["cyber", "hack", "breach", "ddos", "ransomware"]): + assessment += f"Asymmetric digital warfare signature matched. {random.randint(80, 99)}% probability of infrastructure probing. Initiate air-gapping protocol for critical nodes." + elif any(k in keywords for k in ["troop", "deploy", "border", "navy", "carrier"]): + assessment += f"Force projection detected. {random.randint(70, 90)}% probability of theater escalation. Monitor adjacent maritime and airspace for mobilization." + else: + assessment += f"Anomalous geopolitical shift detected. Confidence interval {random.randint(60, 90)}%. Awaiting further signals intelligence for definitive vector." + + return assessment + +# --------------------------------------------------------------------------- +# Keyword → coordinate mapping for geocoding news articles +# --------------------------------------------------------------------------- +_KEYWORD_COORDS = { + "venezuela": (7.119, -66.589), + "brazil": (-14.235, -51.925), + "argentina": (-38.416, -63.616), + "colombia": (4.570, -74.297), + "mexico": (23.634, -102.552), + "united states": (38.907, -77.036), + " usa ": (38.907, -77.036), + " us ": (38.907, -77.036), + "washington": (38.907, -77.036), + "canada": (56.130, -106.346), + "ukraine": (49.487, 31.272), + "kyiv": (50.450, 30.523), + "russia": (61.524, 105.318), + "moscow": (55.755, 37.617), + "israel": (31.046, 34.851), + "gaza": (31.416, 34.333), + "iran": (32.427, 53.688), + "lebanon": (33.854, 35.862), + "syria": (34.802, 38.996), + "yemen": (15.552, 48.516), + "china": (35.861, 104.195), + "beijing": (39.904, 116.407), + "taiwan": (23.697, 120.960), + "north korea": (40.339, 127.510), + "south korea": (35.907, 127.766), + "pyongyang": (39.039, 125.762), + "seoul": (37.566, 126.978), + "japan": (36.204, 138.252), + "tokyo": (35.676, 139.650), + "afghanistan": (33.939, 67.709), + "pakistan": (30.375, 69.345), + "india": (20.593, 78.962), + " uk ": (55.378, -3.435), + "london": (51.507, -0.127), + "france": (46.227, 2.213), + "paris": (48.856, 2.352), + "germany": (51.165, 10.451), + "berlin": (52.520, 13.405), + "sudan": (12.862, 30.217), + "congo": (-4.038, 21.758), + "south africa": (-30.559, 22.937), + "nigeria": (9.082, 8.675), + "egypt": (26.820, 30.802), + "zimbabwe": (-19.015, 29.154), + "kenya": (-1.292, 36.821), + "libya": (26.335, 17.228), + "mali": (17.570, -3.996), + "niger": (17.607, 8.081), + "somalia": (5.152, 46.199), + "ethiopia": (9.145, 40.489), + "australia": (-25.274, 133.775), + "middle east": (31.500, 34.800), + "europe": (48.800, 2.300), + "africa": (0.000, 25.000), + "america": (38.900, -77.000), + "south america": (-14.200, -51.900), + "asia": (34.000, 100.000), + "california": (36.778, -119.417), + "texas": (31.968, -99.901), + "florida": (27.994, -81.760), + "new york": (40.712, -74.006), + "virginia": (37.431, -78.656), + "british columbia": (53.726, -127.647), + "ontario": (51.253, -85.323), + "quebec": (52.939, -73.549), + "delhi": (28.704, 77.102), + "new delhi": (28.613, 77.209), + "mumbai": (19.076, 72.877), + "shanghai": (31.230, 121.473), + "hong kong": (22.319, 114.169), + "istanbul": (41.008, 28.978), + "dubai": (25.204, 55.270), + "singapore": (1.352, 103.819), + "bangkok": (13.756, 100.501), + "jakarta": (-6.208, 106.845), +} + +def fetch_news(): + feeds = { + "NPR": "https://feeds.npr.org/1004/rss.xml", + "BBC": "http://feeds.bbci.co.uk/news/world/rss.xml", + "AlJazeera": "https://www.aljazeera.com/xml/rss/all.xml", + "NYT": "https://rss.nytimes.com/services/xml/rss/nyt/World.xml", + "GDACS": "https://www.gdacs.org/xml/rss.xml", + "NHK": "https://www3.nhk.or.jp/nhkworld/rss/world.xml", + "CNA": "https://www.channelnewsasia.com/rssfeed/8395986", + "Mercopress": "https://en.mercopress.com/rss/" + } + source_weights = { + "NPR": 4, "BBC": 3, "AlJazeera": 2, "NYT": 1, + "GDACS": 5, "NHK": 3, "CNA": 3, "Mercopress": 3 + } + + clusters = {} + + # Fetch all feeds in parallel for speed (each has a 10s timeout) + def _fetch_feed(item): + source_name, url = item + try: + xml_data = fetch_with_curl(url, timeout=10).text + return source_name, feedparser.parse(xml_data) + except Exception as e: + logger.warning(f"Feed {source_name} failed: {e}") + return source_name, None + + with concurrent.futures.ThreadPoolExecutor(max_workers=len(feeds)) as pool: + feed_results = list(pool.map(_fetch_feed, feeds.items())) + + for source_name, feed in feed_results: + if not feed: + continue + for entry in feed.entries[:5]: + title = entry.get('title', '') + summary = entry.get('summary', '') + + # Filter out Earthquakes/seismic events (redundant with dedicated EQ layer) + _seismic_kw = ["earthquake", "seismic", "quake", "tremor", "magnitude", "richter"] + _text_lower = (title + " " + summary).lower() + if any(kw in _text_lower for kw in _seismic_kw): + continue + + # GDACS-specific risk score mapping + if source_name == "GDACS": + alert_level = entry.get("gdacs_alertlevel", "Green") + if alert_level == "Red": risk_score = 10 + elif alert_level == "Orange": risk_score = 7 + else: risk_score = 4 + else: + risk_keywords = ['war', 'missile', 'strike', 'attack', 'crisis', 'tension', 'military', 'conflict', 'defense', 'clash', 'nuclear'] + text = (title + " " + summary).lower() + + risk_score = 1 + for kw in risk_keywords: + if kw in text: + risk_score += 2 + + risk_score = min(10, risk_score) + + + keyword_coords = _KEYWORD_COORDS + + lat, lng = None, None + + # Try GeoRSS Extraction first (common in GDACS) + if 'georss_point' in entry: + geo_parts = entry['georss_point'].split() + if len(geo_parts) == 2: + lat, lng = float(geo_parts[0]), float(geo_parts[1]) + elif 'where' in entry and hasattr(entry['where'], 'coordinates'): + # Some feeds use the 'where' attribute + coords = entry['where'].coordinates + lat, lng = coords[1], coords[0] # Usually lon, lat in GeoJSON style points + + # Fallback to Keyword Mapping + if lat is None: + padded_text = f" {text} " + for kw, coords in keyword_coords.items(): + if kw.startswith(" ") or kw.endswith(" "): + if kw in padded_text: + lat, lng = coords + break + else: + if re.search(r'\b' + re.escape(kw) + r'\b', text): + lat, lng = coords + break + + # If mapped, check if there is an existing cluster within ~400km (4 degrees) to merge them + if lat is not None: + key = None + for existing_key in clusters.keys(): + if "," in existing_key: + parts = existing_key.split(",") + try: + elat, elng = float(parts[0]), float(parts[1]) + if ((lat - elat)**2 + (lng - elng)**2)**0.5 < 4.0: + key = existing_key + break + except ValueError: + pass + if key is None: + key = f"{lat},{lng}" + else: + key = title + + if key not in clusters: + clusters[key] = [] + + clusters[key].append({ + "title": title, + "link": entry.get('link', ''), + "published": entry.get('published', ''), + "source": source_name, + "risk_score": risk_score, + "coords": [lat, lng] if lat is not None else None + }) + + + news_items = [] + for key, articles in clusters.items(): + # Sort internal articles primarily by risk score (highest first), then by source hierarchy + articles.sort(key=lambda x: (x['risk_score'], source_weights.get(x["source"], 0)), reverse=True) + max_risk = articles[0]['risk_score'] + + top_article = articles[0] + news_items.append({ + "title": top_article["title"], + "link": top_article["link"], + "published": top_article["published"], + "source": top_article["source"], + "risk_score": max_risk, + "coords": top_article["coords"], + "cluster_count": len(articles), + "articles": articles, + "machine_assessment": generate_machine_assessment(top_article["title"], "", max_risk) + }) + + news_items.sort(key=lambda x: x['risk_score'], reverse=True) + latest_data['news'] = news_items + +def fetch_defense_stocks(): + tickers = ["RTX", "LMT", "NOC", "GD", "BA", "PLTR"] + stocks_data = {} + try: + for t in tickers: + try: + ticker = yf.Ticker(t) + hist = ticker.history(period="2d") + if len(hist) >= 1: + current_price = hist['Close'].iloc[-1] + prev_close = hist['Close'].iloc[0] if len(hist) > 1 else current_price + change_percent = ((current_price - prev_close) / prev_close) * 100 if prev_close else 0 + + stocks_data[t] = { + "price": round(float(current_price), 2), + "change_percent": round(float(change_percent), 2), + "up": bool(change_percent >= 0) + } + except Exception as e: + logger.warning(f"Could not fetch data for {t}: {e}") + + latest_data['stocks'] = stocks_data + except Exception as e: + logger.error(f"Error fetching stocks: {e}") + +def fetch_oil_prices(): + # CL=F is Crude Oil, BZ=F is Brent Crude + tickers = {"WTI Crude": "CL=F", "Brent Crude": "BZ=F"} + oil_data = {} + try: + for name, symbol in tickers.items(): + try: + ticker = yf.Ticker(symbol) + hist = ticker.history(period="5d") + if len(hist) >= 2: + current_price = hist['Close'].iloc[-1] + prev_close = hist['Close'].iloc[-2] + change_percent = ((current_price - prev_close) / prev_close) * 100 if prev_close else 0 + + oil_data[name] = { + "price": round(float(current_price), 2), + "change_percent": round(float(change_percent), 2), + "up": bool(change_percent >= 0) + } + except Exception as e: + logger.warning(f"Could not fetch data for {symbol}: {e}") + + latest_data['oil'] = oil_data + except Exception as e: + logger.error(f"Error fetching oil: {e}") + +dynamic_routes_cache = {} # callsign -> {data..., _ts: timestamp} +routes_fetch_in_progress = False +ROUTES_CACHE_TTL = 7200 # 2 hours +ROUTES_CACHE_MAX = 5000 + +def fetch_routes_background(sampled): + global dynamic_routes_cache, routes_fetch_in_progress + if routes_fetch_in_progress: + return + routes_fetch_in_progress = True + + try: + # Prune stale entries (older than 2 hours) and cap at max size + now_ts = time.time() + stale_keys = [k for k, v in dynamic_routes_cache.items() if now_ts - v.get('_ts', 0) > ROUTES_CACHE_TTL] + for k in stale_keys: + del dynamic_routes_cache[k] + if len(dynamic_routes_cache) > ROUTES_CACHE_MAX: + # Remove oldest entries + sorted_keys = sorted(dynamic_routes_cache, key=lambda k: dynamic_routes_cache[k].get('_ts', 0)) + for k in sorted_keys[:len(dynamic_routes_cache) - ROUTES_CACHE_MAX]: + del dynamic_routes_cache[k] + + callsigns_to_query = [] + for f in sampled: + c_sign = str(f.get("flight", "")).strip() + if c_sign and c_sign != "UNKNOWN": + callsigns_to_query.append({ + "callsign": c_sign, + "lat": f.get("lat", 0), + "lng": f.get("lon", 0) + }) + + batch_size = 100 + batches = [callsigns_to_query[i:i+batch_size] for i in range(0, len(callsigns_to_query), batch_size)] + + for batch in batches: + try: + r = fetch_with_curl("https://api.adsb.lol/api/0/routeset", method="POST", json_data={"planes": batch}, timeout=15) + if r.status_code == 200: + route_data = r.json() + route_list = [] + if isinstance(route_data, dict): + route_list = route_data.get("value", []) + elif isinstance(route_data, list): + route_list = route_data + + for route in route_list: + callsign = route.get("callsign", "") + airports = route.get("_airports", []) + if airports and len(airports) >= 2: + orig_apt = airports[0] + dest_apt = airports[-1] + dynamic_routes_cache[callsign] = { + "orig_name": f"{orig_apt.get('iata', '')}: {orig_apt.get('name', 'Unknown')}", + "dest_name": f"{dest_apt.get('iata', '')}: {dest_apt.get('name', 'Unknown')}", + "orig_loc": [orig_apt.get("lon", 0), orig_apt.get("lat", 0)], + "dest_loc": [dest_apt.get("lon", 0), dest_apt.get("lat", 0)], + "_ts": time.time(), + } + time.sleep(0.25) # Throttle strictly beneath 10 requests / second limit + except Exception: + pass + finally: + routes_fetch_in_progress = False + +# Helicopter type codes (backend classification) +_HELI_TYPES_BACKEND = { + "R22", "R44", "R66", "B06", "B06T", "B204", "B205", "B206", "B212", "B222", "B230", + "B407", "B412", "B427", "B429", "B430", "B505", "B525", + "AS32", "AS35", "AS50", "AS55", "AS65", + "EC20", "EC25", "EC30", "EC35", "EC45", "EC55", "EC75", + "H125", "H130", "H135", "H145", "H155", "H160", "H175", "H215", "H225", + "S55", "S58", "S61", "S64", "S70", "S76", "S92", + "A109", "A119", "A139", "A169", "A189", "AW09", + "MD52", "MD60", "MDHI", "MD90", "NOTR", + "B47G", "HUEY", "GAMA", "CABR", "EXE", +} + +def fetch_flights(): + # OpenSky Network public API for flights. We want to demonstrate global coverage. + flights = [] + try: + # Sample flights from North America, Europe, Asia + regions = [ + {"lat": 39.8, "lon": -98.5, "dist": 2000}, # USA + {"lat": 50.0, "lon": 15.0, "dist": 2000}, # Europe + {"lat": 35.0, "lon": 105.0, "dist": 2000}, # Asia / China + {"lat": -25.0, "lon": 133.0, "dist": 2000}, # Australia + {"lat": 0.0, "lon": 20.0, "dist": 2500}, # Africa + {"lat": -15.0, "lon": -60.0, "dist": 2000} # South America + ] + + all_adsb_flights = [] + + # Fetch all regions in parallel for ~5x speedup + def _fetch_region(r): + url = f"https://api.adsb.lol/v2/lat/{r['lat']}/lon/{r['lon']}/dist/{r['dist']}" + try: + res = fetch_with_curl(url, timeout=10) + if res.status_code == 200: + data = res.json() + return data.get("ac", []) + except Exception as e: + logger.warning(f"Region fetch failed for lat={r['lat']}: {e}") + return [] + + # Fetch all regions in parallel for maximum speed + with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool: + results = pool.map(_fetch_region, regions) + for region_flights in results: + all_adsb_flights.extend(region_flights) + + # --------------------------------------------------------------------------- + # OpenSky Regional Fallback (Africa, Asia, South America) + # --------------------------------------------------------------------------- + now = time.time() + global last_opensky_fetch, cached_opensky_flights + + # OpenSky has a 400 req/day limit (~16 pings/hour) + # 5 minutes = 288 pings/day (Safe margin) + if now - last_opensky_fetch > 300: + token = opensky_client.get_token() + if token: + opensky_regions = [ + {"name": "Africa", "bbox": {"lamin": -35.0, "lomin": -20.0, "lamax": 38.0, "lomax": 55.0}}, + {"name": "Asia", "bbox": {"lamin": 0.0, "lomin": 30.0, "lamax": 75.0, "lomax": 150.0}}, + {"name": "South America", "bbox": {"lamin": -60.0, "lomin": -95.0, "lamax": 15.0, "lomax": -30.0}} + ] + + new_opensky_flights = [] + for os_reg in opensky_regions: + try: + bb = os_reg["bbox"] + os_url = f"https://opensky-network.org/api/states/all?lamin={bb['lamin']}&lomin={bb['lomin']}&lamax={bb['lamax']}&lomax={bb['lomax']}" + headers = {"Authorization": f"Bearer {token}"} + os_res = requests.get(os_url, headers=headers, timeout=15) + + if os_res.status_code == 200: + os_data = os_res.json() + states = os_data.get("states") or [] + logger.info(f"OpenSky: Fetched {len(states)} states for {os_reg['name']}") + + for s in states: + # OpenSky state vector mapping: + # 0icao, 1callsign, 2country, 3time, 4last, 5lon, 6lat, 7baro, 8ground, 9vel, 10track, 11vert, 12sens, 13geo, 14sqk + new_opensky_flights.append({ + "hex": s[0], + "flight": s[1].strip() if s[1] else "UNKNOWN", + "r": s[2], + "lon": s[5], + "lat": s[6], + "alt_baro": (s[7] * 3.28084) if s[7] else 0, # Meters to Feet for internal consistency + "track": s[10] or 0, + "gs": (s[9] * 1.94384) if s[9] else 0, # m/s to knots + "t": "Unknown", # Model unknown in states API + "is_opensky": True + }) + else: + logger.warning(f"OpenSky API {os_reg['name']} failed: {os_res.status_code}") + except Exception as ex: + logger.error(f"OpenSky fetching error for {os_reg['name']}: {ex}") + + cached_opensky_flights = new_opensky_flights + last_opensky_fetch = now + + # Merge cached OpenSky flights, but deduplicate by icao24 hex code + # ADS-B Exchange is primary; OpenSky only fills gaps + seen_hex = set() + for f in all_adsb_flights: + h = f.get("hex") + if h: + seen_hex.add(h.lower().strip()) + for osf in cached_opensky_flights: + h = osf.get("hex") + if h and h.lower().strip() not in seen_hex: + all_adsb_flights.append(osf) + seen_hex.add(h.lower().strip()) + + + if all_adsb_flights: + + # The user requested maximum flight density. Rendering all available aircraft. + sampled = all_adsb_flights + + # Spin up the background batch route resolver if it's not already trickling + if not routes_fetch_in_progress: + threading.Thread(target=fetch_routes_background, args=(sampled,), daemon=True).start() + + for f in sampled: + try: + lat = f.get("lat") + lng = f.get("lon") + heading = f.get("track") or 0 + + if lat is None or lng is None: + continue + + flight_str = str(f.get("flight", "UNKNOWN")).strip() + if not flight_str or flight_str == "UNKNOWN": + flight_str = str(f.get("hex", "Unknown")) + + # Origin and destination are fetched via the background thread and cached + origin_loc = None + dest_loc = None + origin_name = "UNKNOWN" + dest_name = "UNKNOWN" + + if flight_str in dynamic_routes_cache: + cached = dynamic_routes_cache[flight_str] + origin_name = cached["orig_name"] + dest_name = cached["dest_name"] + origin_loc = cached["orig_loc"] + dest_loc = cached["dest_loc"] + + # Extract 3-letter ICAO Airline Code from CallSign (e.g. UAL123 -> UAL) + airline_code = "" + match = _RE_AIRLINE_CODE_1.match(flight_str) + if not match: + match = _RE_AIRLINE_CODE_2.match(flight_str) + if match: + airline_code = match.group(1) + + alt_raw = f.get("alt_baro") + alt_value = 0 + if isinstance(alt_raw, (int, float)): + alt_value = alt_raw * 0.3048 + + # Ground speed from ADS-B (in knots) + gs_knots = f.get("gs") + speed_knots = round(gs_knots, 1) if isinstance(gs_knots, (int, float)) else None + + model_upper = f.get("t", "").upper() + ac_category = "heli" if model_upper in _HELI_TYPES_BACKEND else "plane" + + flights.append({ + "callsign": flight_str, + "country": f.get("r", "N/A"), + "lng": float(lng), + "lat": float(lat), + "alt": alt_value, + "heading": heading, + "type": "flight", + "origin_loc": origin_loc, + "dest_loc": dest_loc, + "origin_name": origin_name, + "dest_name": dest_name, + "registration": f.get("r", "N/A"), + "model": f.get("t", "Unknown"), + "icao24": f.get("hex", ""), + "speed_knots": speed_knots, + "squawk": f.get("squawk", ""), + "airline_code": airline_code, + "aircraft_category": ac_category, + "nac_p": f.get("nac_p") # Navigation accuracy — used for GPS jamming detection + }) + except Exception as loop_e: + logger.error(f"Flight interpolation error: {loop_e}") + continue + + except Exception as e: + logger.error(f"Error fetching adsb.lol flights: {e}") + + # Private jet ICAO type designator codes (business jets wealthy individuals fly) + PRIVATE_JET_TYPES = { + # Gulfstream + "G150", "G200", "G280", "GLEX", "G500", "G550", "G600", "G650", "G700", + "GLF2", "GLF3", "GLF4", "GLF5", "GLF6", "GL5T", "GL7T", "GV", "GIV", + # Bombardier + "CL30", "CL35", "CL60", "BD70", "BD10", "GL5T", "GL7T", + "CRJ1", "CRJ2", # Challenger variants used privately + # Cessna Citation + "C25A", "C25B", "C25C", "C500", "C501", "C510", "C525", "C526", + "C550", "C560", "C56X", "C680", "C68A", "C700", "C750", + # Dassault Falcon + "FA10", "FA20", "FA50", "FA7X", "FA8X", "F900", "F2TH", "ASTR", + # Embraer Business Jets + "E35L", "E545", "E550", "E55P", "LEGA", # Praetor / Legacy + "PH10", # Phenom 100 + "PH30", # Phenom 300 + # Learjet + "LJ23", "LJ24", "LJ25", "LJ28", "LJ31", "LJ35", "LJ36", + "LJ40", "LJ45", "LJ55", "LJ60", "LJ70", "LJ75", + # Hawker / Beechcraft + "H25A", "H25B", "H25C", "HA4T", "BE40", "PRM1", + # Other business jets + "HDJT", # HondaJet + "PC24", # Pilatus PC-24 + "EA50", # Eclipse 500 + "SF50", # Cirrus Vision Jet + "GALX", # IAI Galaxy + } + + commercial = [] + private_jets = [] + private_ga = [] + tracked = [] + + + for f in flights: + # Enrich every flight with plane-alert data + enrich_with_plane_alert(f) + enrich_with_tracked_names(f) + + callsign = f.get('callsign', '').strip().upper() + # Heuristic: standard airline callsigns are 3 letters + 1 to 4 digits (e.g., AFR7403, BAW12) + is_commercial_format = bool(re.match(r'^[A-Z]{3}\d{1,4}[A-Z]{0,2}$', callsign)) + + if f.get('alert_category'): + # This is a tracked aircraft — pull it out into tracked list + f['type'] = 'tracked_flight' + tracked.append(f) + elif f.get('airline_code') or is_commercial_format: + f['type'] = 'commercial_flight' + commercial.append(f) + elif f.get('model', '').upper() in PRIVATE_JET_TYPES: + f['type'] = 'private_jet' + private_jets.append(f) + else: + f['type'] = 'private_ga' + private_ga.append(f) + + # --- Smart merge: protect against partial API failures --- + # If the new dataset has dramatically fewer flights than what we already have, + # a region fetch probably failed — keep the old data to prevent planes vanishing. + prev_commercial_count = len(latest_data.get('commercial_flights', [])) + prev_total = prev_commercial_count + len(latest_data.get('private_jets', [])) + len(latest_data.get('private_flights', [])) + new_total = len(commercial) + len(private_jets) + len(private_ga) + + if new_total == 0: + logger.warning("No civilian flights found! Skipping overwrite to prevent clearing the map.") + elif prev_total > 100 and new_total < prev_total * 0.5: + # Dramatic drop (>50% loss) — a region probably failed, keep existing data + logger.warning(f"Flight count dropped from {prev_total} to {new_total} (>50% loss). Keeping previous data to prevent flicker.") + else: + # Merge: deduplicate by icao24, prefer new data + import time as _time + _now = _time.time() + + def _merge_category(new_list, old_list, max_stale_s=120): + """Merge new flights with old, keeping stale entries for up to max_stale_s.""" + by_icao = {} + # Old entries first (will be overwritten by new) + for f in old_list: + icao = f.get('icao24', '') + if icao: + f.setdefault('_seen_at', _now) + # Evict if stale for too long + if (_now - f.get('_seen_at', _now)) < max_stale_s: + by_icao[icao] = f + # New entries overwrite old + for f in new_list: + icao = f.get('icao24', '') + if icao: + f['_seen_at'] = _now + by_icao[icao] = f + else: + by_icao[id(f)] = f # no icao — keep as unique + return list(by_icao.values()) + + latest_data['commercial_flights'] = _merge_category(commercial, latest_data.get('commercial_flights', [])) + latest_data['private_jets'] = _merge_category(private_jets, latest_data.get('private_jets', [])) + latest_data['private_flights'] = _merge_category(private_ga, latest_data.get('private_flights', [])) + + # Always write raw flights for GPS jamming analysis (nac_p field) + if flights: + latest_data['flights'] = flights + + # Merge tracked civilian flights with any tracked military flights + # CRITICAL: Update positions for already-tracked aircraft on every cycle, + # not just add new ones — otherwise tracked positions go stale. + existing_tracked = latest_data.get('tracked_flights', []) + + # Build a map of fresh tracked data keyed by icao24 + fresh_tracked_map = {} + for t in tracked: + icao = t.get('icao24', '').upper() + if icao: + fresh_tracked_map[icao] = t + + # Update existing tracked entries with fresh positions, preserve metadata + merged_tracked = [] + seen_icaos = set() + for old_t in existing_tracked: + icao = old_t.get('icao24', '').upper() + if icao in fresh_tracked_map: + # Fresh data available — use it, but preserve any extra metadata from old entry + fresh = fresh_tracked_map[icao] + for key in ('alert_category', 'alert_operator', 'alert_special', 'alert_flag'): + if key in old_t and key not in fresh: + fresh[key] = old_t[key] + merged_tracked.append(fresh) + seen_icaos.add(icao) + else: + # No fresh data (military-only tracked, or plane landed/out of range) + merged_tracked.append(old_t) + seen_icaos.add(icao) + + # Add any newly-discovered tracked aircraft + for icao, t in fresh_tracked_map.items(): + if icao not in seen_icaos: + merged_tracked.append(t) + + latest_data['tracked_flights'] = merged_tracked + logger.info(f"Tracked flights: {len(merged_tracked)} total ({len(fresh_tracked_map)} fresh from civilian)") + + # ----------------------------------------------------------------------- + # Flight Trail Accumulation — build position history for unrouted flights + # ----------------------------------------------------------------------- + def _accumulate_trail(f, now_ts, check_route=True): + """Accumulate trail points for a single flight. Returns 1 if trail updated, 0 otherwise.""" + hex_id = f.get('icao24', '').lower() + if not hex_id: + return 0, None + if check_route and f.get('origin_name', 'UNKNOWN') != 'UNKNOWN': + f['trail'] = [] + return 0, hex_id + lat, lng, alt = f.get('lat'), f.get('lng'), f.get('alt', 0) + if lat is None or lng is None: + f['trail'] = flight_trails.get(hex_id, {}).get('points', []) + return 0, hex_id + point = [round(lat, 5), round(lng, 5), round(alt, 1), round(now_ts)] + if hex_id not in flight_trails: + flight_trails[hex_id] = {'points': [], 'last_seen': now_ts} + trail_data = flight_trails[hex_id] + if trail_data['points'] and trail_data['points'][-1][0] == point[0] and trail_data['points'][-1][1] == point[1]: + trail_data['last_seen'] = now_ts + else: + trail_data['points'].append(point) + trail_data['last_seen'] = now_ts + if len(trail_data['points']) > 200: + trail_data['points'] = trail_data['points'][-200:] + f['trail'] = trail_data['points'] + return 1, hex_id + + now_ts = datetime.utcnow().timestamp() + all_lists = [commercial, private_jets, private_ga, existing_tracked] + seen_hexes = set() + trail_count = 0 + for flist in all_lists: + for f in flist: + count, hex_id = _accumulate_trail(f, now_ts, check_route=True) + trail_count += count + if hex_id: + seen_hexes.add(hex_id) + + # Also process military flights (separate list) + for mf in latest_data.get('military_flights', []): + count, hex_id = _accumulate_trail(mf, now_ts, check_route=False) + trail_count += count + if hex_id: + seen_hexes.add(hex_id) + + # Prune trails for aircraft not seen in 30 minutes + stale_cutoff = now_ts - 1800 + stale_keys = [k for k, v in flight_trails.items() if v['last_seen'] < stale_cutoff] + for k in stale_keys: + del flight_trails[k] + + logger.info(f"Trail accumulation: {trail_count} active trails, {len(stale_keys)} pruned") + + # ----------------------------------------------------------------------- + # GPS / GNSS Jamming Detection — aggregate NACp from ADS-B transponders + # NACp (Navigation Accuracy Category for Position): + # 11 = full accuracy (<3m), 8 = good (<93m), <8 = degraded = potential jamming + # We use a 1°×1° grid (~111km at equator) to aggregate interference zones. + # ----------------------------------------------------------------------- + try: + jamming_grid = {} # "lat,lng" -> {"degraded": int, "total": int} + raw_flights = latest_data.get('flights', []) + for rf in raw_flights: + rlat = rf.get('lat') + rlng = rf.get('lng') or rf.get('lon') + if rlat is None or rlng is None: + continue + nacp = rf.get('nac_p') + if nacp is None: + continue + # Grid key: snap to 1-degree cells + grid_key = f"{int(rlat)},{int(rlng)}" + if grid_key not in jamming_grid: + jamming_grid[grid_key] = {"degraded": 0, "total": 0} + jamming_grid[grid_key]["total"] += 1 + if nacp < 8: + jamming_grid[grid_key]["degraded"] += 1 + + jamming_zones = [] + for gk, counts in jamming_grid.items(): + if counts["total"] < 3: + continue # Need at least 3 aircraft to be meaningful + ratio = counts["degraded"] / counts["total"] + if ratio > 0.25: # >25% degraded = jamming + lat_i, lng_i = gk.split(",") + severity = "low" if ratio < 0.5 else "medium" if ratio < 0.75 else "high" + jamming_zones.append({ + "lat": int(lat_i) + 0.5, # Center of cell + "lng": int(lng_i) + 0.5, + "severity": severity, + "ratio": round(ratio, 2), + "degraded": counts["degraded"], + "total": counts["total"] + }) + latest_data['gps_jamming'] = jamming_zones + if jamming_zones: + logger.info(f"GPS Jamming: {len(jamming_zones)} interference zones detected") + except Exception as e: + logger.error(f"GPS Jamming detection error: {e}") + latest_data['gps_jamming'] = [] + + # ----------------------------------------------------------------------- + # Holding Pattern Detection — flag aircraft circling in place + # If cumulative heading change over last 8 trail points > 300°, it's circling + # ----------------------------------------------------------------------- + try: + holding_count = 0 + all_flight_lists = [commercial, private_jets, private_ga, + latest_data.get('tracked_flights', []), + latest_data.get('military_flights', [])] + for flist in all_flight_lists: + for f in flist: + hex_id = f.get('icao24', '').lower() + trail = flight_trails.get(hex_id, {}).get('points', []) + if len(trail) < 6: + f['holding'] = False + continue + # Calculate cumulative bearing change over last 8 points + pts = trail[-8:] + total_turn = 0.0 + prev_bearing = 0.0 + for i in range(1, len(pts)): + lat1, lng1 = math.radians(pts[i-1][0]), math.radians(pts[i-1][1]) + lat2, lng2 = math.radians(pts[i][0]), math.radians(pts[i][1]) + dlng = lng2 - lng1 + x = math.sin(dlng) * math.cos(lat2) + y = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlng) + bearing = math.degrees(math.atan2(x, y)) % 360 + if i > 1: + delta = abs(bearing - prev_bearing) + if delta > 180: + delta = 360 - delta + total_turn += delta + prev_bearing = bearing + f['holding'] = total_turn > 300 # > 300° = nearly a full circle + if f['holding']: + holding_count += 1 + if holding_count: + logger.info(f"Holding patterns: {holding_count} aircraft circling") + except Exception as e: + logger.error(f"Holding pattern detection error: {e}") + + # Update timestamp so the ETag in /api/live-data/fast changes on every fetch cycle + latest_data['last_updated'] = datetime.utcnow().isoformat() + +def fetch_ships(): + """Fetch real-time AIS vessel data and combine with OSINT carrier positions.""" + from services.ais_stream import get_ais_vessels + from services.carrier_tracker import get_carrier_positions + + ships = [] + + # Dynamic OSINT carrier positions (updated from GDELT + cache) + carriers = get_carrier_positions() + ships.extend(carriers) + + # Real AIS vessel data from aisstream.io + ais_vessels = get_ais_vessels() + ships.extend(ais_vessels) + + logger.info(f"Ships: {len(carriers)} carriers + {len(ais_vessels)} AIS vessels") + latest_data['ships'] = ships + +def fetch_military_flights(): + # True ADS-B Exchange military data requires paid API access. + # We will use adsb.lol (an open source ADSB aggregator) /v2/mil fallback. + military_flights = [] + try: + url = "https://api.adsb.lol/v2/mil" + response = fetch_with_curl(url, timeout=10) + if response.status_code == 200: + ac = response.json().get('ac', []) + for f in ac: + try: + lat = f.get("lat") + lng = f.get("lon") + heading = f.get("track") or 0 + + if lat is None or lng is None: + continue + + model = str(f.get("t", "UNKNOWN")).upper() + mil_cat = "default" + if "H" in model and any(c.isdigit() for c in model): + mil_cat = "heli" + elif any(k in model for k in ["K35", "K46", "A33"]): + mil_cat = "tanker" + elif any(k in model for k in ["F16", "F35", "F22", "F15", "F18", "T38", "T6", "A10"]): + mil_cat = "fighter" + elif any(k in model for k in ["C17", "C5", "C130", "C30", "A400", "V22"]): + mil_cat = "cargo" + elif any(k in model for k in ["P8", "E3", "E8", "U2", "RQ", "MQ"]): + mil_cat = "recon" + + # Military flights don't file public routes + origin_loc = None + dest_loc = None + origin_name = "UNKNOWN" + dest_name = "UNKNOWN" + + + alt_raw = f.get("alt_baro") + alt_value = 0 + if isinstance(alt_raw, (int, float)): + alt_value = alt_raw * 0.3048 + + # Ground speed from ADS-B (in knots) + gs_knots = f.get("gs") + speed_knots = round(gs_knots, 1) if isinstance(gs_knots, (int, float)) else None + + military_flights.append({ + "callsign": str(f.get("flight", "MIL-UNKN")).strip(), + "country": f.get("r", "Military Asset"), + "lng": float(lng), + "lat": float(lat), + "alt": alt_value, + "heading": heading, + "type": "military_flight", + "military_type": mil_cat, + "origin_loc": origin_loc, + "dest_loc": dest_loc, + "origin_name": origin_name, + "dest_name": dest_name, + "registration": f.get("r", "N/A"), + "model": f.get("t", "Unknown"), + "icao24": f.get("hex", ""), + "speed_knots": speed_knots, + "squawk": f.get("squawk", "") + }) + except Exception as loop_e: + logger.error(f"Mil flight interpolation error: {loop_e}") + continue + except Exception as e: + logger.error(f"Error fetching military flights: {e}") + + if not military_flights: + # API failed or rate limited — log but do NOT inject fake data + logger.warning("No military flights retrieved — keeping previous data if available") + # Preserve existing data rather than overwriting with empty + if latest_data.get('military_flights'): + return + + latest_data['military_flights'] = military_flights + + # Cross-reference military flights with Plane-Alert DB + tracked_mil = [] + remaining_mil = [] + for mf in military_flights: + enrich_with_plane_alert(mf) + if mf.get('alert_category'): + mf['type'] = 'tracked_flight' + tracked_mil.append(mf) + else: + remaining_mil.append(mf) + latest_data['military_flights'] = remaining_mil + + # Store tracked military flights — update positions for existing entries + existing_tracked = latest_data.get('tracked_flights', []) + fresh_mil_map = {} + for t in tracked_mil: + icao = t.get('icao24', '').upper() + if icao: + fresh_mil_map[icao] = t + + # Update existing military tracked entries with fresh positions + updated_tracked = [] + seen_icaos = set() + for old_t in existing_tracked: + icao = old_t.get('icao24', '').upper() + if icao in fresh_mil_map: + fresh = fresh_mil_map[icao] + for key in ('alert_category', 'alert_operator', 'alert_special', 'alert_flag'): + if key in old_t and key not in fresh: + fresh[key] = old_t[key] + updated_tracked.append(fresh) + seen_icaos.add(icao) + else: + updated_tracked.append(old_t) + seen_icaos.add(icao) + for icao, t in fresh_mil_map.items(): + if icao not in seen_icaos: + updated_tracked.append(t) + latest_data['tracked_flights'] = updated_tracked + logger.info(f"Tracked flights: {len(updated_tracked)} total ({len(tracked_mil)} from military)") + +def fetch_weather(): + try: + url = "https://api.rainviewer.com/public/weather-maps.json" + response = fetch_with_curl(url, timeout=10) + if response.status_code == 200: + data = response.json() + if "radar" in data and "past" in data["radar"]: + latest_time = data["radar"]["past"][-1]["time"] + latest_data["weather"] = {"time": latest_time, "host": data.get("host", "https://tilecache.rainviewer.com")} + except Exception as e: + logger.error(f"Error fetching weather: {e}") + +def fetch_cctv(): + try: + latest_data["cctv"] = get_all_cameras() + except Exception as e: + logger.error(f"Error fetching cctv from DB: {e}") + latest_data["cctv"] = [] + +def fetch_bikeshare(): + bikes = [] + try: + # CitiBike NYC Free GBFS Feed + info_url = "https://gbfs.citibikenyc.com/gbfs/en/station_information.json" + status_url = "https://gbfs.citibikenyc.com/gbfs/en/station_status.json" + + info_res = fetch_with_curl(info_url, timeout=10) + status_res = fetch_with_curl(status_url, timeout=10) + + if info_res.status_code == 200 and status_res.status_code == 200: + stations = info_res.json()["data"]["stations"] + statuses = status_res.json()["data"]["stations"] + + # Map statuses + status_map = {s["station_id"]: s for s in statuses} + + # Top 100 stations for performance + for st in stations[:100]: + sid = st["station_id"] + stat = status_map.get(sid, {}) + bikes.append({ + "id": sid, + "name": st.get("name", "Station"), + "lat": st.get("lat", 0), + "lng": st.get("lon", 0), + "capacity": st.get("capacity", 0), + "available": stat.get("num_bikes_available", 0) + }) + except Exception as e: + logger.error(f"Error fetching bikeshare: {e}") + latest_data["bikeshare"] = bikes + +def fetch_traffic(): + # Deprecated: TomTom warning signs removed from UI to declutter CCTV mesh + latest_data["traffic"] = [] + +def fetch_earthquakes(): + quakes = [] + try: + url = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson" + response = fetch_with_curl(url, timeout=10) + if response.status_code == 200: + features = response.json().get("features", []) + for f in features[:50]: + mag = f["properties"]["mag"] + lng, lat, depth = f["geometry"]["coordinates"] + quakes.append({ + "id": f["id"], + "mag": mag, + "lat": lat, + "lng": lng, + "place": f["properties"]["place"] + }) + except Exception as e: + logger.error(f"Error fetching earthquakes: {e}") + latest_data["earthquakes"] = quakes + +# Satellite GP data cache — re-download from CelesTrak only every 30 minutes +_sat_gp_cache = {"data": None, "last_fetch": 0} + +# Satellite intelligence classification database — module-level constant. +# Key: substring to match in OBJECT_NAME → {country, mission, sat_type, wiki} +_SAT_INTEL_DB = [ + # Military reconnaissance / imaging + ("USA 224", {"country": "USA", "mission": "military_recon", "sat_type": "KH-11 Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/KH-11_KENNEN"}), + ("USA 245", {"country": "USA", "mission": "military_recon", "sat_type": "KH-11 Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/KH-11_KENNEN"}), + ("USA 290", {"country": "USA", "mission": "military_recon", "sat_type": "KH-11 Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/KH-11_KENNEN"}), + ("USA 314", {"country": "USA", "mission": "military_recon", "sat_type": "KH-11 Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/KH-11_KENNEN"}), + ("USA 338", {"country": "USA", "mission": "military_recon", "sat_type": "Keyhole Successor", "wiki": "https://en.wikipedia.org/wiki/KH-11_KENNEN"}), + ("TOPAZ", {"country": "Russia", "mission": "military_recon", "sat_type": "Optical Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/Persona_(satellite)"}), + ("PERSONA", {"country": "Russia", "mission": "military_recon", "sat_type": "Optical Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/Persona_(satellite)"}), + ("KONDOR", {"country": "Russia", "mission": "military_sar", "sat_type": "SAR Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/Kondor_(satellite)"}), + ("BARS-M", {"country": "Russia", "mission": "military_recon", "sat_type": "Mapping Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/Bars-M"}), + ("YAOGAN", {"country": "China", "mission": "military_recon", "sat_type": "Remote Sensing / ELINT", "wiki": "https://en.wikipedia.org/wiki/Yaogan"}), + ("GAOFEN", {"country": "China", "mission": "military_recon", "sat_type": "High-Res Imaging", "wiki": "https://en.wikipedia.org/wiki/Gaofen"}), + ("JILIN", {"country": "China", "mission": "commercial_imaging", "sat_type": "Video / Imaging", "wiki": "https://en.wikipedia.org/wiki/Jilin-1"}), + ("OFEK", {"country": "Israel", "mission": "military_recon", "sat_type": "Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/Ofeq"}), + ("CSO", {"country": "France", "mission": "military_recon", "sat_type": "Optical Reconnaissance", "wiki": "https://en.wikipedia.org/wiki/CSO_(satellite)"}), + ("IGS", {"country": "Japan", "mission": "military_recon", "sat_type": "Intelligence Gathering", "wiki": "https://en.wikipedia.org/wiki/Information_Gathering_Satellite"}), + # SAR (Synthetic Aperture Radar) — can see through clouds + ("CAPELLA", {"country": "USA", "mission": "sar", "sat_type": "SAR Imaging", "wiki": "https://en.wikipedia.org/wiki/Capella_Space"}), + ("ICEYE", {"country": "Finland", "mission": "sar", "sat_type": "SAR Microsatellite", "wiki": "https://en.wikipedia.org/wiki/ICEYE"}), + ("COSMO-SKYMED", {"country": "Italy", "mission": "sar", "sat_type": "SAR Constellation", "wiki": "https://en.wikipedia.org/wiki/COSMO-SkyMed"}), + ("TANDEM", {"country": "Germany", "mission": "sar", "sat_type": "SAR Interferometry", "wiki": "https://en.wikipedia.org/wiki/TanDEM-X"}), + ("PAZ", {"country": "Spain", "mission": "sar", "sat_type": "SAR Imaging", "wiki": "https://en.wikipedia.org/wiki/PAZ_(satellite)"}), + # Commercial imaging + ("WORLDVIEW", {"country": "USA", "mission": "commercial_imaging", "sat_type": "Maxar High-Res", "wiki": "https://en.wikipedia.org/wiki/WorldView-3"}), + ("GEOEYE", {"country": "USA", "mission": "commercial_imaging", "sat_type": "Maxar Imaging", "wiki": "https://en.wikipedia.org/wiki/GeoEye-1"}), + ("PLEIADES", {"country": "France", "mission": "commercial_imaging", "sat_type": "Airbus Imaging", "wiki": "https://en.wikipedia.org/wiki/Pl%C3%A9iades_(satellite)"}), + ("SPOT", {"country": "France", "mission": "commercial_imaging", "sat_type": "Airbus Medium-Res", "wiki": "https://en.wikipedia.org/wiki/SPOT_(satellite)"}), + ("PLANET", {"country": "USA", "mission": "commercial_imaging", "sat_type": "PlanetScope", "wiki": "https://en.wikipedia.org/wiki/Planet_Labs"}), + ("SKYSAT", {"country": "USA", "mission": "commercial_imaging", "sat_type": "Planet Video", "wiki": "https://en.wikipedia.org/wiki/SkySat"}), + ("BLACKSKY", {"country": "USA", "mission": "commercial_imaging", "sat_type": "BlackSky Imaging", "wiki": "https://en.wikipedia.org/wiki/BlackSky"}), + # Signals intelligence / ELINT + ("NROL", {"country": "USA", "mission": "sigint", "sat_type": "Classified NRO", "wiki": "https://en.wikipedia.org/wiki/National_Reconnaissance_Office"}), + ("MENTOR", {"country": "USA", "mission": "sigint", "sat_type": "SIGINT / ELINT", "wiki": "https://en.wikipedia.org/wiki/Mentor_(satellite)"}), + ("LUCH", {"country": "Russia", "mission": "sigint", "sat_type": "Relay / SIGINT", "wiki": "https://en.wikipedia.org/wiki/Luch_(satellite)"}), + ("SHIJIAN", {"country": "China", "mission": "sigint", "sat_type": "ELINT / Tech Demo", "wiki": "https://en.wikipedia.org/wiki/Shijian"}), + # Navigation + ("NAVSTAR", {"country": "USA", "mission": "navigation", "sat_type": "GPS", "wiki": "https://en.wikipedia.org/wiki/GPS_satellite_blocks"}), + ("GLONASS", {"country": "Russia", "mission": "navigation", "sat_type": "GLONASS", "wiki": "https://en.wikipedia.org/wiki/GLONASS"}), + ("BEIDOU", {"country": "China", "mission": "navigation", "sat_type": "BeiDou", "wiki": "https://en.wikipedia.org/wiki/BeiDou"}), + ("GALILEO", {"country": "EU", "mission": "navigation", "sat_type": "Galileo", "wiki": "https://en.wikipedia.org/wiki/Galileo_(satellite_navigation)"}), + # Early warning + ("SBIRS", {"country": "USA", "mission": "early_warning", "sat_type": "Missile Warning", "wiki": "https://en.wikipedia.org/wiki/Space-Based_Infrared_System"}), + ("TUNDRA", {"country": "Russia", "mission": "early_warning", "sat_type": "Missile Warning", "wiki": "https://en.wikipedia.org/wiki/Tundra_(satellite)"}), + # Space stations + ("ISS", {"country": "Intl", "mission": "space_station", "sat_type": "Space Station", "wiki": "https://en.wikipedia.org/wiki/International_Space_Station"}), + ("TIANGONG", {"country": "China", "mission": "space_station", "sat_type": "Space Station", "wiki": "https://en.wikipedia.org/wiki/Tiangong_space_station"}), +] + +def fetch_satellites(): + sats = [] + try: + # Cache GP data from CelesTrak — only re-download every 30 minutes + # Positions are re-propagated from cached orbital elements each cycle + now_ts = time.time() + if _sat_gp_cache["data"] is None or (now_ts - _sat_gp_cache["last_fetch"]) > 1800: + url = "https://celestrak.org/NORAD/elements/gp.php?GROUP=active&FORMAT=json" + response = fetch_with_curl(url, timeout=15) + if response.status_code == 200: + _sat_gp_cache["data"] = response.json() + _sat_gp_cache["last_fetch"] = now_ts + logger.info(f"Satellites: Downloaded {len(_sat_gp_cache['data'])} GP records from CelesTrak") + + data = _sat_gp_cache["data"] + if not data: + logger.warning("No satellite GP data available") + latest_data["satellites"] = sats + return + + # Only keep satellites matching the intel classification DB + classified = [] + for sat in data: + name = sat.get("OBJECT_NAME", "UNKNOWN").upper() + intel = None + for key, meta in _SAT_INTEL_DB: + if key.upper() in name: + intel = dict(meta) + break + if not intel: + continue # Skip junk, debris, CubeSats, bulk constellations + entry = { + "id": sat.get("NORAD_CAT_ID"), + "name": sat.get("OBJECT_NAME", "UNKNOWN"), + "MEAN_MOTION": sat.get("MEAN_MOTION"), + "ECCENTRICITY": sat.get("ECCENTRICITY"), + "INCLINATION": sat.get("INCLINATION"), + "RA_OF_ASC_NODE": sat.get("RA_OF_ASC_NODE"), + "ARG_OF_PERICENTER": sat.get("ARG_OF_PERICENTER"), + "MEAN_ANOMALY": sat.get("MEAN_ANOMALY"), + "BSTAR": sat.get("BSTAR"), + "EPOCH": sat.get("EPOCH"), + } + entry.update(intel) + classified.append(entry) + + all_sats = classified + logger.info(f"Satellites: {len(classified)} intel-classified out of {len(data)} total in catalog") + + # Propagate orbital elements to get current lat/lng/alt using SGP4 + now = datetime.utcnow() + jd, fr = jday(now.year, now.month, now.day, now.hour, now.minute, now.second + now.microsecond / 1e6) + + for s in all_sats: + try: + mean_motion = s.get('MEAN_MOTION') + ecc = s.get('ECCENTRICITY') + incl = s.get('INCLINATION') + raan = s.get('RA_OF_ASC_NODE') + argp = s.get('ARG_OF_PERICENTER') + ma = s.get('MEAN_ANOMALY') + bstar = s.get('BSTAR', 0) + epoch_str = s.get('EPOCH') + norad_id = s.get('NORAD_CAT_ID', 0) + + if mean_motion is None or ecc is None or incl is None: + continue + + epoch_dt = datetime.strptime(epoch_str[:19], '%Y-%m-%dT%H:%M:%S') + epoch_jd, epoch_fr = jday(epoch_dt.year, epoch_dt.month, epoch_dt.day, + epoch_dt.hour, epoch_dt.minute, epoch_dt.second) + + sat_obj = Satrec() + sat_obj.sgp4init( + WGS72, 'i', norad_id, + (epoch_jd + epoch_fr) - 2433281.5, + bstar, 0.0, 0.0, ecc, + math.radians(argp), math.radians(incl), + math.radians(ma), + mean_motion * 2 * math.pi / 1440.0, + math.radians(raan) + ) + + e, r, v = sat_obj.sgp4(jd, fr) + if e != 0: + continue + + x, y, z = r + gmst = _gmst(jd + fr) + lng_rad = math.atan2(y, x) - gmst + lat_rad = math.atan2(z, math.sqrt(x*x + y*y)) + alt_km = math.sqrt(x*x + y*y + z*z) - 6371.0 + + s['lat'] = round(math.degrees(lat_rad), 4) + lng_deg = math.degrees(lng_rad) % 360 + s['lng'] = round(lng_deg - 360 if lng_deg > 180 else lng_deg, 4) + s['alt_km'] = round(alt_km, 1) + + # Compute ground speed and heading from ECI velocity vector + # v is in km/s in ECI frame; subtract Earth rotation to get ground-relative + vx, vy, vz = v + omega_e = 7.2921159e-5 # Earth rotation rate rad/s + # Ground-relative velocity (subtract Earth rotation) + vx_g = vx + omega_e * y # note: y from position, not vy + vy_g = vy - omega_e * x + vz_g = vz + # Convert ECI velocity to East/North/Up at satellite's geodetic position + cos_lat = math.cos(lat_rad) + sin_lat = math.sin(lat_rad) + cos_lng = math.cos(lng_rad + gmst) # need ECEF longitude + sin_lng = math.sin(lng_rad + gmst) + # East = -sin(lng)*vx + cos(lng)*vy + v_east = -sin_lng * vx_g + cos_lng * vy_g + # North = -sin(lat)*cos(lng)*vx - sin(lat)*sin(lng)*vy + cos(lat)*vz + v_north = -sin_lat * cos_lng * vx_g - sin_lat * sin_lng * vy_g + cos_lat * vz_g + # Ground speed in km/s → knots (1 km/s = 1943.84 knots) + ground_speed_kms = math.sqrt(v_east**2 + v_north**2) + s['speed_knots'] = round(ground_speed_kms * 1943.84, 1) + # Heading: angle from north, clockwise + heading_rad = math.atan2(v_east, v_north) + s['heading'] = round(math.degrees(heading_rad) % 360, 1) + # Wikipedia URL: USA-XXX satellites get their own article, + # all others keep the curated class/type URL from _SAT_INTEL_DB + sat_name = s.get('name', '') + usa_match = re.search(r'USA[\s\-]*(\d+)', sat_name) + if usa_match: + s['wiki'] = f"https://en.wikipedia.org/wiki/USA-{usa_match.group(1)}" + # Strip GP element fields to save bandwidth + for k in ('MEAN_MOTION', 'ECCENTRICITY', 'INCLINATION', + 'RA_OF_ASC_NODE', 'ARG_OF_PERICENTER', 'MEAN_ANOMALY', + 'BSTAR', 'EPOCH', 'tle1', 'tle2'): + s.pop(k, None) + sats.append(s) + except Exception: + continue + + logger.info(f"Satellites: {len(classified)} classified, {len(sats)} positioned") + except Exception as e: + logger.error(f"Error fetching satellites: {e}") + # Only overwrite if we got data — don't wipe the map on API timeout + if sats: + latest_data["satellites"] = sats + elif not latest_data.get("satellites"): + latest_data["satellites"] = [] + +def fetch_uavs(): + # Simulated high-altitude long-endurance (HALE) and MALE UAVs over high-risk regions + + uav_targets = [ + { + "name": "RQ-4 Global Hawk", "center": [31.5, 34.8], "radius": 0.5, "alt": 15000, + "country": "USA", "uav_type": "HALE Surveillance", "range_km": 2200, + "wiki": "https://en.wikipedia.org/wiki/Northrop_Grumman_RQ-4_Global_Hawk", + "speed_knots": 340 + }, + { + "name": "MQ-9 Reaper", "center": [49.0, 31.4], "radius": 1.2, "alt": 12000, + "country": "USA", "uav_type": "MALE Strike/ISR", "range_km": 1850, + "wiki": "https://en.wikipedia.org/wiki/General_Atomics_MQ-9_Reaper", + "speed_knots": 250 + }, + { + "name": "Bayraktar TB2", "center": [23.6, 120.9], "radius": 0.8, "alt": 8000, + "country": "Turkey", "uav_type": "MALE Strike", "range_km": 150, + "wiki": "https://en.wikipedia.org/wiki/Bayraktar_TB2", + "speed_knots": 120 + }, + { + "name": "MQ-1C Gray Eagle", "center": [38.0, 127.0], "radius": 0.4, "alt": 10000, + "country": "USA", "uav_type": "MALE ISR/Strike", "range_km": 400, + "wiki": "https://en.wikipedia.org/wiki/General_Atomics_MQ-1C_Gray_Eagle", + "speed_knots": 150 + }, + { + "name": "RQ-170 Sentinel", "center": [25.0, 55.0], "radius": 1.5, "alt": 18000, + "country": "USA", "uav_type": "Stealth ISR", "range_km": 1100, + "wiki": "https://en.wikipedia.org/wiki/Lockheed_Martin_RQ-170_Sentinel", + "speed_knots": 300 + } + ] + + # Use the current hour and minute to create a continuous slow orbit + now = datetime.utcnow() + # 1 full orbit every 10 minutes + time_factor = ((now.minute % 10) * 60 + now.second) / 600.0 + angle = time_factor * 2 * math.pi + + uavs = [] + for idx, t in enumerate(uav_targets): + # Offset the angle slightly so they aren't all synchronized + offset_angle = angle + (idx * math.pi / 2.5) + + lat = t["center"][0] + math.sin(offset_angle) * t["radius"] + lng = t["center"][1] + math.cos(offset_angle) * t["radius"] + + heading = (math.degrees(offset_angle) + 90) % 360 + + uavs.append({ + "id": f"uav-{idx}", + "callsign": t["name"], + "aircraft_model": t["name"], + "lat": lat, + "lng": lng, + "alt": t["alt"], + "heading": heading, + "speed_knots": t["speed_knots"], + "center": t["center"], + "orbit_radius": t["radius"], + "range_km": t["range_km"], + "country": t["country"], + "uav_type": t["uav_type"], + "wiki": t["wiki"], + }) + + latest_data['uavs'] = uavs + +cached_airports = [] +flight_trails = {} # {icao_hex: {points: [[lat, lng, alt, ts], ...], last_seen: ts}} + +# (math imported at module top) + +def find_nearest_airport(lat, lng, max_distance_nm=200): + """Find the nearest large airport to a given lat/lng using haversine distance. + Returns dict with iata, name, lat, lng, distance_nm or None if no airport within range.""" + if not cached_airports: + return None + + best = None + best_dist = float('inf') + + lat_r = math.radians(lat) + lng_r = math.radians(lng) + + for apt in cached_airports: + apt_lat_r = math.radians(apt['lat']) + apt_lng_r = math.radians(apt['lng']) + + dlat = apt_lat_r - lat_r + dlng = apt_lng_r - lng_r + a = math.sin(dlat / 2) ** 2 + math.cos(lat_r) * math.cos(apt_lat_r) * math.sin(dlng / 2) ** 2 + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + dist_nm = 3440.065 * c # Earth radius in nautical miles + + if dist_nm < best_dist: + best_dist = dist_nm + best = apt + + if best and best_dist <= max_distance_nm: + return { + "iata": best['iata'], + "name": best['name'], + "lat": best['lat'], + "lng": best['lng'], + "distance_nm": round(best_dist, 1) + } + return None + +def fetch_airports(): + global cached_airports + if not cached_airports: + logger.info("Downloading global airports database from ourairports.com...") + try: + url = "https://ourairports.com/data/airports.csv" + response = fetch_with_curl(url, timeout=15) + if response.status_code == 200: + import csv + import io + f = io.StringIO(response.text) + reader = csv.DictReader(f) + for row in reader: + # Filter to only large international hubs that have an IATA code assigned + if row['type'] == 'large_airport' and row['iata_code']: + cached_airports.append({ + "id": row['ident'], + "name": row['name'], + "iata": row['iata_code'], + "lat": float(row['latitude_deg']), + "lng": float(row['longitude_deg']), + "type": "airport" + }) + logger.info(f"Loaded {len(cached_airports)} large airports into cache.") + except Exception as e: + logger.error(f"Error fetching airports: {e}") + + latest_data['airports'] = cached_airports + +from services.geopolitics import fetch_ukraine_frontlines, fetch_global_military_incidents + +def fetch_geopolitics(): + logger.info("Fetching Geopolitics data...") + try: + frontlines = fetch_ukraine_frontlines() + if frontlines: + latest_data['frontlines'] = frontlines + + gdelt = fetch_global_military_incidents() + if gdelt is not None: + latest_data['gdelt'] = gdelt + except Exception as e: + logger.error(f"Error fetching geopolitics: {e}") + +def update_liveuamap(): + logger.info("Running scheduled Liveuamap scraper...") + try: + from services.liveuamap_scraper import fetch_liveuamap + res = fetch_liveuamap() + if res: + latest_data['liveuamap'] = res + except Exception as e: + logger.error(f"Liveuamap scraper error: {e}") + +def update_fast_data(): + """Fast-tier: moving entities that need frequent updates (every 60s).""" + logger.info("Fast-tier data update starting...") + fast_funcs = [ + fetch_flights, + fetch_military_flights, + fetch_ships, + fetch_uavs, + fetch_satellites, + ] + with concurrent.futures.ThreadPoolExecutor(max_workers=len(fast_funcs)) as executor: + futures = [executor.submit(func) for func in fast_funcs] + concurrent.futures.wait(futures) + with _data_lock: + latest_data['last_updated'] = datetime.utcnow().isoformat() + logger.info("Fast-tier update complete.") + +def update_slow_data(): + """Slow-tier: feeds that change infrequently (every 30min).""" + logger.info("Slow-tier data update starting...") + slow_funcs = [ + fetch_news, + fetch_defense_stocks, + fetch_oil_prices, + fetch_weather, + fetch_cctv, + fetch_earthquakes, + fetch_geopolitics, + ] + with concurrent.futures.ThreadPoolExecutor(max_workers=len(slow_funcs)) as executor: + futures = [executor.submit(func) for func in slow_funcs] + concurrent.futures.wait(futures) + logger.info("Slow-tier update complete.") + +def update_all_data(): + """Full update — runs on startup. Fast and slow tiers run IN PARALLEL for fastest startup.""" + logger.info("Full data update starting (parallel)...") + fetch_airports() # Cached after first download + # Run fast + slow in parallel so the user sees data ASAP + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool: + f1 = pool.submit(update_fast_data) + f2 = pool.submit(update_slow_data) + concurrent.futures.wait([f1, f2]) + logger.info("Full data update complete.") + +scheduler = BackgroundScheduler() + +def start_scheduler(): + init_db() + + # Run full update once on startup + scheduler.add_job(update_all_data, 'date', run_date=datetime.now()) + + # Fast tier: every 60 seconds (flights, ships, military, satellites, UAVs) + scheduler.add_job(update_fast_data, 'interval', seconds=60) + + # Slow tier: every 30 minutes (news, stocks, weather, geopolitics) + scheduler.add_job(update_slow_data, 'interval', minutes=30) + + # CCTV pipeline has its own cadence + def update_cctvs(): + logger.info("Running CCTV Pipeline Ingestion...") + ingestors = [ + TFLJamCamIngestor, + LTASingaporeIngestor, + AustinTXIngestor, + NYCDOTIngestor + ] + for ingestor in ingestors: + try: + ingestor().ingest() + except Exception as e: + logger.error(f"Failed {ingestor.__name__} cctv ingest: {e}") + fetch_cctv() + + scheduler.add_job(update_cctvs, 'date', run_date=datetime.now()) + scheduler.add_job(update_cctvs, 'interval', minutes=1) + + # Liveuamap: startup + every 12 hours + scheduler.add_job(update_liveuamap, 'date', run_date=datetime.now()) + scheduler.add_job(update_liveuamap, 'interval', hours=12) + + # Geopolitics (frontlines) more frequently than other slow data + scheduler.add_job(fetch_geopolitics, 'interval', minutes=5) + + scheduler.start() + +def stop_scheduler(): + scheduler.shutdown() + +def get_latest_data(): + return latest_data + diff --git a/backend/services/geopolitics.py b/backend/services/geopolitics.py new file mode 100644 index 0000000..57b41a0 --- /dev/null +++ b/backend/services/geopolitics.py @@ -0,0 +1,301 @@ +import requests +import logging +from cachetools import cached, TTLCache +from datetime import datetime +from services.network_utils import fetch_with_curl + +logger = logging.getLogger(__name__) + +# Cache Frontline data for 30 minutes, it doesn't move that fast +frontline_cache = TTLCache(maxsize=1, ttl=1800) + +@cached(frontline_cache) +def fetch_ukraine_frontlines(): + """ + Fetches the latest GeoJSON data representing the Ukraine frontline. + We use the cyterat/deepstate-map-data github mirror since the public API is locked. + """ + try: + logger.info("Fetching DeepStateMap from GitHub mirror...") + + # First, query the repo tree to find the latest file name + tree_url = "https://api.github.com/repos/cyterat/deepstate-map-data/git/trees/main?recursive=1" + res_tree = requests.get(tree_url, timeout=10) + + if res_tree.status_code == 200: + tree_data = res_tree.json().get("tree", []) + # Filter for geojson files in data folder + geo_files = [item["path"] for item in tree_data if item["path"].startswith("data/deepstatemap_data_") and item["path"].endswith(".geojson")] + + if geo_files: + # Get the alphabetically latest file (since it's named with YYYYMMDD) + latest_file = sorted(geo_files)[-1] + + raw_url = f"https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/{latest_file}" + logger.info(f"Downloading latest DeepStateMap: {raw_url}") + + res_geo = requests.get(raw_url, timeout=20) + if res_geo.status_code == 200: + data = res_geo.json() + + # The Cyterat GitHub mirror strips all properties and just provides a raw array of Feature polygons. + # Based on DeepStateMap's frontend mapping, the array index corresponds to the zone type: + # 0: Russian-occupied areas + # 1: Russian advance + # 2: Liberated area + # 3: Uncontested/Crimea (often folded into occupied) + name_map = { + 0: "Russian-occupied areas", + 1: "Russian advance", + 2: "Liberated area", + 3: "Russian-occupied areas", # Crimea / LPR / DPR + 4: "Directions of UA attacks" + } + + if "features" in data: + for idx, feature in enumerate(data["features"]): + if "properties" not in feature or feature["properties"] is None: + feature["properties"] = {} + + feature["properties"]["name"] = name_map.get(idx, "Russian-occupied areas") + feature["properties"]["zone_id"] = idx + + return data + else: + logger.error(f"Failed to fetch parsed Github Raw GeoJSON: {res_geo.status_code}") + else: + logger.error(f"Failed to fetch Github Tree for Deepstatemap: {res_tree.status_code}") + except Exception as e: + logger.error(f"Error fetching DeepStateMap: {e}") + return None + +# Cache GDELT data for 6 hours - heavy aggregation, data doesn't change rapidly +gdelt_cache = TTLCache(maxsize=1, ttl=21600) + +def _extract_domain(url): + """Extract a clean source name from a URL, e.g. 'nytimes.com' from 'https://www.nytimes.com/...'""" + try: + from urllib.parse import urlparse + host = urlparse(url).hostname or '' + # Strip www. prefix + if host.startswith('www.'): + host = host[4:] + return host + except Exception: + return url[:40] + +def _url_to_headline(url): + """Extract a human-readable headline from a URL path. + e.g. 'https://nytimes.com/2026/03/us-strikes-iran-nuclear-sites.html' -> 'Us Strikes Iran Nuclear Sites (nytimes.com)' + """ + try: + from urllib.parse import urlparse, unquote + parsed = urlparse(url) + domain = parsed.hostname or '' + if domain.startswith('www.'): + domain = domain[4:] + + # Get last meaningful path segment + path = unquote(parsed.path).strip('/') + if not path: + return domain + + # Take the last path segment (usually the slug) + slug = path.split('/')[-1] + # Remove file extensions + for ext in ['.html', '.htm', '.php', '.asp', '.aspx', '.shtml']: + if slug.lower().endswith(ext): + slug = slug[:-len(ext)] + # If slug is purely numeric or a short ID, try the second-to-last segment + import re + if re.match(r'^[a-z]?\d{5,}$', slug, re.IGNORECASE): + segments = path.split('/') + if len(segments) >= 2: + slug = segments[-2] + for ext in ['.html', '.htm', '.php']: + if slug.lower().endswith(ext): + slug = slug[:-len(ext)] + # Remove common ID patterns at start/end + slug = re.sub(r'^[\d]+-', '', slug) # leading numbers like "13847569-" + slug = re.sub(r'-[\da-f]{6,}$', '', slug) # trailing hex IDs + slug = re.sub(r'[-_]c-\d+$', '', slug) # trailing "-c-21803431" + slug = re.sub(r'^p=\d+$', '', slug) # WordPress ?p=1234 + # Convert slug separators to spaces + slug = slug.replace('-', ' ').replace('_', ' ') + # Clean up multiple spaces + slug = re.sub(r'\s+', ' ', slug).strip() + + # If slug is still just a number or too short, fall back to domain + if len(slug) < 5 or re.match(r'^\d+$', slug): + return domain + + # Title case and truncate + headline = slug.title() + if len(headline) > 80: + headline = headline[:77] + '...' + return f"{headline} ({domain})" + except Exception: + return url[:60] + +def _parse_gdelt_export_zip(zip_bytes, conflict_codes, seen_locs, features, loc_index): + """Parse a single GDELT export ZIP and append conflict features. + loc_index maps loc_key -> index in features list for fast duplicate merging. + """ + import csv, io, zipfile + try: + zf = zipfile.ZipFile(io.BytesIO(zip_bytes)) + csv_name = zf.namelist()[0] + with zf.open(csv_name) as cf: + reader = csv.reader(io.TextIOWrapper(cf, encoding='utf-8', errors='replace'), delimiter='\t') + for row in reader: + try: + if len(row) < 61: + continue + event_code = row[26][:2] if len(row[26]) >= 2 else '' + if event_code not in conflict_codes: + continue + lat = float(row[56]) if row[56] else None + lng = float(row[57]) if row[57] else None + if lat is None or lng is None or (lat == 0 and lng == 0): + continue + + source_url = row[60].strip() if len(row) > 60 else '' + location = row[52].strip() if len(row) > 52 else 'Unknown' + actor1 = row[6].strip() if len(row) > 6 else '' + actor2 = row[16].strip() if len(row) > 16 else '' + + loc_key = f"{round(lat, 1)}_{round(lng, 1)}" + if loc_key in seen_locs: + # Merge: increment count and add source URL if new (dedup by domain) + idx = loc_index[loc_key] + feat = features[idx] + feat["properties"]["count"] = feat["properties"].get("count", 1) + 1 + urls = feat["properties"].get("_urls", []) + seen_domains = feat["properties"].get("_domains", set()) + if source_url: + domain = _extract_domain(source_url) + if domain not in seen_domains and len(urls) < 10: + urls.append(source_url) + seen_domains.add(domain) + feat["properties"]["_urls"] = urls + feat["properties"]["_domains"] = seen_domains + continue + seen_locs.add(loc_key) + + name = location or (f"{actor1} vs {actor2}" if actor1 and actor2 else actor1) or "Unknown Incident" + domain = _extract_domain(source_url) if source_url else '' + loc_index[loc_key] = len(features) + features.append({ + "type": "Feature", + "properties": { + "name": name, + "count": 1, + "_urls": [source_url] if source_url else [], + "_domains": {domain} if domain else set(), + }, + "geometry": {"type": "Point", "coordinates": [lng, lat]}, + "_loc_key": loc_key + }) + except (ValueError, IndexError): + continue + except Exception as e: + logger.warning(f"Failed to parse GDELT export zip: {e}") + +def _download_gdelt_export(url): + """Download a single GDELT export file, return bytes or None.""" + try: + res = fetch_with_curl(url, timeout=15) + if res.status_code == 200: + return res.content + except Exception: + pass + return None + +@cached(gdelt_cache) +def fetch_global_military_incidents(): + """ + Fetches global military/conflict incidents from GDELT Events Export files. + Aggregates the last ~8 hours of 15-minute exports to build ~1000 incidents. + """ + from datetime import timedelta + from concurrent.futures import ThreadPoolExecutor + + try: + logger.info("Fetching GDELT events via export CDN (multi-file)...") + + # Get the latest export URL to determine current timestamp + index_res = fetch_with_curl("http://data.gdeltproject.org/gdeltv2/lastupdate.txt", timeout=10) + if index_res.status_code != 200: + logger.error(f"GDELT lastupdate failed: {index_res.status_code}") + return [] + + # Extract latest export URL and its timestamp + latest_url = None + for line in index_res.text.strip().split('\n'): + parts = line.strip().split() + if len(parts) >= 3 and parts[2].endswith('.export.CSV.zip'): + latest_url = parts[2] + break + + if not latest_url: + logger.error("Could not find GDELT export URL") + return [] + + # Extract timestamp from URL like: http://data.gdeltproject.org/gdeltv2/20260301120000.export.CSV.zip + import re + ts_match = re.search(r'(\d{14})\.export\.CSV\.zip', latest_url) + if not ts_match: + logger.error("Could not parse GDELT export timestamp") + return [] + + latest_ts = datetime.strptime(ts_match.group(1), '%Y%m%d%H%M%S') + + # Generate URLs for the last 8 hours (32 files at 15-min intervals) + NUM_FILES = 32 + urls = [] + for i in range(NUM_FILES): + ts = latest_ts - timedelta(minutes=15 * i) + fname = ts.strftime('%Y%m%d%H%M%S') + '.export.CSV.zip' + url = f"http://data.gdeltproject.org/gdeltv2/{fname}" + urls.append(url) + + logger.info(f"Downloading {len(urls)} GDELT export files...") + + # Download in parallel (8 threads) + with ThreadPoolExecutor(max_workers=8) as executor: + zip_results = list(executor.map(_download_gdelt_export, urls)) + + successful = sum(1 for r in zip_results if r is not None) + logger.info(f"Downloaded {successful}/{len(urls)} GDELT exports") + + # Parse all downloaded files + CONFLICT_CODES = {'14', '17', '18', '19', '20'} + features = [] + seen_locs = set() + loc_index = {} # loc_key -> index in features + + for zip_bytes in zip_results: + if zip_bytes: + _parse_gdelt_export_zip(zip_bytes, CONFLICT_CODES, seen_locs, features, loc_index) + + # Build URL + headline arrays for frontend rendering + for f in features: + urls = f["properties"].pop("_urls", []) + f["properties"].pop("_domains", None) + headlines = [_url_to_headline(u) for u in urls] + f["properties"]["_urls_list"] = urls + f["properties"]["_headlines_list"] = headlines + # Keep html as fallback + if urls: + links = [f'
{h}
' for u, h in zip(urls, headlines)] + f["properties"]["html"] = ''.join(links) + else: + f["properties"]["html"] = f["properties"]["name"] + f.pop("_loc_key", None) + + logger.info(f"GDELT multi-file parsed: {len(features)} conflict locations from {successful} files") + return features + + except Exception as e: + logger.error(f"Error fetching GDELT data: {e}") + return [] diff --git a/backend/services/liveuamap_scraper.py b/backend/services/liveuamap_scraper.py new file mode 100644 index 0000000..da760c9 --- /dev/null +++ b/backend/services/liveuamap_scraper.py @@ -0,0 +1,98 @@ +import json +import logging +import base64 +import urllib.parse +import re +from playwright.sync_api import sync_playwright +from playwright_stealth import stealth_sync + +logger = logging.getLogger(__name__) + +def fetch_liveuamap(): + logger.info("Starting Liveuamap scraper with Playwright Stealth...") + + regions = [ + {"name": "Ukraine", "url": "https://liveuamap.com"}, + {"name": "Middle East", "url": "https://mideast.liveuamap.com"}, + {"name": "Israel-Palestine", "url": "https://israelpalestine.liveuamap.com"}, + {"name": "Syria", "url": "https://syria.liveuamap.com"} + ] + + all_markers = [] + seen_ids = set() + + with sync_playwright() as p: + # Launching with a real user agent to bypass Turnstile + browser = p.chromium.launch(headless=False, args=["--disable-blink-features=AutomationControlled"]) + context = browser.new_context( + user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + viewport={"width": 1920, "height": 1080}, + color_scheme="dark" + ) + page = context.new_page() + stealth_sync(page) + + for region in regions: + try: + logger.info(f"Scraping Liveuamap region: {region['name']}") + page.goto(region["url"], timeout=60000, wait_until="domcontentloaded") + + # Wait for the map canvas or markers script to load, max 10s wait + try: + page.wait_for_timeout(5000) + except: + pass + + html = page.content() + + m = re.search(r"var\s+ovens\s*=\s*(.*?);(?!function)", html, re.DOTALL) + if not m: + logger.warning(f"Could not find 'ovens' data for {region['name']} in raw HTML") + # Let's try grabbing the evaluated JavaScript variable if it's there + try: + ovens_json = page.evaluate("() => typeof ovens !== 'undefined' ? JSON.stringify(ovens) : null") + if ovens_json: + markers = json.loads(ovens_json) + # process below + html = f"var ovens={ovens_json};" + m = re.search(r"var\s+ovens=(.*?);", html, re.DOTALL) + except: + pass + + if m: + json_str = m.group(1).strip() + if json_str.startswith("'") or json_str.startswith('"'): + json_str = json_str.strip('"\'') + json_str = base64.b64decode(urllib.parse.unquote(json_str)).decode('utf-8') + + try: + markers = json.loads(json_str) + for marker in markers: + mid = marker.get("id") + if mid and mid not in seen_ids: + seen_ids.add(mid) + all_markers.append({ + "id": mid, + "type": "liveuamap", + "title": marker.get("s", "Unknown Event") or marker.get("title", ""), + "lat": marker.get("lat"), + "lng": marker.get("lng"), + "timestamp": marker.get("time", ""), + "link": marker.get("link", region["url"]), + "region": region["name"] + }) + except Exception as e: + logger.error(f"Error parsing JSON for {region['name']}: {e}") + + except Exception as e: + logger.error(f"Error scraping Liveuamap {region['name']}: {e}") + + browser.close() + + logger.info(f"Liveuamap scraper finished, extracted {len(all_markers)} unique markers.") + return all_markers + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + res = fetch_liveuamap() + print(json.dumps(res[:3], indent=2)) diff --git a/backend/services/network_utils.py b/backend/services/network_utils.py new file mode 100644 index 0000000..f7ded8a --- /dev/null +++ b/backend/services/network_utils.py @@ -0,0 +1,90 @@ +import logging +import json +import subprocess +import shutil +import time +from urllib.parse import urlparse + +logger = logging.getLogger(__name__) + +# Find bash for curl fallback — Git bash's curl has the TLS features +# needed to pass CDN fingerprint checks (brotli, zstd, libpsl) +_BASH_PATH = shutil.which("bash") or "bash" + +# Cache domains where requests fails — skip straight to curl for 5 minutes +_domain_fail_cache: dict[str, float] = {} +_DOMAIN_FAIL_TTL = 300 # 5 minutes + +class _DummyResponse: + """Minimal response object matching requests.Response interface.""" + def __init__(self, status_code, text): + self.status_code = status_code + self.text = text + self.content = text.encode('utf-8', errors='replace') + + def json(self): + return json.loads(self.text) + + def raise_for_status(self): + if self.status_code >= 400: + raise Exception(f"HTTP {self.status_code}: {self.text[:100]}") + + +def fetch_with_curl(url, method="GET", json_data=None, timeout=15, headers=None): + """Wrapper to bypass aggressive local firewall that blocks Python but permits curl. + + Falls back to running curl through Git bash, which has the TLS features + (brotli, zstd, libpsl) needed to pass CDN fingerprint checks that block + both Python requests and the barebones Windows system curl. + """ + default_headers = { + "User-Agent": "ShadowBroker-OSINT/1.0 (live-risk-dashboard)", + } + if headers: + default_headers.update(headers) + + domain = urlparse(url).netloc + + # Check if this domain recently failed with requests — skip straight to curl + if domain in _domain_fail_cache and (time.time() - _domain_fail_cache[domain]) < _DOMAIN_FAIL_TTL: + pass # Fall through to curl below + else: + try: + import requests + if method == "POST": + res = requests.post(url, json=json_data, timeout=timeout, headers=default_headers) + else: + res = requests.get(url, timeout=timeout, headers=default_headers) + res.raise_for_status() + # Clear failure cache on success + _domain_fail_cache.pop(domain, None) + return res + except Exception as e: + logger.warning(f"Python requests failed for {url} ({e}), falling back to bash curl...") + _domain_fail_cache[domain] = time.time() + + # Build curl command string for bash execution + header_flags = " ".join(f'-H "{k}: {v}"' for k, v in default_headers.items()) + if method == "POST" and json_data: + payload = json.dumps(json_data).replace('"', '\\"') + curl_cmd = f'curl -s -w "\\n%{{http_code}}" {header_flags} -X POST -H "Content-Type: application/json" -d "{payload}" "{url}"' + else: + curl_cmd = f'curl -s -w "\\n%{{http_code}}" {header_flags} "{url}"' + + try: + res = subprocess.run( + [_BASH_PATH, "-c", curl_cmd], + capture_output=True, text=True, timeout=timeout + 5 + ) + if res.returncode == 0 and res.stdout.strip(): + # Parse HTTP status code from -w output (last line) + lines = res.stdout.rstrip().rsplit("\n", 1) + body = lines[0] if len(lines) > 1 else res.stdout + http_code = int(lines[-1]) if len(lines) > 1 and lines[-1].strip().isdigit() else 200 + return _DummyResponse(http_code, body) + else: + logger.error(f"bash curl fallback failed: exit={res.returncode} stderr={res.stderr[:200]}") + return _DummyResponse(500, "") + except Exception as curl_e: + logger.error(f"bash curl fallback exception: {curl_e}") + return _DummyResponse(500, "") diff --git a/backend/services/radio_intercept.py b/backend/services/radio_intercept.py new file mode 100644 index 0000000..cba2656 --- /dev/null +++ b/backend/services/radio_intercept.py @@ -0,0 +1,177 @@ +import requests +from bs4 import BeautifulSoup +import logging +from cachetools import cached, TTLCache +import cloudscraper +import reverse_geocoder as rg + +logger = logging.getLogger(__name__) + +# Cache the top feeds for 5 minutes so we don't hammer Broadcastify +radio_cache = TTLCache(maxsize=1, ttl=300) + +@cached(radio_cache) +def get_top_broadcastify_feeds(): + """ + Scrapes the Broadcastify Top 50 live audio feeds public dashboard. + Returns a list of dictionaries containing feed metadata and direct stream URLs. + """ + logger.info("Scraping Broadcastify Top Feeds (Cache Miss)") + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.9', + } + + try: + res = requests.get("https://www.broadcastify.com/listen/top", headers=headers, timeout=10) + if res.status_code != 200: + logger.error(f"Broadcastify Scrape Failed: HTTP {res.status_code}") + return [] + + soup = BeautifulSoup(res.text, 'html.parser') + + table = soup.find('table', {'class': 'btable'}) + if not table: + logger.error("Could not find feeds table on Broadcastify.") + return [] + + feeds = [] + rows = table.find_all('tr')[1:] # Skip header row + + for row in rows: + cols = row.find_all('td') + if len(cols) >= 5: + # Top layout: [Listeners, Feed ID (hidden), Location, Feed Name, Category, Genre] + listeners_str = cols[0].text.strip().replace(',', '') + listeners = int(listeners_str) if listeners_str.isdigit() else 0 + + link_tag = cols[2].find('a') + if not link_tag: + continue + + href = link_tag.get('href', '') + feed_id = href.split('/')[-1] if '/listen/feed/' in href else None + + if not feed_id: + continue + + location = cols[1].text.strip() + name = cols[2].text.strip() + category = cols[3].text.strip() + + feeds.append({ + "id": feed_id, + "listeners": listeners, + "location": location, + "name": name, + "category": category, + "stream_url": f"https://broadcastify.cdnstream1.com/{feed_id}" + }) + + logger.info(f"Successfully scraped {len(feeds)} top feeds from Broadcastify.") + return feeds + + except Exception as e: + logger.error(f"Broadcastify Scrape Exception: {e}") + return [] + +# Cache OpenMHZ systems mapping so we don't have to fetch all 450+ every time +openmhz_systems_cache = TTLCache(maxsize=1, ttl=3600) + +@cached(openmhz_systems_cache) +def get_openmhz_systems(): + """Fetches the full directory of OpenMHZ systems.""" + logger.info("Scraping OpenMHZ Systems (Cache Miss)") + scraper = cloudscraper.create_scraper(browser={'browser': 'chrome', 'platform': 'windows', 'desktop': True}) + + try: + res = scraper.get("https://api.openmhz.com/systems", timeout=15) + if res.status_code == 200: + data = res.json() + # Return list of systems + return data.get('systems', []) if isinstance(data, dict) else [] + return [] + except Exception as e: + logger.error(f"OpenMHZ Systems Scrape Exception: {e}") + return [] + +# Cache specific city calls briefly (15-30s) to limit our polling rate +openmhz_calls_cache = TTLCache(maxsize=100, ttl=20) + +@cached(openmhz_calls_cache) +def get_recent_openmhz_calls(sys_name: str): + """Fetches the actual audio burst .m4a URLs for a specific system (e.g., 'wmata').""" + logger.info(f"Fetching OpenMHZ calls for {sys_name} (Cache Miss)") + scraper = cloudscraper.create_scraper(browser={'browser': 'chrome', 'platform': 'windows', 'desktop': True}) + + try: + url = f"https://api.openmhz.com/{sys_name}/calls" + res = scraper.get(url, timeout=15) + if res.status_code == 200: + data = res.json() + return data.get('calls', []) if isinstance(data, dict) else [] + return [] + except Exception as e: + logger.error(f"OpenMHZ Calls Scrape Exception ({sys_name}): {e}") + return [] + +US_STATES = { + 'Alabama': 'AL', 'Alaska': 'AK', 'Arizona': 'AZ', 'Arkansas': 'AR', 'California': 'CA', + 'Colorado': 'CO', 'Connecticut': 'CT', 'Delaware': 'DE', 'Florida': 'FL', 'Georgia': 'GA', + 'Hawaii': 'HI', 'Idaho': 'ID', 'Illinois': 'IL', 'Indiana': 'IN', 'Iowa': 'IA', + 'Kansas': 'KS', 'Kentucky': 'KY', 'Louisiana': 'LA', 'Maine': 'ME', 'Maryland': 'MD', + 'Massachusetts': 'MA', 'Michigan': 'MI', 'Minnesota': 'MN', 'Mississippi': 'MS', + 'Missouri': 'MO', 'Montana': 'MT', 'Nebraska': 'NE', 'Nevada': 'NV', 'New Hampshire': 'NH', + 'New Jersey': 'NJ', 'New Mexico': 'NM', 'New York': 'NY', 'North Carolina': 'NC', + 'North Dakota': 'ND', 'Ohio': 'OH', 'Oklahoma': 'OK', 'Oregon': 'OR', 'Pennsylvania': 'PA', + 'Rhode Island': 'RI', 'South Carolina': 'SC', 'South Dakota': 'SD', 'Tennessee': 'TN', + 'Texas': 'TX', 'Utah': 'UT', 'Vermont': 'VT', 'Virginia': 'VA', 'Washington': 'WA', + 'West Virginia': 'WV', 'Wisconsin': 'WI', 'Wyoming': 'WY', 'Washington, D.C.': 'DC', 'District of Columbia': 'DC' +} + +import math + +def haversine_distance(lat1, lon1, lat2, lon2): + R = 3958.8 # Earth radius in miles + dLat = math.radians(lat2 - lat1) + dLon = math.radians(lon2 - lon1) + a = math.sin(dLat/2) * math.sin(dLat/2) + \ + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * \ + math.sin(dLon/2) * math.sin(dLon/2) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) + return R * c + +def find_nearest_openmhz_systems_list(lat: float, lng: float, limit: int = 5): + """ + Finds the strictly nearest OpenMHZ systems by distance. + """ + systems = get_openmhz_systems() + if not systems: + return [] + + # Calculate distance for all systems that provide coordinates + valid_systems = [] + for s in systems: + s_lat = s.get('lat') + s_lng = s.get('lng') + if s_lat is not None and s_lng is not None: + dist = haversine_distance(lat, lng, float(s_lat), float(s_lng)) + s['distance_miles'] = dist + valid_systems.append(s) + + if not valid_systems: + return [] + + # Sort strictly by distance + valid_systems.sort(key=lambda x: x['distance_miles']) + return valid_systems[:limit] + +def find_nearest_openmhz_system(lat: float, lng: float): + """ + Returns the single closest OpenMHZ system by distance. + """ + nearest = find_nearest_openmhz_systems_list(lat, lng, limit=1) + if nearest: + return nearest[0] + return None diff --git a/backend/services/region_dossier.py b/backend/services/region_dossier.py new file mode 100644 index 0000000..6cd12d7 --- /dev/null +++ b/backend/services/region_dossier.py @@ -0,0 +1,202 @@ +import logging +import concurrent.futures +from urllib.parse import quote +from cachetools import TTLCache +from services.network_utils import fetch_with_curl + +logger = logging.getLogger(__name__) + +# Cache dossier results for 24 hours — country data barely changes +# Key: rounded lat/lng grid (0.1 degree ≈ 11km) +dossier_cache = TTLCache(maxsize=500, ttl=86400) + + +def _reverse_geocode(lat: float, lng: float) -> dict: + url = ( + f"https://nominatim.openstreetmap.org/reverse?" + f"lat={lat}&lon={lng}&format=json&zoom=10&addressdetails=1&accept-language=en" + ) + try: + res = fetch_with_curl(url, timeout=10) + if res.status_code == 200: + data = res.json() + addr = data.get("address", {}) + return { + "city": addr.get("city") or addr.get("town") or addr.get("village") or addr.get("county") or "", + "state": addr.get("state") or addr.get("region") or "", + "country": addr.get("country") or "", + "country_code": (addr.get("country_code") or "").upper(), + "display_name": data.get("display_name", ""), + } + except Exception as e: + logger.warning(f"Reverse geocode failed: {e}") + return {} + + +def _fetch_country_data(country_code: str) -> dict: + if not country_code: + return {} + url = ( + f"https://restcountries.com/v3.1/alpha/{country_code}" + f"?fields=name,population,capital,languages,region,subregion,area,currencies,borders,flag" + ) + try: + res = fetch_with_curl(url, timeout=10) + if res.status_code == 200: + return res.json() + except Exception as e: + logger.warning(f"RestCountries failed for {country_code}: {e}") + return {} + + +def _fetch_wikidata_leader(country_name: str) -> dict: + if not country_name: + return {"leader": "Unknown", "government_type": "Unknown"} + # SPARQL: get head of state (P35) and form of government (P122) for a sovereign state + safe_name = country_name.replace('"', '\\"').replace("'", "\\'") + sparql = f""" + SELECT ?leaderLabel ?govTypeLabel WHERE {{ + ?country wdt:P31 wd:Q6256 ; + rdfs:label "{safe_name}"@en . + OPTIONAL {{ ?country wdt:P35 ?leader . }} + OPTIONAL {{ ?country wdt:P122 ?govType . }} + SERVICE wikibase:label {{ bd:serviceParam wikibase:language "en". }} + }} LIMIT 1 + """ + url = f"https://query.wikidata.org/sparql?query={quote(sparql)}&format=json" + try: + res = fetch_with_curl(url, timeout=15) + if res.status_code == 200: + results = res.json().get("results", {}).get("bindings", []) + if results: + r = results[0] + return { + "leader": r.get("leaderLabel", {}).get("value", "Unknown"), + "government_type": r.get("govTypeLabel", {}).get("value", "Unknown"), + } + except Exception as e: + logger.warning(f"Wikidata SPARQL failed for {country_name}: {e}") + return {"leader": "Unknown", "government_type": "Unknown"} + + +def _fetch_local_wiki_summary(place_name: str, country_name: str = "") -> dict: + if not place_name: + return {} + # Try exact match first, then with country qualifier + candidates = [place_name] + if country_name: + candidates.append(f"{place_name}, {country_name}") + + for name in candidates: + slug = quote(name.replace(" ", "_")) + url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{slug}" + try: + res = fetch_with_curl(url, timeout=10) + if res.status_code == 200: + data = res.json() + if data.get("type") != "disambiguation": + return { + "description": data.get("description", ""), + "extract": data.get("extract", ""), + "thumbnail": data.get("thumbnail", {}).get("source", ""), + } + except Exception: + continue + return {} + + +def get_region_dossier(lat: float, lng: float) -> dict: + cache_key = f"{round(lat, 1)}_{round(lng, 1)}" + if cache_key in dossier_cache: + return dossier_cache[cache_key] + + # Step 1: Reverse geocode + geo = _reverse_geocode(lat, lng) + if not geo or not geo.get("country"): + return { + "coordinates": {"lat": lat, "lng": lng}, + "location": geo or {}, + "country": None, + "local": None, + "error": "No country data — possibly international waters or uninhabited area", + } + + country_code = geo.get("country_code", "") + country_name = geo.get("country", "") + city_name = geo.get("city", "") + state_name = geo.get("state", "") + + # Step 2: Parallel fetch with timeouts to prevent hanging + with concurrent.futures.ThreadPoolExecutor(max_workers=4) as pool: + country_fut = pool.submit(_fetch_country_data, country_code) + leader_fut = pool.submit(_fetch_wikidata_leader, country_name) + local_fut = pool.submit(_fetch_local_wiki_summary, city_name or state_name, country_name) + # Also fetch country-level Wikipedia summary as fallback for local + country_wiki_fut = pool.submit(_fetch_local_wiki_summary, country_name, "") + + try: + country_data = country_fut.result(timeout=12) + except Exception: + logger.warning("Country data fetch timed out or failed") + country_data = {} + try: + leader_data = leader_fut.result(timeout=12) + except Exception: + logger.warning("Leader data fetch timed out or failed") + leader_data = {"leader": "Unknown", "government_type": "Unknown"} + try: + local_data = local_fut.result(timeout=12) + except Exception: + logger.warning("Local wiki fetch timed out or failed") + local_data = {} + try: + country_wiki_data = country_wiki_fut.result(timeout=12) + except Exception: + country_wiki_data = {} + + # If no local data but we have country wiki summary, use that + if not local_data.get("extract") and country_wiki_data.get("extract"): + local_data = country_wiki_data + + # Build languages list + languages = country_data.get("languages", {}) + lang_list = list(languages.values()) if isinstance(languages, dict) else [] + + # Build currencies + currencies = country_data.get("currencies", {}) + currency_list = [] + if isinstance(currencies, dict): + for v in currencies.values(): + if isinstance(v, dict): + symbol = v.get("symbol", "") + name = v.get("name", "") + currency_list.append(f"{name} ({symbol})" if symbol else name) + + result = { + "coordinates": {"lat": lat, "lng": lng}, + "location": geo, + "country": { + "name": country_data.get("name", {}).get("common", country_name), + "official_name": country_data.get("name", {}).get("official", ""), + "leader": leader_data.get("leader", "Unknown"), + "government_type": leader_data.get("government_type", "Unknown"), + "population": country_data.get("population", 0), + "capital": (country_data.get("capital") or ["Unknown"])[0] if isinstance(country_data.get("capital"), list) else "Unknown", + "languages": lang_list, + "currencies": currency_list, + "region": country_data.get("region", ""), + "subregion": country_data.get("subregion", ""), + "area_km2": country_data.get("area", 0), + "flag_emoji": country_data.get("flag", ""), + }, + "local": { + "name": city_name, + "state": state_name, + "description": local_data.get("description", ""), + "summary": local_data.get("extract", ""), + "thumbnail": local_data.get("thumbnail", ""), + }, + } + + dossier_cache[cache_key] = result + return result diff --git a/backend/services/test_flights.py b/backend/services/test_flights.py new file mode 100644 index 0000000..92454ce --- /dev/null +++ b/backend/services/test_flights.py @@ -0,0 +1,17 @@ +import sys +import logging +logging.basicConfig(level=logging.DEBUG) + +# Add backend directory to sys path so we can import modules +sys.path.append(r'f:\Codebase\Oracle\live-risk-dashboard\backend') + +from services.data_fetcher import fetch_flights, latest_data + +print("Testing fetch_flights...") +try: + fetch_flights() + print("Commercial flights count:", len(latest_data.get('commercial_flights', []))) + print("Private jets count:", len(latest_data.get('private_jets', []))) +except Exception as e: + import traceback + traceback.print_exc() diff --git a/backend/services/test_liveuamap.py b/backend/services/test_liveuamap.py new file mode 100644 index 0000000..938975d --- /dev/null +++ b/backend/services/test_liveuamap.py @@ -0,0 +1,38 @@ +import json +from playwright.sync_api import sync_playwright + +def scrape_liveuamap(): + print("Launching playwright...") + with sync_playwright() as p: + # User agents are important for headless browsing + browser = p.chromium.launch(headless=True) + page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + + def handle_response(response): + try: + if not response.url.endswith(('js', 'css', 'png', 'jpg', 'woff2', 'svg', 'ico')): + print(f"Intercepted API Call: {response.url}") + except Exception: + pass + + page.on("response", handle_response) + + print("Navigating to liveuamap...") + try: + page.goto("https://liveuamap.com/", timeout=30000, wait_until="domcontentloaded") + page.wait_for_timeout(5000) + + print("Grabbing all script tags...") + scripts = page.evaluate("() => Array.from(document.querySelectorAll('script')).map(s => s.innerText)") + for i, s in enumerate(scripts): + if 'JSON.parse' in s or 'markers' in s or 'JSON' in s: + with open(f"script_{i}.txt", "w", encoding="utf-8") as f: + f.write(s) + except Exception as e: + print("Playwright timeout or error:", e) + + print("Closing browser...") + browser.close() + +if __name__ == "__main__": + scrape_liveuamap() diff --git a/backend/services/test_openmhz_scraper.py b/backend/services/test_openmhz_scraper.py new file mode 100644 index 0000000..c187027 --- /dev/null +++ b/backend/services/test_openmhz_scraper.py @@ -0,0 +1,59 @@ +import requests +import json +import time +import cloudscraper + +def scrape_openmhz_systems(): + print("Testing OpenMHZ undocumented API with Cloudscraper...") + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + } + + scraper = cloudscraper.create_scraper(browser={'browser': 'chrome', 'platform': 'windows', 'desktop': True}) + + try: + # Step 1: Hit the public systems list that the front-end map uses + res = scraper.get("https://api.openmhz.com/systems", headers=headers, timeout=15) + json_data = res.json() + systems = json_data.get('systems', []) if isinstance(json_data, dict) else [] + print(f"Successfully spoofed OpenMHZ frontend. Found {len(systems)} active police/fire systems.") + + if not systems: + return + + # Inspect the first system (usually a major city) + city = systems[0] + sys_name = city.get('shortName') + print(f"Targeting System: {city.get('name')} ({sys_name})") + + if not sys_name: + return + + time.sleep(2) # Ethical delay + + # Step 2: Query the recent calls for this specific system + # The frontend queries: https://api.openmhz.com//calls + calls_url = f"https://api.openmhz.com/{sys_name}/calls" + print(f"Fetching recent bursts: {calls_url}") + + call_res = scraper.get(calls_url, headers=headers, timeout=15) + + if call_res.status_code == 200: + call_json = call_res.json() + calls = call_json.get('calls', []) if isinstance(call_json, dict) else [] + if calls and len(calls) > 0: + print(f"Intercepted {len(calls)} audio bursts.") + latest = calls[0] + print("LATEST INTERCEPT:") + print(f"Talkgroup: {latest.get('talkgroupNum')}") + print(f"Audio URL: {latest.get('url')}") + else: + print("No recent calls found for this system.") + else: + print(f"Failed to fetch calls. HTTP {call_res.status_code}") + + except Exception as e: + print(f"Scrape Exception: {e}") + +if __name__ == "__main__": + scrape_openmhz_systems() diff --git a/backend/services/test_radio.py b/backend/services/test_radio.py new file mode 100644 index 0000000..37d47b3 --- /dev/null +++ b/backend/services/test_radio.py @@ -0,0 +1,19 @@ +import requests + +def test_openmhz(): + print("Testing OpenMHZ...") + res = requests.get("https://api.openmhz.com/systems") + if res.status_code == 200: + data = res.json() + print(f"OpenMHZ returned {len(data)} systems.") + print(f"Example: {data[0]['name']} ({data[0]['shortName']})") + else: + print(f"OpenMHZ Failed: {res.status_code}") + +def test_scanner_radio(): + print("Testing Scanner Radio...") + # Gordon Edwards app often uses something like this + # We will just try broadcastify public page scrape as a secondary fallback + pass + +test_openmhz() diff --git a/backend/services/test_rss.py b/backend/services/test_rss.py new file mode 100644 index 0000000..000c7b3 --- /dev/null +++ b/backend/services/test_rss.py @@ -0,0 +1,55 @@ +import feedparser +import requests +import re + +feeds = { + "NPR": "https://feeds.npr.org/1004/rss.xml", + "BBC": "http://feeds.bbci.co.uk/news/world/rss.xml" +} + +keyword_coords = { + "venezuela": (7.119, -66.589), "brazil": (-14.235, -51.925), "argentina": (-38.416, -63.616), + "colombia": (4.570, -74.297), "mexico": (23.634, -102.552), "united states": (38.907, -77.036), + " usa ": (38.907, -77.036), " us ": (38.907, -77.036), "washington": (38.907, -77.036), + "canada": (56.130, -106.346), "ukraine": (49.487, 31.272), "kyiv": (50.450, 30.523), + "russia": (61.524, 105.318), "moscow": (55.755, 37.617), "israel": (31.046, 34.851), + "gaza": (31.416, 34.333), "iran": (32.427, 53.688), "lebanon": (33.854, 35.862), + "syria": (34.802, 38.996), "yemen": (15.552, 48.516), "china": (35.861, 104.195), + "beijing": (39.904, 116.407), "taiwan": (23.697, 120.960), "north korea": (40.339, 127.510), + "south korea": (35.907, 127.766), "pyongyang": (39.039, 125.762), "seoul": (37.566, 126.978), + "japan": (36.204, 138.252), "afghanistan": (33.939, 67.709), "pakistan": (30.375, 69.345), + "india": (20.593, 78.962), " uk ": (55.378, -3.435), "london": (51.507, -0.127), + "france": (46.227, 2.213), "paris": (48.856, 2.352), "germany": (51.165, 10.451), + "berlin": (52.520, 13.405), "sudan": (12.862, 30.217), "congo": (-4.038, 21.758), + "south africa": (-30.559, 22.937), "nigeria": (9.082, 8.675), "egypt": (26.820, 30.802), + "zimbabwe": (-19.015, 29.154), "australia": (-25.274, 133.775), "middle east": (31.500, 34.800), + "europe": (48.800, 2.300), "africa": (0.000, 25.000), "america": (38.900, -77.000), + "south america": (-14.200, -51.900), "asia": (34.000, 100.000), + "california": (36.778, -119.417), "texas": (31.968, -99.901), "florida": (27.994, -81.760), + "new york": (40.712, -74.006), "virginia": (37.431, -78.656), + "british columbia": (53.726, -127.647), "ontario": (51.253, -85.323), "quebec": (52.939, -73.549), + "delhi": (28.704, 77.102), "new delhi": (28.613, 77.209), "mumbai": (19.076, 72.877), + "shanghai": (31.230, 121.473), "hong kong": (22.319, 114.169), "istanbul": (41.008, 28.978), + "dubai": (25.204, 55.270), "singapore": (1.352, 103.819) +} + +for name, url in feeds.items(): + r = requests.get(url) + feed = feedparser.parse(r.text) + for entry in feed.entries[:10]: + title = entry.get('title', '') + summary = entry.get('summary', '') + text = (title + " " + summary).lower() + padded_text = f" {text} " + + matched_kw = None + for kw, coords in keyword_coords.items(): + if kw.startswith(" ") or kw.endswith(" "): + if kw in padded_text: + matched_kw = kw + break + else: + if re.search(r'\b' + re.escape(kw) + r'\b', text): + matched_kw = kw + break + print(f"[{name}] {title}\n Matched: {matched_kw}\n Text: {text}\n") diff --git a/backend/services/test_scraper.py b/backend/services/test_scraper.py new file mode 100644 index 0000000..bf9e938 --- /dev/null +++ b/backend/services/test_scraper.py @@ -0,0 +1,67 @@ +import requests +from bs4 import BeautifulSoup +import json + +def scrape_broadcastify_top(): + print("Scraping Broadcastify Top Feeds...") + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + } + + try: + # The top 50 feeds page provides a wealth of listening data + res = requests.get("https://www.broadcastify.com/listen/top", headers=headers, timeout=10) + if res.status_code != 200: + print(f"Failed HTTP {res.status_code}") + return [] + + soup = BeautifulSoup(res.text, 'html.parser') + + # The table of feeds is in a standard class + table = soup.find('table', {'class': 'btable'}) + if not table: + print("Could not find feeds table.") + return [] + + feeds = [] + rows = table.find_all('tr')[1:] # Skip header + + for row in rows: + cols = row.find_all('td') + if len(cols) >= 5: + # Top layout: [Listeners, Feed ID (hidden), Location, Feed Name, Category, Genre] + listeners_str = cols[0].text.strip().replace(',', '') + listeners = int(listeners_str) if listeners_str.isdigit() else 0 + + # The link is usually in the Feed Name column + link_tag = cols[2].find('a') + if not link_tag: + continue + + href = link_tag.get('href', '') + feed_id = href.split('/')[-1] if '/listen/feed/' in href else None + + if not feed_id: + continue + + location = cols[1].text.strip() + name = cols[2].text.strip() + + feeds.append({ + "id": feed_id, + "listeners": listeners, + "location": location, + "name": name, + "stream_url": f"https://broadcastify.cdnstream1.com/{feed_id}" + }) + + print(f"Successfully scraped {len(feeds)} top feeds.") + return feeds + + except Exception as e: + print(f"Scrape error: {e}") + return [] + +if __name__ == "__main__": + top_feeds = scrape_broadcastify_top() + print(json.dumps(top_feeds[:3], indent=2)) diff --git a/backend/sgp_sample.json b/backend/sgp_sample.json new file mode 100644 index 0000000..db4f450 --- /dev/null +++ b/backend/sgp_sample.json @@ -0,0 +1 @@ +{"items":[{"timestamp":"2026-02-25T14:56:59+08:00","cameras":[{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/647cd9f0-6225-4951-a113-ebf776ded56f.jpg","location":{"latitude":1.29531332,"longitude":103.871146},"camera_id":"1001","image_metadata":{"height":240,"width":320,"md5":"0bb0e277037c088192b12052c4315e88"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/4c52361e-b566-452e-bb44-0616dc56c6fe.jpg","location":{"latitude":1.319541067,"longitude":103.8785627},"camera_id":"1002","image_metadata":{"height":240,"width":320,"md5":"5004ac49a538bf1d6c9a8757991a1be9"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/ba7c78c6-863a-4221-9854-4454efb27b1d.jpg","location":{"latitude":1.323957439,"longitude":103.8728576},"camera_id":"1003","image_metadata":{"height":240,"width":320,"md5":"09fe251afe3225d44305bdeb62d95b06"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/03775a4b-40c2-4bc9-abf2-3d881dffd632.jpg","location":{"latitude":1.319535712,"longitude":103.8750668},"camera_id":"1004","image_metadata":{"height":240,"width":320,"md5":"cb971915dffda15a2be7ef31db968805"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/9cbdd3f7-ebfe-4561-99a6-1bbbde75ee90.jpg","location":{"latitude":1.363519886,"longitude":103.905394},"camera_id":"1005","image_metadata":{"height":240,"width":320,"md5":"c80e8da0b53d7eccdb8243724b7ce2fe"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/28f2c6da-4fdd-49b5-b347-51b5bbbf4c37.jpg","location":{"latitude":1.357098686,"longitude":103.902042},"camera_id":"1006","image_metadata":{"height":240,"width":320,"md5":"349af068659b597c7912c0238bcdfe02"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/2476e3ad-cb23-4096-83b4-c834a25cf1ff.jpg","location":{"latitude":1.365434,"longitude":103.953997},"camera_id":"1111","image_metadata":{"height":1080,"width":1920,"md5":"01cb8f8a5169a6edb4ceafdfa64bd51d"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/2a4789b6-249b-4729-93cd-1b12f09eeed6.jpg","location":{"latitude":1.3605,"longitude":103.961412},"camera_id":"1112","image_metadata":{"height":1080,"width":1920,"md5":"88c037cbf99ddba20d04cbaa89f7ce79"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/1f935572-1e10-4d07-9595-c20439329a89.jpg","location":{"latitude":1.317036,"longitude":103.988598},"camera_id":"1113","image_metadata":{"height":1080,"width":1920,"md5":"37c6ac4e07c15179214a2cee305cf3f5"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/9c59d473-4cd8-4118-9cf8-a6fe6deee06c.jpg","location":{"latitude":1.27414394350065,"longitude":103.851316802547},"camera_id":"1501","image_metadata":{"height":240,"width":320,"md5":"9041591fdd0c21b4ff693db7cbc1bbfe"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/619e28d1-0865-4901-8880-62616285e80c.jpg","location":{"latitude":1.27135090682664,"longitude":103.861828440597},"camera_id":"1502","image_metadata":{"height":240,"width":320,"md5":"381291831e52a27d41942efc065c3a6c"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/95004282-fbfa-4edf-868e-eb9787bbfd6e.jpg","location":{"latitude":1.27066408655104,"longitude":103.856977943394},"camera_id":"1503","image_metadata":{"height":240,"width":320,"md5":"f7250fa571325b0b0dc12722f5a4c220"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/7e50b07d-feae-4b4a-aed7-09dfa6d7666c.jpg","location":{"latitude":1.29409891409364,"longitude":103.876056196568},"camera_id":"1504","image_metadata":{"height":240,"width":320,"md5":"ee809c0ead15971f3d24bfd36524e370"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/d3dab4c8-d495-4ebe-a050-3d296c8410e0.jpg","location":{"latitude":1.2752977149006,"longitude":103.866390381759},"camera_id":"1505","image_metadata":{"height":240,"width":320,"md5":"d569782d52227e5ef18f1ef403de7af0"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/b2a15cb8-bbfb-4121-91b1-dc1c7bd9956c.jpg","location":{"latitude":1.323604823,"longitude":103.8587802},"camera_id":"1701","image_metadata":{"height":1080,"width":1920,"md5":"818c60237225cfaf3919a7435e6be651"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/58e79987-c290-4959-b081-f8b554fca1d6.jpg","location":{"latitude":1.34355015,"longitude":103.8601984},"camera_id":"1702","image_metadata":{"height":1080,"width":1920,"md5":"d260eac8cfafcdaf062a8d62aca80125"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/b4ebc129-50a6-483a-bc5b-38254d66daf2.jpg","location":{"latitude":1.32814722194857,"longitude":103.862203282048},"camera_id":"1703","image_metadata":{"height":1080,"width":1920,"md5":"627d1134618e2a1149aba46cf0411909"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/515ba1b7-e0c8-46e8-b42d-5a76eed0accc.jpg","location":{"latitude":1.28569398886979,"longitude":103.837524510188},"camera_id":"1704","image_metadata":{"height":1080,"width":1920,"md5":"be34bb6954696df12b7f18594db248ea"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/d8f14621-cd6b-4e89-b2f8-08f81da9acac.jpg","location":{"latitude":1.375925022,"longitude":103.8587986},"camera_id":"1705","image_metadata":{"height":1080,"width":1920,"md5":"7252aab345e18cf58f19b37f86c37edb"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/1a93b935-f934-4e9f-845f-e56ce6b688b4.jpg","location":{"latitude":1.38861,"longitude":103.85806},"camera_id":"1706","image_metadata":{"height":1080,"width":1920,"md5":"510a3259ae7c13f5154b79ef0f0e7755"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/0992a5e5-3eb9-4586-995e-49b247efa888.jpg","location":{"latitude":1.28036584335876,"longitude":103.830451146503},"camera_id":"1707","image_metadata":{"height":1080,"width":1920,"md5":"f97c0671d400855e7e75ca424e72593f"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/f568e659-3731-42c8-9087-42442bf64b1a.jpg","location":{"latitude":1.31384231654635,"longitude":103.845603032574},"camera_id":"1709","image_metadata":{"height":1080,"width":1920,"md5":"ad0198cb782e68aa5543e05fa7b46923"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/0eab59e7-e166-4612-ae7c-9d3abd413013.jpg","location":{"latitude":1.35296,"longitude":103.85719},"camera_id":"1711","image_metadata":{"height":1080,"width":1920,"md5":"9b1c0d1b6173671d6a1e73f3bd80a9c8"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/ac16f6cd-273b-45b2-9cb7-ada035229a3e.jpg","location":{"latitude":1.447023728,"longitude":103.7716543},"camera_id":"2701","image_metadata":{"height":1080,"width":1920,"md5":"844f6be4187f114610a208ae5fc92d04"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/5bd9f207-ef59-4a9b-bcc2-dfebc4474645.jpg","location":{"latitude":1.445554109,"longitude":103.7683397},"camera_id":"2702","image_metadata":{"height":1080,"width":1920,"md5":"e9745302b85b5d184f231241bb1ff34d"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/ecf26425-d457-4f8e-8694-2810e90cc4b7.jpg","location":{"latitude":1.35047790791386,"longitude":103.791033581325},"camera_id":"2703","image_metadata":{"height":1080,"width":1920,"md5":"b38ffe1b0dd4beb6d85d7f0ade4286af"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/6c964abf-e339-4e81-9bf1-ce556e2434fe.jpg","location":{"latitude":1.429588536,"longitude":103.769311},"camera_id":"2704","image_metadata":{"height":1080,"width":1920,"md5":"3e87aa9b0f11c7f122a03d9cdeaa02de"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/b9e4bbc8-3936-4b03-aab5-8bbc563b13db.jpg","location":{"latitude":1.36728572,"longitude":103.7794698},"camera_id":"2705","image_metadata":{"height":1080,"width":1920,"md5":"e66963b7a32e8a2b63fa868a823e7f59"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/cd5e88bd-adfe-46b9-a574-eb4d00cb9210.jpg","location":{"latitude":1.414142,"longitude":103.771168},"camera_id":"2706","image_metadata":{"height":1080,"width":1920,"md5":"a31c1d76bfd791720c132e2239538362"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/4e0e04e0-673e-4d99-9637-92ef9bad8e57.jpg","location":{"latitude":1.3983,"longitude":103.774247},"camera_id":"2707","image_metadata":{"height":1080,"width":1920,"md5":"288b54d64509e7491f3beb4cbb0431cd"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/36775a6b-590d-4e28-b52d-f9ee79c4d2e5.jpg","location":{"latitude":1.3865,"longitude":103.7747},"camera_id":"2708","image_metadata":{"height":1080,"width":1920,"md5":"cb40a67b643a8f3d268ed77eec6a5060"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/cb137d36-6e9f-4fff-ae34-6cb37b0aea59.jpg","location":{"latitude":1.33831,"longitude":103.98032},"camera_id":"3702","image_metadata":{"height":1080,"width":1920,"md5":"caa0c9b82b8e4e4df75918b1bdad940a"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/947b8856-0ca4-4beb-80b8-2bbfe2fe1b5a.jpg","location":{"latitude":1.2958550156561,"longitude":103.880314665981},"camera_id":"3704","image_metadata":{"height":1080,"width":1920,"md5":"76382811218897f4557f3837477ec3c9"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/48b982b6-41ca-4f4d-9e79-5e75a3fc7769.jpg","location":{"latitude":1.32743,"longitude":103.97383},"camera_id":"3705","image_metadata":{"height":1080,"width":1920,"md5":"279956ba61873e5f7d8aa0249a1f2dcb"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/c2aefc7c-cd0c-424a-8164-95caa9516729.jpg","location":{"latitude":1.309330837,"longitude":103.9350504},"camera_id":"3793","image_metadata":{"height":1080,"width":1920,"md5":"9b66027e749bb359e63665e6f2647d81"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/e1caac6e-6eaf-4349-9fe3-8f4dc8de22b8.jpg","location":{"latitude":1.30145145166066,"longitude":103.910596320237},"camera_id":"3795","image_metadata":{"height":1080,"width":1920,"md5":"e7b9292c1bb0e5c3e935433180ddcce7"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/25d1b493-ec1f-4c19-bdb3-74635ebcf83b.jpg","location":{"latitude":1.297512569,"longitude":103.8983019},"camera_id":"3796","image_metadata":{"height":1080,"width":1920,"md5":"f6564076c9d04207c08009fbe10e6b97"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/09f1407a-143e-4ae6-b5aa-f6bf22249d1d.jpg","location":{"latitude":1.29565733262976,"longitude":103.885283049309},"camera_id":"3797","image_metadata":{"height":1080,"width":1920,"md5":"3fe876b2fbfb7836b3cfa4eb95d42591"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/2a2ae82e-6557-4425-af29-07f604b7b31d.jpg","location":{"latitude":1.29158484,"longitude":103.8615987},"camera_id":"3798","image_metadata":{"height":1080,"width":1920,"md5":"f52f8a9d7d3031524f69bfeb44ba8914"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/8377a1e0-514e-4aab-8e9e-8971020e0eef.jpg","location":{"latitude":1.2871,"longitude":103.79633},"camera_id":"4701","image_metadata":{"height":1080,"width":1920,"md5":"6907b046098e3022035317a05e5b6bf4"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/284dc339-e9f2-4678-839a-ac53dfc111b8.jpg","location":{"latitude":1.27237,"longitude":103.8324},"camera_id":"4702","image_metadata":{"height":1080,"width":1920,"md5":"92dedce213fd39e8abe59186026f10be"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/ccb924b0-0ba6-4e78-84cf-dee23023c416.jpg","location":{"latitude":1.348697862,"longitude":103.6350413},"camera_id":"4703","image_metadata":{"height":1080,"width":1920,"md5":"a5fd6831d87a8b7f263dfc113ee4aefc"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/5cbb3f06-ea5b-4e05-bd2d-5fce67f33dfa.jpg","location":{"latitude":1.27877,"longitude":103.82375},"camera_id":"4704","image_metadata":{"height":1080,"width":1920,"md5":"23ee7067534bfe67d37d968dd4e39808"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/1c483d65-05a6-4485-814a-3d3dbaa3f32e.jpg","location":{"latitude":1.32618,"longitude":103.73028},"camera_id":"4705","image_metadata":{"height":1080,"width":1920,"md5":"73519f44d4a91c246f23799c908a4ae9"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/af84eeab-011f-4322-a6b0-7a5aa073dfbc.jpg","location":{"latitude":1.29792,"longitude":103.78205},"camera_id":"4706","image_metadata":{"height":1080,"width":1920,"md5":"dc77f5f81a9c8815a3bed53a97a9154c"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/995bfc20-e70d-40f8-ab8f-5cea70b7e64e.jpg","location":{"latitude":1.33344648135658,"longitude":103.652700847056},"camera_id":"4707","image_metadata":{"height":1080,"width":1920,"md5":"5379b2557185eaa887d02739f3da3ed3"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/71535a87-3551-4d9e-94a0-03ccf2329d6a.jpg","location":{"latitude":1.29939,"longitude":103.7799},"camera_id":"4708","image_metadata":{"height":1080,"width":1920,"md5":"73367aab6088c92d07a2d8ba6ca87f61"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/6b0584f4-2aaa-4028-bf50-15a4d2550fd9.jpg","location":{"latitude":1.312019,"longitude":103.763002},"camera_id":"4709","image_metadata":{"height":1080,"width":1920,"md5":"aa9829150005d10007542ef630cf3435"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/266b3031-acb9-46ad-978b-f288eb319bec.jpg","location":{"latitude":1.32153,"longitude":103.75273},"camera_id":"4710","image_metadata":{"height":1080,"width":1920,"md5":"a3fb153057f06b811dbf7af7734ef7ba"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/eda070d2-887a-46f6-a2da-1ede4d1a97a2.jpg","location":{"latitude":1.341244001,"longitude":103.6439134},"camera_id":"4712","image_metadata":{"height":1080,"width":1920,"md5":"34f4db05183f55a60123c82bb1466da6"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/d63cf85f-2096-40ca-a785-f03a14d69dad.jpg","location":{"latitude":1.347645829,"longitude":103.6366955},"camera_id":"4713","image_metadata":{"height":1080,"width":1920,"md5":"427f9900709e5e7933a073b61903c302"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/831235d9-1cf2-43ed-afaa-b4e50cb4e499.jpg","location":{"latitude":1.31023,"longitude":103.76438},"camera_id":"4714","image_metadata":{"height":1080,"width":1920,"md5":"ca13af9e25ee13a0a7087c4a8f1120a0"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/080b1430-16dd-4340-92cf-263238d1c2ba.jpg","location":{"latitude":1.32227,"longitude":103.67453},"camera_id":"4716","image_metadata":{"height":360,"width":640,"md5":"3137589a4c359004b0ec1bcc58d4cf40"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/eaaa2288-54c0-4ff0-9699-e2f59c50b2e3.jpg","location":{"latitude":1.25999999687243,"longitude":103.823611110166},"camera_id":"4798","image_metadata":{"height":1080,"width":1920,"md5":"1ae3504c2ba758457b84cfb6ee15f685"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/41497c96-50e2-45bc-a7a5-a7d77f0d3d2b.jpg","location":{"latitude":1.26027777363278,"longitude":103.823888890049},"camera_id":"4799","image_metadata":{"height":1080,"width":1920,"md5":"1ddafc844dc3a32bc1d654ee75e98428"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/53f5aa17-ca67-4f09-9d2f-c72680562be5.jpg","location":{"latitude":1.3309693,"longitude":103.9168616},"camera_id":"5794","image_metadata":{"height":1080,"width":1920,"md5":"b38d98a5023b51e2da30889197c8ff2b"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/5d2bd1f9-b3a2-4504-9f19-7ea9e22d5fe3.jpg","location":{"latitude":1.326024822,"longitude":103.905625},"camera_id":"5795","image_metadata":{"height":1080,"width":1920,"md5":"fc321223489b43e54a7d699391b09de0"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/75b521b6-ccb1-45c7-a01b-a434dd53b35d.jpg","location":{"latitude":1.322875288,"longitude":103.8910793},"camera_id":"5797","image_metadata":{"height":1080,"width":1920,"md5":"67202c4cfe5dde7abd48bea7a1508dff"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/6e87cf0e-de0b-4248-91cc-c95bb9e4d81a.jpg","location":{"latitude":1.32036078126842,"longitude":103.877174116489},"camera_id":"5798","image_metadata":{"height":1080,"width":1920,"md5":"193ec601ec4e5edf6c51a074cd5d2284"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/c471ab8a-9764-4649-8aa4-31878876fba3.jpg","location":{"latitude":1.328171608,"longitude":103.8685191},"camera_id":"5799","image_metadata":{"height":1080,"width":1920,"md5":"ee3f15e4e6ed4ab226fc77ade76f751a"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/9be46717-eeb1-4f1e-b244-2164f65d09ec.jpg","location":{"latitude":1.329334,"longitude":103.858222},"camera_id":"6701","image_metadata":{"height":1080,"width":1920,"md5":"b344eff781f1a39a77bd90cf436dcaef"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/267c51d4-a9d8-43fe-ba36-af5f9dca881e.jpg","location":{"latitude":1.328899,"longitude":103.84121},"camera_id":"6703","image_metadata":{"height":1080,"width":1920,"md5":"d6ac3d3d92ae04bbe0b2efb32e8b93cc"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/574e65ee-0c6f-4659-a785-b7f49acee3f7.jpg","location":{"latitude":1.32657403632366,"longitude":103.826857295633},"camera_id":"6704","image_metadata":{"height":1080,"width":1920,"md5":"125f231f5023a0079c7e072a0c9de271"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/fbf07fed-d8c5-4c68-a1f1-f5b8a71bb5eb.jpg","location":{"latitude":1.332124,"longitude":103.81768},"camera_id":"6705","image_metadata":{"height":1080,"width":1920,"md5":"bc346990bbebadddd5ea8ee1df2cd9cf"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/a875ab4c-9120-4dfd-8edf-e993acf20cde.jpg","location":{"latitude":1.349428893,"longitude":103.7952799},"camera_id":"6706","image_metadata":{"height":1080,"width":1920,"md5":"1ae0f59bb6f634b8ef1720b6f8c9c505"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/fcc5cec3-5569-4391-8805-970df18a7cda.jpg","location":{"latitude":1.345996,"longitude":103.69016},"camera_id":"6708","image_metadata":{"height":1080,"width":1920,"md5":"5ed5e7e59f6e414b1d226128b704176a"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/5500ce19-a109-4197-afab-72170013e7fe.jpg","location":{"latitude":1.344205,"longitude":103.78577},"camera_id":"6710","image_metadata":{"height":1080,"width":1920,"md5":"abac167261f10c1f18efc0cc6407e5ff"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/3f506c21-24f7-4d80-a6f4-75f7255053a3.jpg","location":{"latitude":1.33771,"longitude":103.977827},"camera_id":"6711","image_metadata":{"height":1080,"width":1920,"md5":"a576d074834ee46273d93dea168d98e7"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/bdedc16b-78da-4f6d-95d3-01f7fcea5d1d.jpg","location":{"latitude":1.332691,"longitude":103.770278},"camera_id":"6712","image_metadata":{"height":1080,"width":1920,"md5":"a0ae636d7128bd358b7574eb4870b3f7"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/6c70ce62-7293-4866-87e5-f681e491142c.jpg","location":{"latitude":1.340298,"longitude":103.945652},"camera_id":"6713","image_metadata":{"height":1080,"width":1920,"md5":"736e3ac99b87a4193fda68fd34bbff0e"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/a0db9d37-f7f3-49c2-9e8c-4d0dd3dfc9e7.jpg","location":{"latitude":1.361742,"longitude":103.703341},"camera_id":"6714","image_metadata":{"height":1080,"width":1920,"md5":"30f1181d4c1627f9e69797c16d45f65b"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/99cdf59e-9e22-42f5-8ae8-0d546e8f9444.jpg","location":{"latitude":1.356299,"longitude":103.716071},"camera_id":"6715","image_metadata":{"height":1080,"width":1920,"md5":"4027a8b86fa3ba69e013056ab6cd87b0"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/4b70a44f-4675-4822-95c3-f506435727b2.jpg","location":{"latitude":1.322893,"longitude":103.6635051},"camera_id":"6716","image_metadata":{"height":1080,"width":1920,"md5":"065224a7abd70b0744ea086544a7b4ac"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/1a7954ae-dc49-4b33-a153-d985f8453ef9.jpg","location":{"latitude":1.354245,"longitude":103.963782},"camera_id":"7791","image_metadata":{"height":1080,"width":1920,"md5":"893e17405647c2026ec324d4fce7cf55"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/a80d7048-105b-457c-ad3f-daff267d2e1a.jpg","location":{"latitude":1.37704704,"longitude":103.92946983},"camera_id":"7793","image_metadata":{"height":1080,"width":1920,"md5":"3b3d610dd099139e3f958542f3541ae9"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/65f94ed8-0493-4492-81ab-6c7a4532a099.jpg","location":{"latitude":1.37988658,"longitude":103.92009174},"camera_id":"7794","image_metadata":{"height":1080,"width":1920,"md5":"6ff1ed46ce63cf8eed9a6526af460745"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/39732d43-f46c-48f8-bbd6-58562504f041.jpg","location":{"latitude":1.38432741,"longitude":103.91585701},"camera_id":"7795","image_metadata":{"height":1080,"width":1920,"md5":"df6eb0640094d7f5a3487e69ce836397"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/e9907ef9-890a-46b5-b196-4d4b895e778b.jpg","location":{"latitude":1.39559294,"longitude":103.90515712},"camera_id":"7796","image_metadata":{"height":1080,"width":1920,"md5":"ba0d66e62ef0784043d127c228cfaa33"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/551adb61-8906-44b0-8162-af38bbe3bcfe.jpg","location":{"latitude":1.40002575,"longitude":103.85702534},"camera_id":"7797","image_metadata":{"height":1080,"width":1920,"md5":"d7cd87f1173ea7b0d83b9568ef7a55e5"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/e5352a79-0016-4bf4-9c39-2443d4c60491.jpg","location":{"latitude":1.39748842,"longitude":103.85400467},"camera_id":"7798","image_metadata":{"height":1080,"width":1920,"md5":"22e2a3db7b6f8492b282f1528ef409b0"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/946ac562-20c9-4152-aaef-dee6f99008d8.jpg","location":{"latitude":1.38647,"longitude":103.74143},"camera_id":"8701","image_metadata":{"height":1080,"width":1920,"md5":"7b4c0c3e572104e95235e81326e321a2"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/4adaafe3-41fb-488b-a9f1-24920d04fd65.jpg","location":{"latitude":1.39059,"longitude":103.7717},"camera_id":"8702","image_metadata":{"height":1080,"width":1920,"md5":"f0fa28dd36df9e5010522cdcd4720dee"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/db393f3a-43d0-4eb7-8a00-1e2c1acbfbb3.jpg","location":{"latitude":1.3899,"longitude":103.74843},"camera_id":"8704","image_metadata":{"height":1080,"width":1920,"md5":"1b00a39cfd928149b9ba766281a75988"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/09863c3c-3ee3-4ef3-bcd8-c3199a2541bd.jpg","location":{"latitude":1.3664,"longitude":103.70899},"camera_id":"8706","image_metadata":{"height":1080,"width":1920,"md5":"fb573b45701aba2e25b5402e1db533f9"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/7d0b47b9-e2c2-4090-8b40-611f6cb7489c.jpg","location":{"latitude":1.39466333,"longitude":103.83474601},"camera_id":"9701","image_metadata":{"height":1080,"width":1920,"md5":"8155d0d6f8b974d68fc78fee31ea5a3e"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/bdfb291a-86bf-4544-9822-cbefbc20200d.jpg","location":{"latitude":1.39474081,"longitude":103.81797086},"camera_id":"9702","image_metadata":{"height":1080,"width":1920,"md5":"683c6c8e4ccff0fc3c9d0cfacc705f1a"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/96a7b783-32b4-4c86-ab84-3dc1b4034d25.jpg","location":{"latitude":1.422857,"longitude":103.773005},"camera_id":"9703","image_metadata":{"height":1080,"width":1920,"md5":"6bf3308ae97890202774c43fe7814093"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/c3d9eee5-73af-47e5-a6ff-5b844a5a5390.jpg","location":{"latitude":1.42214311,"longitude":103.79542062},"camera_id":"9704","image_metadata":{"height":1080,"width":1920,"md5":"30c8566b64c45ce7e3d76fb29384b85d"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/62263608-5b4f-4163-9dae-9f82f80f58d3.jpg","location":{"latitude":1.42627712,"longitude":103.78716637},"camera_id":"9705","image_metadata":{"height":1080,"width":1920,"md5":"52702cc3c8498b34326de7810708ab50"}},{"timestamp":"2026-02-25T14:55:59+08:00","image":"https://images.data.gov.sg/api/traffic-images/2026/02/50c2197b-4f31-4149-a1cf-2c4ff81140dd.jpg","location":{"latitude":1.41270056,"longitude":103.80642712},"camera_id":"9706","image_metadata":{"height":1080,"width":1920,"md5":"47077b766e1eeb0e86028da96e6c47b8"}}]}],"api_info":{"status":"healthy"}} \ No newline at end of file diff --git a/backend/temp.json b/backend/temp.json new file mode 100644 index 0000000..a6aa56d --- /dev/null +++ b/backend/temp.json @@ -0,0 +1,10 @@ + + + + +Error + + +
Cannot GET /api/history/public/latest
+ + diff --git a/backend/test_adsb.py b/backend/test_adsb.py new file mode 100644 index 0000000..c41cffc --- /dev/null +++ b/backend/test_adsb.py @@ -0,0 +1,59 @@ +import requests +import time +import math +import random + +def test_fetch_and_triangulate(): + t0 = time.time() + url = "https://api.adsb.lol/v2/lat/39.8/lon/-98.5/dist/1000" + try: + r = requests.get(url, timeout=10) + data = r.json() + print(f"Downloaded in {time.time() - t0:.2f}s") + if "ac" in data: + sampled = data["ac"] + print("Flights:", len(sampled)) + else: + print("No 'ac' in response:", data) + + + # Load airports (mock for test) + airports = [{"lat": random.uniform(-90, 90), "lng": random.uniform(-180, 180), "iata": f"A{i}"} for i in range(4000)] + + t1 = time.time() + for f in sampled: + lat = f.get("lat") + lng = f.get("lon") + heading = f.get("track", 0) + if lat is None or lng is None: continue + + # Project 15 degrees (~1000 miles) backwards and forwards + dist_deg = 15.0 + h_rad = math.radians(heading) + dy = math.cos(h_rad) * dist_deg + dx = math.sin(h_rad) * dist_deg + cos_lat = max(0.2, math.cos(math.radians(lat))) + + origin_lat = lat - dy + origin_lng = lng - (dx / cos_lat) + + dest_lat = lat + dy + dest_lng = lng + (dx / cos_lat) + + # Find closest origin airport + best_o, min_o = None, float('inf') + for a in airports: + d = (a['lat'] - origin_lat)**2 + (a['lng'] - origin_lng)**2 + if d < min_o: min_o = d; best_o = a + + # Find closest dest airport + best_d, min_d = None, float('inf') + for a in airports: + d = (a['lat'] - dest_lat)**2 + (a['lng'] - dest_lng)**2 + if d < min_d: min_d = d; best_d = a + + print(f"Triangulated 500 flights against {len(airports)} airports in {time.time() - t1:.2f}s") + except Exception as e: + print("Error:", e) + +test_fetch_and_triangulate() diff --git a/backend/test_adsb_inner.py b/backend/test_adsb_inner.py new file mode 100644 index 0000000..882196d --- /dev/null +++ b/backend/test_adsb_inner.py @@ -0,0 +1,13 @@ +from services.data_fetcher import fetch_airports, fetch_flights, cached_airports, latest_data + +fetch_airports() + +# We patch logger to see what happens inside fetch_flights +import logging +logging.basicConfig(level=logging.DEBUG) + +# let's run fetch_flights +fetch_flights() + +flights = latest_data.get('flights', []) +print(f"Total flights: {len(flights)}") diff --git a/backend/test_ais_proxy.py b/backend/test_ais_proxy.py new file mode 100644 index 0000000..23b7bd3 --- /dev/null +++ b/backend/test_ais_proxy.py @@ -0,0 +1,45 @@ +import json +import subprocess +import os +import time + +proxy_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ais_proxy.js") +API_KEY = "75cc39af03c9cc23c90e8a7b3c3bc2b2a507c5fb" + +print(f"Proxy script: {proxy_script}") +print(f"Exists: {os.path.exists(proxy_script)}") + +process = subprocess.Popen( + ['node', proxy_script, API_KEY], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, # Separate stderr! + text=True, + bufsize=1 +) + +print("Process started, reading stdout...") +count = 0 +start = time.time() +for line in iter(process.stdout.readline, ''): + line = line.strip() + if not line: + continue + try: + data = json.loads(line) + msg_type = data.get("MessageType", "?") + mmsi = data.get("MetaData", {}).get("MMSI", 0) + count += 1 + if count <= 5: + print(f" MSG {count}: type={msg_type} mmsi={mmsi}") + if count == 20: + elapsed = time.time() - start + print(f"\nReceived {count} messages in {elapsed:.1f}s — proxy is working!") + process.terminate() + break + except json.JSONDecodeError as e: + print(f" BAD JSON: {line[:100]}... err={e}") + +if count == 0: + # Check stderr + stderr_out = process.stderr.read() + print(f"Zero messages received. stderr: {stderr_out[:500]}") diff --git a/backend/test_ais_proxy2.py b/backend/test_ais_proxy2.py new file mode 100644 index 0000000..e200f09 --- /dev/null +++ b/backend/test_ais_proxy2.py @@ -0,0 +1,54 @@ +import json +import subprocess +import os +import time +import sys + +proxy_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ais_proxy.js") +API_KEY = "75cc39af03c9cc23c90e8a7b3c3bc2b2a507c5fb" + +print(f"Proxy script: {proxy_script}") + +process = subprocess.Popen( + ['node', proxy_script, API_KEY], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + bufsize=1 +) + +import threading + +def read_stderr(): + for line in iter(process.stderr.readline, ''): + print(f"[STDERR] {line.strip()}", file=sys.stderr) + +t = threading.Thread(target=read_stderr, daemon=True) +t.start() + +print("Process started, reading stdout for 15 seconds...") +count = 0 +start = time.time() +while time.time() - start < 15: + line = process.stdout.readline() + if not line: + if process.poll() is not None: + print(f"Process exited with code {process.returncode}") + break + continue + line = line.strip() + if not line: + continue + try: + data = json.loads(line) + msg_type = data.get("MessageType", "?") + mmsi = data.get("MetaData", {}).get("MMSI", 0) + count += 1 + if count <= 5: + print(f" MSG {count}: type={msg_type} mmsi={mmsi}") + except json.JSONDecodeError as e: + print(f" BAD LINE: {line[:80]}...") + +elapsed = time.time() - start +print(f"\nTotal {count} messages in {elapsed:.1f}s") +process.terminate() diff --git a/backend/test_api.py b/backend/test_api.py new file mode 100644 index 0000000..82f87f9 --- /dev/null +++ b/backend/test_api.py @@ -0,0 +1,13 @@ +import requests +import traceback + +try: + print("Testing adsb.lol...") + r = requests.get("https://api.adsb.lol/v2/lat/39.8/lon/-98.5/dist/100", timeout=15) + print(f"Status: {r.status_code}") + d = r.json() + print(f"Aircraft: {len(d.get('ac', []))}") +except Exception as e: + print(f"Error type: {type(e).__name__}") + print(f"Error: {e}") + traceback.print_exc() diff --git a/backend/test_api_stats.py b/backend/test_api_stats.py new file mode 100644 index 0000000..c8a3e77 --- /dev/null +++ b/backend/test_api_stats.py @@ -0,0 +1,11 @@ +import json +import urllib.request +import time + +time.sleep(5) +try: + data = urllib.request.urlopen('http://localhost:8000/api/live-data').read() + d = json.loads(data) + print(f"News: {len(d.get('news', []))} | Earthquakes: {len(d.get('earthquakes', []))} | Satellites: {len(d.get('satellites', []))} | CCTV: {len(d.get('cctv', []))}") +except Exception as e: + print(f"Error fetching API: {e}") diff --git a/backend/test_batch.py b/backend/test_batch.py new file mode 100644 index 0000000..3308e00 --- /dev/null +++ b/backend/test_batch.py @@ -0,0 +1,56 @@ +import requests +import json + +# Step 1: Fetch some real flights from adsb.lol +print("Fetching real flights from adsb.lol...") +r = requests.get("https://api.adsb.lol/v2/lat/39.8/lon/-98.5/dist/250", timeout=10) +data = r.json() +ac = data.get("ac", []) +print("Got", len(ac), "aircraft") + +# Step 2: Build a batch of real callsigns +planes = [] +for f in ac[:20]: # Just 20 real flights + cs = str(f.get("flight", "")).strip() + lat = f.get("lat") + lon = f.get("lon") + if cs and lat and lon: + planes.append({"callsign": cs, "lat": lat, "lng": lon}) + +print("Built batch of", len(planes), "planes") +print("Sample plane:", json.dumps(planes[0]) if planes else "NONE") + +# Step 3: Test routeset with real data +if planes: + payload = {"planes": planes} + print("Payload size:", len(json.dumps(payload)), "bytes") + r2 = requests.post("https://api.adsb.lol/api/0/routeset", json=payload, timeout=15) + print("Routeset HTTP:", r2.status_code) + if r2.status_code == 200: + result = r2.json() + print("Response type:", type(result).__name__) + print("Routes found:", len(result) if isinstance(result, list) else "dict") + if isinstance(result, list) and len(result) > 0: + print("First route:", json.dumps(result[0], indent=2)) + else: + print("Error body:", r2.text[:500]) + +# Step 4: Test with bigger batch +print("\n--- Testing with 100 real flights ---") +planes100 = [] +for f in ac[:120]: + cs = str(f.get("flight", "")).strip() + lat = f.get("lat") + lon = f.get("lon") + if cs and lat and lon: + planes100.append({"callsign": cs, "lat": lat, "lng": lon}) +planes100 = planes100[:100] + +print("Built batch of", len(planes100), "planes") +r3 = requests.post("https://api.adsb.lol/api/0/routeset", json={"planes": planes100}, timeout=15) +print("Routeset HTTP:", r3.status_code) +if r3.status_code == 200: + result3 = r3.json() + print("Routes found:", len(result3) if isinstance(result3, list) else "dict") +else: + print("Error body:", r3.text[:500]) diff --git a/backend/test_cctv.py b/backend/test_cctv.py new file mode 100644 index 0000000..87f9b92 --- /dev/null +++ b/backend/test_cctv.py @@ -0,0 +1,10 @@ +from services.cctv_pipeline import init_db, TFLJamCamIngestor, LTASingaporeIngestor + +init_db() +print("Initialized DB") + +tfl = TFLJamCamIngestor() +print(f"TFL Cameras: {len(tfl.fetch_data())}") + +nyc = LTASingaporeIngestor() +print(f"SGP Cameras: {len(nyc.fetch_data())}") diff --git a/backend/test_cctv_endpoints.py b/backend/test_cctv_endpoints.py new file mode 100644 index 0000000..2749617 --- /dev/null +++ b/backend/test_cctv_endpoints.py @@ -0,0 +1,24 @@ +import requests + +try: + print('Testing Seattle SDOT...') + r_sea = requests.get('https://data.seattle.gov/resource/65fc-btcc.json?$limit=5', headers={'X-App-Token': 'f2jdDBw5JMXPFOQyk64SKlPkn'}) + print(r_sea.status_code) + try: + print(r_sea.json()[0]) + except: + pass +except: + pass + +try: + print('Testing NYC 511...') + r_nyc = requests.get('https://webcams.nyctmc.org/api/cameras', timeout=5) + print(r_nyc.status_code) + try: + print(len(r_nyc.json())) + print(r_nyc.json()[0]) + except: + pass +except: + pass diff --git a/backend/test_counts.py b/backend/test_counts.py new file mode 100644 index 0000000..feb4841 --- /dev/null +++ b/backend/test_counts.py @@ -0,0 +1,10 @@ +import json, urllib.request + +data = json.loads(urllib.request.urlopen('http://localhost:8000/api/live-data').read()) +print(f"Commercial flights: {len(data.get('commercial_flights', []))}") +print(f"Private flights: {len(data.get('private_flights', []))}") +print(f"Private jets: {len(data.get('private_jets', []))}") +print(f"Military flights: {len(data.get('military_flights', []))}") +print(f"Tracked flights: {len(data.get('tracked_flights', []))}") +print(f"Ships: {len(data.get('ships', []))}") +print(f"CCTV: {len(data.get('cctv', []))}") diff --git a/backend/test_debug_api.py b/backend/test_debug_api.py new file mode 100644 index 0000000..ecc17c1 --- /dev/null +++ b/backend/test_debug_api.py @@ -0,0 +1,38 @@ +import json +import urllib.request + +try: + data = json.loads(urllib.request.urlopen('http://localhost:8000/api/live-data').read()) + + # Tracked flights + tracked = data.get('tracked_flights', []) + print(f"=== TRACKED FLIGHTS: {len(tracked)} ===") + if tracked: + colors = {} + for t in tracked: + c = t.get('alert_color', 'NONE') + colors[c] = colors.get(c, 0) + 1 + print(f" Colors: {colors}") + print(f" Sample: {json.dumps(tracked[0], indent=2)[:500]}") + + # Ships + ships = data.get('ships', []) + print(f"\n=== SHIPS: {len(ships)} ===") + types = {} + for s in ships: + t = s.get('type', 'unknown') + types[t] = types.get(t, 0) + 1 + print(f" Types: {types}") + if ships: + print(f" Sample: {json.dumps(ships[0], indent=2)[:300]}") + + # News + news = data.get('news', []) + print(f"\n=== NEWS: {len(news)} ===") + + # Earthquakes + quakes = data.get('earthquakes', []) + print(f"=== EARTHQUAKES: {len(quakes)} ===") + +except Exception as e: + print(f"Error: {e}") diff --git a/backend/test_final.py b/backend/test_final.py new file mode 100644 index 0000000..1c9b7b6 --- /dev/null +++ b/backend/test_final.py @@ -0,0 +1,23 @@ +import json +import urllib.request + +try: + data = json.loads(urllib.request.urlopen('http://localhost:8000/api/live-data').read()) + + tracked = data.get('tracked_flights', []) + colors = {} + for t in tracked: + c = t.get('alert_color', 'NONE') + colors[c] = colors.get(c, 0) + 1 + print(f"TRACKED FLIGHTS: {len(tracked)} | Colors: {colors}") + + ships = data.get('ships', []) + types = {} + for s in ships: + t = s.get('type', 'unknown') + types[t] = types.get(t, 0) + 1 + print(f"SHIPS: {len(ships)} | Types: {types}") + + print(f"NEWS: {len(data.get('news', []))} | EARTHQUAKES: {len(data.get('earthquakes', []))} | CCTV: {len(data.get('cctv', []))}") +except Exception as e: + print(f"Error: {e}") diff --git a/backend/test_nyc2.py b/backend/test_nyc2.py new file mode 100644 index 0000000..a78f91b --- /dev/null +++ b/backend/test_nyc2.py @@ -0,0 +1,10 @@ +import requests, json + +url = "https://api.us.socrata.com/api/catalog/v1?domains=data.cityofnewyork.us&q=camera" +try: + r = requests.get(url) + res = r.json().get('results', []) + for d in res: + print(f"{d['resource']['id']} - {d['resource']['name']}") +except Exception as e: + print(e) diff --git a/backend/test_origin.py b/backend/test_origin.py new file mode 100644 index 0000000..311559f --- /dev/null +++ b/backend/test_origin.py @@ -0,0 +1,36 @@ +import json, urllib.request + +data = json.loads(urllib.request.urlopen('http://localhost:8000/api/live-data').read()) + +# Check trail data +comm = data.get('commercial_flights', []) +mil = data.get('military_flights', []) +tracked = data.get('tracked_flights', []) +pvt = data.get('private_flights', []) + +# Count flights with trails +comm_trails = [f for f in comm if f.get('trail') and len(f['trail']) > 0] +mil_trails = [f for f in mil if f.get('trail') and len(f['trail']) > 0] +tracked_trails = [f for f in tracked if f.get('trail') and len(f['trail']) > 0] +pvt_trails = [f for f in pvt if f.get('trail') and len(f['trail']) > 0] + +print(f"Commercial: {len(comm)} total, {len(comm_trails)} with trails") +print(f"Military: {len(mil)} total, {len(mil_trails)} with trails") +print(f"Tracked: {len(tracked)} total, {len(tracked_trails)} with trails") +print(f"Private: {len(pvt)} total, {len(pvt_trails)} with trails") + +# Show a sample trail +if mil_trails: + f = mil_trails[0] + print(f"\nSample trail ({f['callsign']}):") + print(f" Points: {len(f['trail'])}") + if f['trail']: + print(f" First: {f['trail'][0]}") + print(f" Last: {f['trail'][-1]}") + +# Check for grounded planes +grounded = [f for f in comm if f.get('alt', 999) <= 500 and f.get('speed_knots', 999) < 30] +print(f"\nGrounded commercial: {len(grounded)}") +if grounded: + g = grounded[0] + print(f" Example: {g['callsign']} alt={g.get('alt')} speed={g.get('speed_knots')}") diff --git a/backend/test_osm_db.py b/backend/test_osm_db.py new file mode 100644 index 0000000..f794def --- /dev/null +++ b/backend/test_osm_db.py @@ -0,0 +1,13 @@ +import sqlite3 + +try: + conn = sqlite3.connect('cctv.db') + conn.row_factory = sqlite3.Row + cur = conn.cursor() + cur.execute("SELECT source_agency, COUNT(*) as count FROM cameras WHERE id LIKE 'OSM-%' GROUP BY source_agency") + rows = cur.fetchall() + print('OSM Cameras by City:') + for r in rows: + print(f"{r['source_agency']}: {r['count']}") +except Exception as e: + print('DB Error:', e) diff --git a/backend/test_ships.py b/backend/test_ships.py new file mode 100644 index 0000000..6627547 --- /dev/null +++ b/backend/test_ships.py @@ -0,0 +1,12 @@ +import json +import urllib.request +import time + +time.sleep(5) +try: + data = urllib.request.urlopen('http://localhost:8000/api/live-data').read() + d = json.loads(data) + ships = d.get('ships', []) + print(f"Ships: {len(ships)}") +except Exception as e: + print(f"Error fetching API: {e}") diff --git a/backend/test_socrata.py b/backend/test_socrata.py new file mode 100644 index 0000000..5951bef --- /dev/null +++ b/backend/test_socrata.py @@ -0,0 +1,13 @@ +import requests, json + +print("Searching Socrata NYC/Seattle Cameras...") +try: + url = "https://api.us.socrata.com/api/catalog/v1?q=traffic cameras&limit=100" + r = requests.get(url) + res = r.json().get('results', []) + for d in res: + domain = d['metadata']['domain'].lower() + if 'seattle' in domain or 'newyork' in domain or 'nyc' in domain: + print(f"{d['resource']['id']} - {d['resource']['name']} ({domain})") +except Exception as e: + print(e) diff --git a/backend/test_trace.py b/backend/test_trace.py new file mode 100644 index 0000000..fffaa96 --- /dev/null +++ b/backend/test_trace.py @@ -0,0 +1,61 @@ +"""Test trace endpoints with explicit output.""" +import json, subprocess + +hex_code = "a34bac" # DOJ166 + +from datetime import datetime, timezone +now = datetime.now(timezone.utc) +date_str = now.strftime("%Y/%m/%d") +hex_prefix = hex_code[-2:] + +# Test 1: adsb.fi trace_full +url1 = f"https://globe.adsb.fi/data/traces/{date_str}/{hex_prefix}/trace_full_{hex_code}.json" +print(f"URL1: {url1}") +r = subprocess.run(["curl.exe", "-s", "--max-time", "10", url1], capture_output=True, text=True, timeout=15) +if r.stdout.strip().startswith("{"): + data = json.loads(r.stdout) + print(f"SUCCESS! Keys: {list(data.keys())}") + if 'trace' in data: + pts = data['trace'] + print(f"Trace points: {len(pts)}") + if pts: + print(f"FIRST (takeoff): {pts[0]}") + print(f"LAST (now): {pts[-1]}") +else: + print(f"Not JSON (first 100 chars): {r.stdout[:100]}") + # That response was behind cloudflare, try adsb.lol instead + +# Test 2: adsb.lol hex lookup +url2 = f"https://api.adsb.lol/v2/hex/{hex_code}" +print(f"\nURL2: {url2}") +r2 = subprocess.run(["curl.exe", "-s", "--max-time", "10", url2], capture_output=True, text=True, timeout=15) +if r2.stdout.strip().startswith("{"): + data = json.loads(r2.stdout) + if 'ac' in data and data['ac']: + ac = data['ac'][0] + keys = sorted(ac.keys()) + print(f"All keys ({len(keys)}): {keys}") +else: + print(f"Not JSON: {r2.stdout[:100]}") + +# Test 3: Try adsb.lol trace +url3 = f"https://api.adsb.lol/trace/{hex_code}" +print(f"\nURL3: {url3}") +r3 = subprocess.run(["curl.exe", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "10", url3], capture_output=True, text=True, timeout=15) +print(f"HTTP status: {r3.stdout}") + +# Test 4: Try globe.adsb.lol format +url4 = f"https://globe.adsb.lol/data/traces/{date_str}/{hex_prefix}/trace_full_{hex_code}.json" +print(f"\nURL4: {url4}") +r4 = subprocess.run(["curl.exe", "-s", "--max-time", "10", url4], capture_output=True, text=True, timeout=15) +if r4.stdout.strip().startswith("{"): + data = json.loads(r4.stdout) + print(f"SUCCESS! Keys: {list(data.keys())}") + if 'trace' in data: + pts = data['trace'] + print(f"Trace points: {len(pts)}") + if pts: + print(f"FIRST (takeoff): {pts[0]}") + print(f"LAST (now): {pts[-1]}") +else: + print(f"Response: {r4.stdout[:150]}") diff --git a/backend/test_ws.py b/backend/test_ws.py new file mode 100644 index 0000000..d9dee1e --- /dev/null +++ b/backend/test_ws.py @@ -0,0 +1,8 @@ +import asyncio, websockets +async def main(): + try: + async with websockets.connect('wss://stream.aisstream.io/v0/stream') as ws: + print('Connected to AIS Stream!') + except Exception as e: + print(f"Error: {e}") +asyncio.run(main()) diff --git a/backend/wsdot_sample.json b/backend/wsdot_sample.json new file mode 100644 index 0000000..b232c3b --- /dev/null +++ b/backend/wsdot_sample.json @@ -0,0 +1 @@ +Bad Request \ No newline at end of file diff --git a/backend/xlsx_analysis.txt b/backend/xlsx_analysis.txt new file mode 100644 index 0000000..d89009c --- /dev/null +++ b/backend/xlsx_analysis.txt @@ -0,0 +1,2533 @@ + +=== SHEET 1: 1000 rows === + Row0 Q: 'https://www.scanriverside.com/viewtopic.php?t=1274' + + Row1 B: 'Business' + Row1 C: 'Section 1' + Row1 E: 'Government' + Row1 F: 'Section 1' + Row1 H: 'People' + Row1 I: 'Section 1' + Row1 K: 'Sports' + Row1 L: 'Section 1' + Row1 N: 'Celebrity' + Row1 O: 'Section 1' + Row1 Q: 'State Govt./Law' + Row1 R: 'Section 1' + Row1 T: 'Other' + Row1 U: 'Section 1' + Row1 W: 'Test Aircraft' + Row1 X: 'Section 1' + Row1 Z: 'YouTubers' + Row1 AA: 'Section 1' + Row1 AC: 'Formula 1 VIP's' + Row1 AD: 'Section 1' + Row1 AF: 'Active GII's and GIII's' + Row1 AG: 'Section 1' + Row1 AI: 'Russia & Ukraine' + Row1 AK: 'Section 1' + Row1 AM: 'Helicopters & Blimps' + Row1 AN: 'Section 1' + Row1 AP: 'Unique Reg's' + Row1 AQ: 'Section 1' + Row1 AS: 'Saudi & UAE' + Row1 AT: 'Section 1' + Row1 AV: 'Schools' + Row1 AW: 'Section 1' + Row1 AY: 'Special Charter' + Row1 AZ: 'Section 1' + Row1 BB: 'Unknown Owners' + Row1 BC: 'Section 1' + Row1 BE: 'Frequent Flyers' + + Row2 B: 'https://globe.adsbexchange.com/?reg=N2702,N550AV,N551AV,N554AV,N556AV,N82123,N28' + Row2 D: '.' + Row2 E: 'https://globe.adsbexchange.com/?reg=929000,828000,980001,980002,990003,990004,00' + Row2 G: '.' + Row2 H: 'https://globe.adsbexchange.com/?reg=N628TS,N887WM,N608WM,N897WM,N194WM,N459WM,N8' + Row2 J: '.' + Row2 K: 'https://globe.adsbexchange.com/?reg=N801DM,N1AZ,N867DA,N36NE,N225NE,N101TD,N106T' + Row2 M: '.' + Row2 N: 'https://globe.adsbexchange.com/?reg=N313AR,N703BG,N701DB,N4DP,N800JM,N621MM,N767' + Row2 P: '.' + Row2 Q: 'https://globe.adsbexchange.com/?reg=N225LH,N1073S,N906V,N52437,N1263S,N407SA,N15' + Row2 S: '.' + Row2 T: 'https://globe.adsbexchange.com/?reg=N787RR,N794AJ,N330AU,N782SP,N783SP,FWBXL,FGX' + Row2 V: '.' + Row2 W: 'https://globe.adsbexchange.com/?reg=CGLBO,CGLBG,CGLBX,CGLB,N700GA,N702GD,N703GD,' + Row2 Y: '.' + Row2 Z: 'https://globe.adsbexchange.com/?reg=N2RF,N2MJ,N390GM,N3175W,N5921C,N9477A,N367HP' + Row2 AB: '.' + Row2 AC: 'https://globe.adsbexchange.com/?reg=MREEE,HBFXF,N155AN,OELCY,HSCDY,A9CHAK,OEIDM,' + Row2 AE: '.' + Row2 AH: '.' + Row2 AI: 'https://globe.adsbexchange.com/?reg=RA11005,VPCLS,RA02775,VPCLO,VPCLZ,P4MES,P4BD' + Row2 AJ: 'old' + Row2 AK: 'new (late 2023)' + Row2 AL: '.' + Row2 AM: 'https://globe.adsbexchange.com/?reg=N608WM,N4144C,N988FY,N983SV,N324FD,N1A,N2A,N' + Row2 AO: '.' + Row2 AP: 'https://globe.adsbexchange.com/?reg=MABCD,MAGMA,MAHAA,MAMBA,MDODO,MELON,MINTY,MT' + Row2 AR: '.' + Row2 AS: 'https://globe.adsbexchange.com/?reg=HZHM1,HZHM1A,HZHM1B,HZHM1C,HZHMED,HZHMS2,HZ1' + Row2 AU: '.' + Row2 AV: 'https://globe.adsbexchange.com/?reg=N70464,N70465,N10AU,N20AU,N934CT,N1UA,N851FS' + Row2 AX: '.' + Row2 AY: 'https://globe.adsbexchange.com/?reg=9HVIB,9HVIC,9HVID,9HVIE,9HVIG,9HVIH,9HVII,9H' + Row2 BA: '.' + Row2 BE: 'Name' + Row2 BF: 'Primary Aircraft' + Row2 BG: 'Logged?' + Row2 BH: 'Hours/days spent in air annually' + + Row3 B: '21st Century Fox America' + Row3 C: 'N2702' + Row3 D: '.' + Row3 E: 'United States of America 747/757' + Row3 F: '92-9000, 82-8000, 98-0001, 98-0002, 99-0003, 99-0004, 00-9001, 09-2016, 09-2017,' + Row3 G: '.' + Row3 H: 'Elon Musk' + Row3 I: 'N628TS' + Row3 J: '.' + Row3 K: 'Dallas Mavericks' + Row3 L: 'N801DM' + Row3 M: '.' + Row3 N: 'Alex Rodriguez' + Row3 O: 'N313AR' + Row3 P: '.' + Row3 Q: 'State of Alabama' + Row3 R: 'N225LH, N1073S, N906V, N52437, N1263S, N407SA, N157SA, N160SA, N477GF, N5329S' + Row3 S: '.' + Row3 T: 'Rolls Royce Test Bed' + Row3 U: 'N787RR' + Row3 V: '.' + Row3 W: 'Bombardier Global 7500' + Row3 X: 'C-GLBO, C-GLBG, C-GLBX, C-GBLB ' + Row3 Y: '.' + Row3 Z: 'CitationMax' + Row3 AA: 'N2RF, N2MJ' + Row3 AB: '.' + Row3 AC: 'Bernie Ecclestone ' + Row3 AD: 'M-REEE, HB-FXF' + Row3 AE: '.' + Row3 AF: 'Link 1' + Row3 AG: 'https://globe.adsbexchange.com/?reg=N55RG,XBPHA,N24YS,N890TJ,XBKFU,N137GJ,ZSPYY,' + Row3 AH: '.' + Row3 AI: 'Vladimir Potanin' + Row3 AJ: 'OE-LUC' + Row3 AK: 'RA11005' + Row3 AL: '.' + Row3 AM: 'Bill Gates' + Row3 AN: 'N608GV' + Row3 AO: '.' + Row3 AP: 'T7-ROYAL' + Row3 AQ: 'M-ABCD' + Row3 AR: '.' + Row3 AS: 'B747-468' + Row3 AT: 'HZHM1' + Row3 AU: '.' + Row3 AV: 'Air Force Academy' + Row3 AW: 'N70464, N70465' + Row3 AX: '.' + Row3 AY: 'VistaJet Global 7500' + Row3 AZ: '9H-VIB, 9H-VIC, 9H-VID, 9H-VIE, 9H-VIG, 9H-VIH, 9H-VII, 9H-VIJ, 9H-VIK, 9H-VIL, ' + Row3 BA: '.' + Row3 BE: 'Ken Griffin' + Row3 BF: 'Bombardier Global' + Row3 BG: 'Yes' + Row3 BH: '~800 hours a year' + + Row4 B: 'AbbVie' + Row4 C: 'N550AV, N551AV, N554AV, N556AV' + Row4 D: '.' + Row4 E: 'FBI (Federal Bureau of Investigation)' + Row4 F: 'N616RK' + Row4 G: '.' + Row4 H: 'Bill Gates' + Row4 I: 'N887GV, N608GV, N897GV' + Row4 J: '.' + Row4 K: 'Arizona Cardinals Football' + Row4 L: 'N1AZ, N867DA ' + Row4 M: '.' + Row4 N: 'Blake Shelton ' + Row4 O: 'N703BG' + Row4 P: '.' + Row4 Q: 'State of Alaska' + Row4 R: 'N1867, N574ST, N8370Q, N246CC, N145PL, N1323Y, N70715, N303GV, N20786, N4730E, N' + Row4 S: '.' + Row4 T: 'Zero G Plane' + Row4 U: 'N794AJ' + Row4 V: '.' + Row4 W: 'Gulfstream G700' + Row4 X: 'N700GA, N702GD, N703GD, N703GA, N704GA, N705GD, N706GD' + Row4 Y: '.' + Row4 Z: 'Premier1Driver' + Row4 AA: 'N390GM' + Row4 AB: '.' + Row4 AC: 'Chalerm Yoovidhya ' + Row4 AD: 'N155AN, OE-LCY, HS-CDY' + Row4 AE: '.' + Row4 AF: 'Link 2' + Row4 AG: 'https://globe.adsbexchange.com/?reg=N189PA,FWAAD,XBNXC,N945NA,N711VL,N892TM,N868' + Row4 AH: '.' + Row4 AI: 'Vladimir Potanin' + Row4 AJ: 'OE-IPE' + Row4 AL: '.' + Row4 AM: 'Blake Shelton' + Row4 AN: 'N4144C' + Row4 AO: '.' + Row4 AP: 'M-AGIC' + Row4 AQ: 'M-AGMA' + Row4 AR: '.' + Row4 AS: 'B747-368' + Row4 AT: 'HZHM1A' + Row4 AU: '.' + Row4 AV: 'Auburn University' + Row4 AW: 'N10AU, N20AU' + Row4 AX: '.' + Row4 AY: 'NetJets Global 7500 & 5-6' + Row4 AZ: 'N160QS, N141QS, N100QS, N162QS, N142QS, N143QS, N166QS, N104QS, N163QS, N109QS, ' + Row4 BA: '.' + Row4 BE: 'Thomas Flohr ' + Row4 BF: 'Bombardier Global' + Row4 BG: 'No' + Row4 BH: '~750 hours a year' + + +=== SHEET 2: 1006 rows === + + Row1 B: 'Superyachts - Russian/Oligarch' + Row1 G: 'Superyachts - General' + + Row2 B: 'Owner' + Row2 C: 'Vessel Name' + Row2 D: 'IMO' + Row2 E: 'MMSI' + Row2 G: 'Owner' + Row2 H: 'Vessel Name' + Row2 I: 'IMO' + Row2 J: 'MMSI' + + Row3 B: 'Roman Abramovich' + Row3 C: 'Eclipse' + Row3 D: '1009613.0' + Row3 E: '3.10593E8' + Row3 G: 'Sheikh Tamim bin Hamad Al Thani' + Row3 H: 'Al Lusail' + Row3 I: '9772929.0' + Row3 J: '4.66443E8' + + Row4 B: 'Roman Abramovich' + Row4 C: 'Eclipse 1 (Tender)' + Row4 G: 'Family of Steve Jobs' + Row4 H: 'Venus' + Row4 I: '1011836.0' + Row4 J: '3.19327E8' + + +=== SHEET 3: 1079 rows === + + Row1 B: 'Type/Airframe' + Row1 C: 'Regisitration' + Row1 D: '3D Tour Link' + Row1 F: 'Key' + + Row2 B: 'Airbus A350 (Commercial)' + Row2 D: 'https://my.matterport.com/show/?m=BuSmyKU9tJH' + Row2 F: 'Term' + Row2 G: 'Meaning' + + Row3 B: 'Airbus ACJ318 (Comlux)' + Row3 D: 'https://my.matterport.com/show/?m=uNhpDuo68eY' + Row3 F: 'ACJ' + Row3 G: 'Airbus Corporate Jet (private jet)' + + Row4 B: 'Airbus ACJ318 (Global Jet Lux.)' + Row4 C: 'LX-LTI' + Row4 D: 'https://my.matterport.com/show/?m=9mwsfKBPPbq' + Row4 F: 'BBJ' + Row4 G: 'Boeing Business Jet (private jet)' + + +=== SHEET 4: 1002 rows === + Row0 C: 'Spy Planes' + + Row1 B: 'ICAO' + Row1 C: 'Company' + + Row2 B: 'A006AF' + Row2 C: 'AIRCRAFT ASSOCIATES INC' + + Row3 B: 'A00C4B' + Row3 C: 'OTV LEASING' + + Row4 B: 'A04ECF' + Row4 C: 'UNITED STATES DEPARTMENT OF JUSTICE' + Row4 G: 'https://github.com/enigma-io/fbi-planes/blob/master/data/fbi-planes.csv' + + +TOTAL ENTRIES: 4433 +UNIQUE REGISTRATIONS: 2255 + +plane-alert-db: 15609 registrations +Already covered: 516 +MISSING: 1739 + +--- ALREADY TRACKED --- + https://globe.adsbexchange.com/?reg=N270 N550AV DB_CAT: As Seen on TV DB_OP: Abbvie US + https://globe.adsbexchange.com/?reg=N270 N554AV DB_CAT: As Seen on TV DB_OP: AbbVie + https://globe.adsbexchange.com/?reg=N270 N82123 DB_CAT: As Seen on TV DB_OP: Adobe Inc + https://globe.adsbexchange.com/?reg=N270 N280AF DB_CAT: Vanity Plate DB_OP: Aflac + https://globe.adsbexchange.com/?reg=N270 N650GB DB_CAT: As Seen on TV DB_OP: American Express Travel + https://globe.adsbexchange.com/?reg=N270 N100AL DB_CAT: As Seen on TV DB_OP: Abbott Laboratories + https://globe.adsbexchange.com/?reg=N270 N900AL DB_CAT: As Seen on TV DB_OP: Abbott Laboratories + https://globe.adsbexchange.com/?reg=N270 N550AL DB_CAT: As Seen on TV DB_OP: Abbott Laboratories + https://globe.adsbexchange.com/?reg=N270 N558GA DB_CAT: As Seen on TV DB_OP: Amgen + https://globe.adsbexchange.com/?reg=N270 N651BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N270 N710CF DB_CAT: As Seen on TV DB_OP: Calspan Corp + https://globe.adsbexchange.com/?reg=N270 N797CT DB_CAT: As Seen on TV DB_OP: Caterpillar Inc + https://globe.adsbexchange.com/?reg=N270 N385CT DB_CAT: As Seen on TV DB_OP: Caterpillar Inc + https://globe.adsbexchange.com/?reg=N270 N8VB DB_CAT: As Seen on TV DB_OP: Paramount Pictures + https://globe.adsbexchange.com/?reg=N270 N75VB DB_CAT: As Seen on TV DB_OP: Paramount Pictures + https://globe.adsbexchange.com/?reg=N270 N1876P DB_CAT: Climate Crisis DB_OP: Chevron USA + https://globe.adsbexchange.com/?reg=N270 N1895T DB_CAT: Climate Crisis DB_OP: Chevron USA + https://globe.adsbexchange.com/?reg=N270 N1901G DB_CAT: Climate Crisis DB_OP: Chevron USA + https://globe.adsbexchange.com/?reg=N270 N967TC DB_CAT: As Seen on TV DB_OP: Chick-Fil-A + https://globe.adsbexchange.com/?reg=N270 N2019C DB_CAT: As Seen on TV DB_OP: Bombardier Aerospace Corp + https://globe.adsbexchange.com/?reg=N270 N805WM DB_CAT: As Seen on TV DB_OP: Citigroup Inc + https://globe.adsbexchange.com/?reg=N270 N886RW DB_CAT: As Seen on TV DB_OP: Coca-Cola Company + https://globe.adsbexchange.com/?reg=N270 N959RW DB_CAT: As Seen on TV DB_OP: Coca-Cola Company + https://globe.adsbexchange.com/?reg=N270 N982RW DB_CAT: As Seen on TV DB_OP: Coca-Cola Company + https://globe.adsbexchange.com/?reg=N270 N793CP DB_CAT: Climate Crisis DB_OP: ConocoPhillips + https://globe.adsbexchange.com/?reg=N270 N676BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N270 N228BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N270 N285BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N270 N286BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N270 N708JH DB_CAT: Dogs with Jobs DB_OP: Dept of State JPATS + https://globe.adsbexchange.com/?reg=N270 N119NA DB_CAT: Oxcart DB_OP: Department Of Justice (DOJ) + https://globe.adsbexchange.com/?reg=N270 N721AL DB_CAT: Oxcart DB_OP: Department Of Justice + https://globe.adsbexchange.com/?reg=N270 N874TW DB_CAT: Oxcart DB_OP: Department Of Justice (DOJ) + https://globe.adsbexchange.com/?reg=N270 N115H DB_CAT: Oxcart DB_OP: Department of Homeland Security + https://globe.adsbexchange.com/?reg=N270 N279AD DB_CAT: Dogs with Jobs DB_OP: Dept of State JPATS + https://globe.adsbexchange.com/?reg=N270 N640CS DB_CAT: Dogs with Jobs DB_OP: Dept of State JPATS + https://globe.adsbexchange.com/?reg=N270 N311MS DB_CAT: Governments DB_OP: Department of Justice (DOJ) + https://globe.adsbexchange.com/?reg=N270 N2316 DB_CAT: Nuclear DB_OP: Nuclear Security Administration + https://globe.adsbexchange.com/?reg=N270 N2317 DB_CAT: Nuclear DB_OP: Nuclear Security Administration + https://globe.adsbexchange.com/?reg=N270 N2319 DB_CAT: Nuclear DB_OP: Nuclear Security Administration + https://globe.adsbexchange.com/?reg=N270 N980ST DB_CAT: Nuclear DB_OP: US Nuclear Security Administration + https://globe.adsbexchange.com/?reg=N270 N990ST DB_CAT: Nuclear DB_OP: US Nuclear Security Administration + https://globe.adsbexchange.com/?reg=N270 N628TS DB_CAT: Don't you know who I am? DB_OP: Falcon Landing LLC + https://globe.adsbexchange.com/?reg=N270 N887WM DB_CAT: Don't you know who I am? DB_OP: Bill Gates + https://globe.adsbexchange.com/?reg=N270 N194WM DB_CAT: Don't you know who I am? DB_OP: Bill Gates + https://globe.adsbexchange.com/?reg=N270 N817GS DB_CAT: Don't you know who I am? DB_OP: Larry Ellison + https://globe.adsbexchange.com/?reg=N270 N921MT DB_CAT: Don't you know who I am? DB_OP: Mark Cuban + https://globe.adsbexchange.com/?reg=N270 N29UB DB_CAT: Zoomies DB_OP: Jared Isaacman + https://globe.adsbexchange.com/?reg=N270 N512XA DB_CAT: Distinctive DB_OP: Jared Isaacman + https://globe.adsbexchange.com/?reg=N270 N135EM DB_CAT: Distinctive DB_OP: Jared Isaacman + https://globe.adsbexchange.com/?reg=N270 N137EM DB_CAT: Distinctive DB_OP: Jared Isaacman + https://globe.adsbexchange.com/?reg=N270 N138EM DB_CAT: Distinctive DB_OP: Jared Isaacman + https://globe.adsbexchange.com/?reg=N270 N68KP DB_CAT: PIA DB_OP: Ken Griffin + https://globe.adsbexchange.com/?reg=N270 N302AK DB_CAT: PIA DB_OP: Ken Griffin + https://globe.adsbexchange.com/?reg=N270 N113CS DB_CAT: PIA DB_OP: 113CS LLC + https://globe.adsbexchange.com/?reg=N270 N138GL DB_CAT: Don't you know who I am? DB_OP: George Lucas + https://globe.adsbexchange.com/?reg=N270 N51VE DB_CAT: Vanity Plate DB_OP: LoveFrom Inc + https://globe.adsbexchange.com/?reg=N270 N651WE DB_CAT: As Seen on TV DB_OP: Google Inc + https://globe.adsbexchange.com/?reg=N270 N652WE DB_CAT: Don't you know who I am? DB_OP: Eric Schmidt + https://globe.adsbexchange.com/?reg=N270 N950TR DB_CAT: Climate Crisis DB_OP: Silver Air + https://globe.adsbexchange.com/?reg=N270 N517TW DB_CAT: Don't you know who I am? DB_OP: Tiger Woods + https://globe.adsbexchange.com/?reg=N270 N68885 DB_CAT: Don't you know who I am? DB_OP: Mark Zuckerberg + https://globe.adsbexchange.com/?reg=N270 N47EG DB_CAT: Don't you know who I am? DB_OP: Michael Bloomberg + https://globe.adsbexchange.com/?reg=N270 N5MV DB_CAT: Don't you know who I am? DB_OP: Michael Bloomberg + https://globe.adsbexchange.com/?reg=N270 N8AG DB_CAT: Don't you know who I am? DB_OP: Michael Bloomberg + https://globe.adsbexchange.com/?reg=N270 N3880 DB_CAT: Don't you know who I am? DB_OP: Mark Zuckerberg + https://globe.adsbexchange.com/?reg=N270 N1AZ DB_CAT: Football DB_OP: Arizona Cardinals + https://globe.adsbexchange.com/?reg=N270 N867DA DB_CAT: Football DB_OP: The Arizona Cardinals + https://globe.adsbexchange.com/?reg=N270 N36NE DB_CAT: Football DB_OP: Eastern Airlines + https://globe.adsbexchange.com/?reg=N270 N225NE DB_CAT: Football DB_OP: Eastern Airlines + https://globe.adsbexchange.com/?reg=N270 N101TD DB_CAT: Climate Crisis DB_OP: Bopper Airways + https://globe.adsbexchange.com/?reg=N270 N931FL DB_CAT: As Seen on TV DB_OP: Hewlett-Packard + https://globe.adsbexchange.com/?reg=N270 N1DC DB_CAT: Don't you know who I am? DB_OP: Jerry Jones + https://globe.adsbexchange.com/?reg=N270 N625HR DB_CAT: As Seen on TV DB_OP: Houston Rockets + https://globe.adsbexchange.com/?reg=N270 N9CE DB_CAT: Vanity Plate DB_OP: Chase Elliot + https://globe.adsbexchange.com/?reg=N270 N629BK DB_CAT: As Seen on TV DB_OP: Brad Keselowski Racing + https://globe.adsbexchange.com/?reg=N270 N800MA DB_CAT: Don't you know who I am? DB_OP: Marco Andretti + https://globe.adsbexchange.com/?reg=N270 N518JG DB_CAT: As Seen on TV DB_OP: Joe Gibbs Racing + https://globe.adsbexchange.com/?reg=N270 N519JG DB_CAT: As Seen on TV DB_OP: Joe Gibbs Racing + https://globe.adsbexchange.com/?reg=N270 N520JG DB_CAT: As Seen on TV DB_OP: Joe Gibbs Racing + https://globe.adsbexchange.com/?reg=N270 N500RH DB_CAT: As Seen on TV DB_OP: Hendrick Motorsports + https://globe.adsbexchange.com/?reg=N270 N509RH DB_CAT: As Seen on TV DB_OP: Hendrick Motorsports + https://globe.adsbexchange.com/?reg=N270 N500PR DB_CAT: As Seen on TV DB_OP: Penske Racing Inc. + https://globe.adsbexchange.com/?reg=N270 N270GP DB_CAT: Don't you know who I am? DB_OP: Troy Aikman + https://globe.adsbexchange.com/?reg=N270 N330RW DB_CAT: Don't you know who I am? DB_OP: Russel Wilson + https://globe.adsbexchange.com/?reg=N270 N70AG DB_CAT: Football DB_OP: LA Chargers + https://globe.adsbexchange.com/?reg=N270 N1RP DB_CAT: Don't you know who I am? DB_OP: Roger Penske + https://globe.adsbexchange.com/?reg=N270 N5117 DB_CAT: Football DB_OP: The NY Football Giants + https://globe.adsbexchange.com/?reg=N270 N411ST DB_CAT: Football DB_OP: Benson Football LLC + https://globe.adsbexchange.com/?reg=N270 N313AR DB_CAT: Don't you know who I am? DB_OP: Alex Rodriguez + https://globe.adsbexchange.com/?reg=N270 N701DB DB_CAT: Don't you know who I am? DB_OP: Dan Bilzerian + https://globe.adsbexchange.com/?reg=N270 N4DP DB_CAT: Don't you know who I am? DB_OP: Green Chair Productions Inc + https://globe.adsbexchange.com/?reg=N270 N621MM DB_CAT: Don't you know who I am? DB_OP: Island Jet Inc + https://globe.adsbexchange.com/?reg=N270 N767CJ DB_CAT: Don't you know who I am? DB_OP: Drake + https://globe.adsbexchange.com/?reg=N270 N6GU DB_CAT: Don't you know who I am? DB_OP: Harrison Ford + https://globe.adsbexchange.com/?reg=N270 N162JC DB_CAT: Don't you know who I am? DB_OP: Jim Carrey + https://globe.adsbexchange.com/?reg=N270 N905FJ DB_CAT: Don't you know who I am? DB_OP: Constellation Productions + https://globe.adsbexchange.com/?reg=N270 N7KC DB_CAT: Don't you know who I am? DB_OP: Kenny Chesney + https://globe.adsbexchange.com/?reg=N270 N71KR DB_CAT: Don't you know who I am? DB_OP: Kid Rock + https://globe.adsbexchange.com/?reg=N270 N810KJ DB_CAT: Don't you know who I am? DB_OP: Kylie Jenner + https://globe.adsbexchange.com/?reg=N270 N143MW DB_CAT: Don't you know who I am? DB_OP: Mark Wahlberg + https://globe.adsbexchange.com/?reg=N270 N236MJ DB_CAT: Don't you know who I am? DB_OP: Michael Jordan + https://globe.adsbexchange.com/?reg=N270 N540W DB_CAT: Don't you know who I am? DB_OP: Oprah Winfrey + https://globe.adsbexchange.com/?reg=N270 N950PB DB_CAT: As Seen on TV DB_OP: Playboy Corporation + https://globe.adsbexchange.com/?reg=N270 N44440 DB_CAT: Don't you know who I am? DB_OP: Jay-Z + https://globe.adsbexchange.com/?reg=N270 N3250N DB_CAT: Don't you know who I am? DB_OP: Shaq + https://globe.adsbexchange.com/?reg=N270 N800KS DB_CAT: Climate Crisis DB_OP: AEJ Services LLC + https://globe.adsbexchange.com/?reg=N270 N900KS DB_CAT: Don't you know who I am? DB_OP: Steven Spielberg + https://globe.adsbexchange.com/?reg=N270 N77VA DB_CAT: Don't you know who I am? DB_OP: Tom Cruise + https://globe.adsbexchange.com/?reg=N270 N90322 DB_CAT: Police Forces DB_OP: Alaska Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N911AZ DB_CAT: Police Forces DB_OP: Arizona Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N921AZ DB_CAT: Police Forces DB_OP: Arizona Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N56AZ DB_CAT: Police Forces DB_OP: Arizona Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N58AZ DB_CAT: Police Forces DB_OP: Arizona Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N783AZ DB_CAT: Police Forces DB_OP: Arizona Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N140HP DB_CAT: Police Forces DB_OP: California Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N327SF DB_CAT: Aerial Firefighter DB_OP: Colorado Fire Prevention and Control + https://globe.adsbexchange.com/?reg=N270 N943FL DB_CAT: Vanity Plate DB_OP: Ron Desantis + https://globe.adsbexchange.com/?reg=N270 N239KQ DB_CAT: Governments DB_OP: Idaho Transportation Department + https://globe.adsbexchange.com/?reg=N270 N24SP DB_CAT: Police Forces DB_OP: Kentucky State Police + https://globe.adsbexchange.com/?reg=N270 N36SP DB_CAT: Police Forces DB_OP: Kentucky State Police + https://globe.adsbexchange.com/?reg=N270 N220SP DB_CAT: Police Forces DB_OP: Kentucky State Police + https://globe.adsbexchange.com/?reg=N270 N65HA DB_CAT: Dogs with Jobs DB_OP: Louisiana Department of Wildlife and Fis + https://globe.adsbexchange.com/?reg=N270 N91WF DB_CAT: Dogs with Jobs DB_OP: Louisiana Department of Wildlife and Fis + https://globe.adsbexchange.com/?reg=N270 N670SP DB_CAT: Police Forces DB_OP: Louisiana Department of Public Safety + https://globe.adsbexchange.com/?reg=N270 N381MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N382MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N383MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N384MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N385MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N386MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N387MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N388MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N389MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N390MD DB_CAT: Police Forces DB_OP: Maryland State Police + https://globe.adsbexchange.com/?reg=N270 N823JM DB_CAT: Police Forces DB_OP: Massachusetts State Police + https://globe.adsbexchange.com/?reg=N270 N822PP DB_CAT: Police Forces DB_OP: Massachusetts State Police + https://globe.adsbexchange.com/?reg=N270 N825MM DB_CAT: Police Forces DB_OP: Massachusetts State Police + https://globe.adsbexchange.com/?reg=N270 N824AH DB_CAT: Police Forces DB_OP: Massachusetts State Police + https://globe.adsbexchange.com/?reg=N270 N162ST DB_CAT: Police Forces DB_OP: Michigan State Police + https://globe.adsbexchange.com/?reg=N270 N383ST DB_CAT: Police Forces DB_OP: Michigan State Police + https://globe.adsbexchange.com/?reg=N270 N768ST DB_CAT: Police Forces DB_OP: Michigan State Police + https://globe.adsbexchange.com/?reg=N270 N827ST DB_CAT: Police Forces DB_OP: MI State Police + https://globe.adsbexchange.com/?reg=N270 N1NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N2NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N3NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N5NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N6NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N7NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N9NJ DB_CAT: Police Forces DB_OP: New Jersey State Police + https://globe.adsbexchange.com/?reg=N270 N9SP DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N12SP DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N61SP DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N200NY DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N430NY DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N430SP DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N432NY DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N761NY DB_CAT: Police Forces DB_OP: New York State Police + https://globe.adsbexchange.com/?reg=N270 N3NC DB_CAT: Ptolemy would be proud DB_OP: North Carolina Dept of Transportation + https://globe.adsbexchange.com/?reg=N270 N1712S DB_CAT: Governments DB_OP: North Carolina Environment and Natural R + https://globe.adsbexchange.com/?reg=N270 N401NC DB_CAT: Police Forces DB_OP: North Carolina Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N404NC DB_CAT: Police Forces DB_OP: North Carolina Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N405NC DB_CAT: Police Forces DB_OP: North Carolina Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N406NC DB_CAT: Police Forces DB_OP: North Carolina State Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N801NC DB_CAT: Governments DB_OP: North Carolina Agriculture & Consumer + https://globe.adsbexchange.com/?reg=N270 N803NC DB_CAT: Aerial Firefighter DB_OP: North Carolina Forest Service + https://globe.adsbexchange.com/?reg=N270 N920NC DB_CAT: Governments DB_OP: North Carolina Agriculture & Consumer + https://globe.adsbexchange.com/?reg=N270 N72HP DB_CAT: Police Forces DB_OP: Ohio Highway Patrol + https://globe.adsbexchange.com/?reg=N270 N872ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N873ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N874ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N875ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N878ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N879ST DB_CAT: Police Forces DB_OP: Pennsylvania State Police + https://globe.adsbexchange.com/?reg=N270 N1SC DB_CAT: Governments DB_OP: South Carolina Aeronautics Commission + https://globe.adsbexchange.com/?reg=N270 N2SC DB_CAT: Governments DB_OP: South Carolina Aeronautics Commission + https://globe.adsbexchange.com/?reg=N270 N787RR DB_CAT: Distinctive DB_OP: Rolls Royce + https://globe.adsbexchange.com/?reg=N270 N794AJ DB_CAT: Distinctive DB_OP: Zero Gravity Corporation + https://globe.adsbexchange.com/?reg=N270 N782SP DB_CAT: Jesus he Knows me DB_OP: Samaritans Purse + https://globe.adsbexchange.com/?reg=N270 N718BA DB_CAT: Distinctive DB_OP: Boeing + https://globe.adsbexchange.com/?reg=N270 N747BC DB_CAT: Distinctive DB_OP: Boeing + https://globe.adsbexchange.com/?reg=N270 N780BA DB_CAT: Distinctive DB_OP: Boeing + https://globe.adsbexchange.com/?reg=N270 N249BA DB_CAT: Distinctive DB_OP: Boeing + https://globe.adsbexchange.com/?reg=N270 N118TG DB_CAT: Dogs with Jobs DB_OP: International Air Response + https://globe.adsbexchange.com/?reg=N270 N120TG DB_CAT: Distinctive DB_OP: Intl Air Response + https://globe.adsbexchange.com/?reg=N270 N890WA DB_CAT: Flying Doctors DB_OP: Life Flight Network + https://globe.adsbexchange.com/?reg=N270 N661LF DB_CAT: Flying Doctors DB_OP: Life Flight Network + https://globe.adsbexchange.com/?reg=N270 N662LF DB_CAT: Flying Doctors DB_OP: Life Flight + https://globe.adsbexchange.com/?reg=N270 N401LC DB_CAT: Distinctive DB_OP: Lynden Air Cargo + https://globe.adsbexchange.com/?reg=N270 N402LC DB_CAT: Distinctive DB_OP: Lynden Air Cargo + https://globe.adsbexchange.com/?reg=N270 N403LC DB_CAT: Distinctive DB_OP: Lynden Air Cargo + https://globe.adsbexchange.com/?reg=N270 N410LC DB_CAT: Distinctive DB_OP: Lynden Air Cargo + https://globe.adsbexchange.com/?reg=N270 N165PA DB_CAT: Hired Gun DB_OP: Phoenix Air + https://globe.adsbexchange.com/?reg=N270 N164PA DB_CAT: Hired Gun DB_OP: Phoenix Air + https://globe.adsbexchange.com/?reg=N270 N102VS DB_CAT: Hired Gun DB_OP: Calspan Corporation + https://globe.adsbexchange.com/?reg=N270 N304VS DB_CAT: Hired Gun DB_OP: Calspan Corporation + https://globe.adsbexchange.com/?reg=N270 N600LL DB_CAT: Flying Doctors DB_OP: Milton S Hershey Medical Center + https://globe.adsbexchange.com/?reg=N270 N611LL DB_CAT: Flying Doctors DB_OP: Milton S Hershey Medical Center + https://globe.adsbexchange.com/?reg=N270 N896LL DB_CAT: Flying Doctors DB_OP: Milton S Hershey Medical Center + https://globe.adsbexchange.com/?reg=N270 N916LL DB_CAT: Flying Doctors DB_OP: Milton S Hershey Medical Center + https://globe.adsbexchange.com/?reg=N270 N524NA DB_CAT: Distinctive DB_OP: NASA + https://globe.adsbexchange.com/?reg=N270 N528NA DB_CAT: Distinctive DB_OP: NASA + https://globe.adsbexchange.com/?reg=N270 N130AR DB_CAT: Dogs with Jobs DB_OP: National Science Foundation + https://globe.adsbexchange.com/?reg=N270 N706GD DB_CAT: As Seen on TV DB_OP: Gulfstream Aerospace Corp + https://globe.adsbexchange.com/?reg=N270 N757HW DB_CAT: Distinctive DB_OP: Honeywell Intl + https://globe.adsbexchange.com/?reg=N270 N170EH DB_CAT: As Seen on TV DB_OP: Honeywell International + https://globe.adsbexchange.com/?reg=N270 N609PA DB_CAT: As Seen on TV DB_OP: AgustaWestland Philadelphia + https://globe.adsbexchange.com/?reg=N270 N609PH DB_CAT: As Seen on TV DB_OP: AgustaWestland Philadelphia + https://globe.adsbexchange.com/?reg=N270 N250UT DB_CAT: Distinctive DB_OP: Beta Air + https://globe.adsbexchange.com/?reg=N270 N757A DB_CAT: Distinctive DB_OP: Boeing + https://globe.adsbexchange.com/?reg=N270 N32GK DB_CAT: Joe Cool DB_OP: Vision GK + https://globe.adsbexchange.com/?reg=N270 N780LM DB_CAT: As Seen on TV DB_OP: Liberty Media Corp + https://globe.adsbexchange.com/?reg=N270 N737LE DB_CAT: Oligarch DB_OP: Leonard Blavatnik + https://globe.adsbexchange.com/?reg=N270 N777UK DB_CAT: Oligarch DB_OP: Leonard Blavatnik + https://globe.adsbexchange.com/?reg=N270 N600EB DB_CAT: Don't you know who I am? DB_OP: Len Blavatnik + https://globe.adsbexchange.com/?reg=N270 N761LE DB_CAT: Oligarch DB_OP: Leonard Blavatnik + https://globe.adsbexchange.com/?reg=N270 N1A DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N270 N2A DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N270 N3A DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N270 N10A DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N270 N435NA DB_CAT: Distinctive DB_OP: NASA + https://globe.adsbexchange.com/?reg=N270 N767A DB_CAT: Climate Crisis DB_OP: Saudi Aramco + https://globe.adsbexchange.com/?reg=N270 N70464 DB_CAT: Aerobatic Teams DB_OP: USAF + https://globe.adsbexchange.com/?reg=N270 N70465 DB_CAT: Aerobatic Teams DB_OP: USAF + https://globe.adsbexchange.com/?reg=N270 N10AU DB_CAT: Football DB_OP: Auburn University + https://globe.adsbexchange.com/?reg=N270 N934CT DB_CAT: Football DB_OP: Clemson University + https://globe.adsbexchange.com/?reg=N270 N1UA DB_CAT: Vanity Plate DB_OP: Crimson Tide Foundation + https://globe.adsbexchange.com/?reg=N270 N851FS DB_CAT: Football DB_OP: Seminole Boosters Inc. + https://globe.adsbexchange.com/?reg=N270 N865UT DB_CAT: Football DB_OP: University of Tennessee + https://globe.adsbexchange.com/?reg=N270 N794UT DB_CAT: Football DB_OP: University of Tennessee + https://globe.adsbexchange.com/?reg=N270 N100FG DB_CAT: As Seen on TV DB_OP: University of Florida Athletic Associati + https://globe.adsbexchange.com/?reg=N270 N101FG DB_CAT: Vanity Plate DB_OP: University of Florida Athletic Associati + https://globe.adsbexchange.com/?reg=N270 N836BA DB_CAT: Climate Crisis DB_OP: Boeing Executive Flight Operations + https://globe.adsbexchange.com/?reg=N270 N839BA DB_CAT: Climate Crisis DB_OP: Boeing Executive Flight Operations + https://globe.adsbexchange.com/?reg=N270 N547BA DB_CAT: As Seen on TV DB_OP: Boeing Executive Flight Operations + 21st Century Fox America N74A DB_CAT: Distinctive DB_OP: Missile Defense Agency + 21st Century Fox America N36PN DB_CAT: Distinctive DB_OP: The A-Team + 21st Century Fox America N82CR DB_CAT: Distinctive DB_OP: Northrop Grumman + AbbVie N189PA DB_CAT: Hired Gun DB_OP: Phoenix Air + AbbVie N178B DB_CAT: Distinctive DB_OP: Missile Defence Agency + Adobe N992NA DB_CAT: Distinctive DB_OP: NASA + Adobe N173PA DB_CAT: Hired Gun DB_OP: Phoenix Air + Adobe N184PA DB_CAT: Hired Gun DB_OP: Phoenix Air + Adobe N190PA DB_CAT: Hired Gun DB_OP: Phoenix Air + Adobe N197PA DB_CAT: Hired Gun DB_OP: Phoenix Air + Aflac N183PA DB_CAT: Hired Gun DB_OP: Phoenix Air + Aflac N802NA DB_CAT: Distinctive DB_OP: NASA + Aflac N818EC DB_CAT: Hired Gun DB_OP: Phoenix Air + Air Lease Corp. N808NA DB_CAT: Distinctive DB_OP: NASA + Air Lease Corp. N608BG DB_CAT: Distinctive DB_OP: NASA + Air Lease Corp. N44HB DB_CAT: Hired Gun DB_OP: Phoenix Air + Air Lease Corp. N30LX DB_CAT: As Seen on TV DB_OP: Lockheed Martin Corp + Allen & Company N520NA DB_CAT: Distinctive DB_OP: NASA + Amgen N1KE DB_CAT: Vanity Plate DB_OP: Phil Knight + CarMax N671LE DB_CAT: Oligarch DB_OP: Leonard Blavatnik + https://globe.adsbexchange.com/?reg=N131 N82CW DB_CAT: As Seen on TV DB_OP: Costco Wholesale + https://globe.adsbexchange.com/?reg=N131 N83CW DB_CAT: As Seen on TV DB_OP: Costco Wholesale + https://globe.adsbexchange.com/?reg=N131 N804CE DB_CAT: As Seen on TV DB_OP: Cummins + https://globe.adsbexchange.com/?reg=N131 N327RX DB_CAT: As Seen on TV DB_OP: CVS Pharmacy + https://globe.adsbexchange.com/?reg=N131 N812RX DB_CAT: As Seen on TV DB_OP: CVS Pharmacy + https://globe.adsbexchange.com/?reg=N131 N214TF DB_CAT: As Seen on TV DB_OP: CVS Pharmacy + https://globe.adsbexchange.com/?reg=N131 N100ES DB_CAT: As Seen on TV DB_OP: Earth Star Inc + https://globe.adsbexchange.com/?reg=N131 N200ES DB_CAT: As Seen on TV DB_OP: Earth Star Inc + https://globe.adsbexchange.com/?reg=N131 N500ES DB_CAT: As Seen on TV DB_OP: Earth Star Inc + https://globe.adsbexchange.com/?reg=N131 N441DT DB_CAT: As Seen on TV DB_OP: Family Dollar + https://globe.adsbexchange.com/?reg=N131 N652BA DB_CAT: As Seen on TV DB_OP: Bank of America + https://globe.adsbexchange.com/?reg=N131 N307EL DB_CAT: As Seen on TV DB_OP: Eli Lilly & Co + https://globe.adsbexchange.com/?reg=N131 N308EL DB_CAT: As Seen on TV DB_OP: Eli Lilly & Co + https://globe.adsbexchange.com/?reg=N131 N57EL DB_CAT: As Seen on TV DB_OP: Enterprise Rent-A-Car + https://globe.adsbexchange.com/?reg=N131 N100A DB_CAT: Climate Crisis DB_OP: Exxon Mobil Corp + https://globe.adsbexchange.com/?reg=N131 N200A DB_CAT: Climate Crisis DB_OP: Exxon Mobil Corp + https://globe.adsbexchange.com/?reg=N131 N300A DB_CAT: Climate Crisis DB_OP: Exxon Mobil Corp + https://globe.adsbexchange.com/?reg=N131 N285EM DB_CAT: Climate Crisis DB_OP: Exxon Mobil Corp + https://globe.adsbexchange.com/?reg=N131 N388FT DB_CAT: As Seen on TV DB_OP: Franklin Templeton Travel + https://globe.adsbexchange.com/?reg=N131 N587G DB_CAT: As Seen on TV DB_OP: General Dynamics Corp + https://globe.adsbexchange.com/?reg=N131 N586G DB_CAT: As Seen on TV DB_OP: General Dynamics Corp + https://globe.adsbexchange.com/?reg=N131 N20G DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N131 N24G DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N131 N22G DB_CAT: As Seen on TV DB_OP: Goodyear Tire & Rubber Company + https://globe.adsbexchange.com/?reg=N131 N232G DB_CAT: As Seen on TV DB_OP: Google Inc + https://globe.adsbexchange.com/?reg=N131 N10XG DB_CAT: As Seen on TV DB_OP: Google Inc + https://globe.adsbexchange.com/?reg=N131 N1910H DB_CAT: As Seen on TV DB_OP: Hallmark Cards Inc. + https://globe.adsbexchange.com/?reg=N131 N126HR DB_CAT: As Seen on TV DB_OP: Seminole Tribe of Florida + https://globe.adsbexchange.com/?reg=N131 N857ST DB_CAT: As Seen on TV DB_OP: Seminole Tribe of Florida + https://globe.adsbexchange.com/?reg=N131 N221DG DB_CAT: Don't you know who I am? DB_OP: David Geffen + https://globe.adsbexchange.com/?reg=N131 N100GN DB_CAT: As Seen on TV DB_OP: Fertitta Entertainment Holdings LLC + https://globe.adsbexchange.com/?reg=N131 N709DS DB_CAT: Don't you know who I am? DB_OP: Steve Ballmer + https://globe.adsbexchange.com/?reg=N131 N729KF DB_CAT: Don't you know who I am? DB_OP: Stan Kroenke + https://globe.adsbexchange.com/?reg=N131 N702F DB_CAT: Climate Crisis DB_OP: Station Casinos + https://globe.adsbexchange.com/?reg=N131 N162WC DB_CAT: Climate Crisis DB_OP: Washington Corp + https://globe.adsbexchange.com/?reg=N131 N988NC DB_CAT: As Seen on TV DB_OP: 21st Century Fox + https://globe.adsbexchange.com/?reg=N131 N900NC DB_CAT: As Seen on TV DB_OP: 21st Century Fox + https://globe.adsbexchange.com/?reg=N131 N898NC DB_CAT: As Seen on TV DB_OP: 21st Century Fox + https://globe.adsbexchange.com/?reg=N131 N435FG DB_CAT: Football DB_OP: Jacksonville Jaguars + https://globe.adsbexchange.com/?reg=N131 N360PZ DB_CAT: As Seen on TV DB_OP: City Electric Supply Company + https://globe.adsbexchange.com/?reg=N131 N378TP DB_CAT: Don't you know who I am? DB_OP: ETPC Aviation + https://globe.adsbexchange.com/?reg=N131 N773SD DB_CAT: Aerial Firefighter DB_OP: South Dakota Department of Transportatio + https://globe.adsbexchange.com/?reg=N131 N60TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N90TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N124TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N191TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N204TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N219TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N405TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N824TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N844TX DB_CAT: Police Forces DB_OP: Texas Department of Public Safety + https://globe.adsbexchange.com/?reg=N131 N1VA DB_CAT: Governments DB_OP: Virginia Department of Aviation + https://globe.adsbexchange.com/?reg=N131 N26VA DB_CAT: Police Forces DB_OP: Virginia State Police + https://globe.adsbexchange.com/?reg=N131 N305DK DB_CAT: Police Forces DB_OP: Washington State Patrol + https://globe.adsbexchange.com/?reg=N131 N357PN DB_CAT: Dogs with Jobs DB_OP: Washington State Department of Fish and + https://globe.adsbexchange.com/?reg=N131 N890SP DB_CAT: Police Forces DB_OP: West Virginia State Police + Duke Energy N218KF DB_CAT: Don't you know who I am? DB_OP: Stan Kroenke + Enterprise Car Rental N43PR DB_CAT: Climate Crisis DB_OP: Town and Country Food Markets + https://globe.adsbexchange.com/?reg=N604 N988H DB_CAT: As Seen on TV DB_OP: Honeywell International + https://globe.adsbexchange.com/?reg=N604 N456GA DB_CAT: As Seen on TV DB_OP: Hewlett-Packard + https://globe.adsbexchange.com/?reg=N604 N780TW DB_CAT: As Seen on TV DB_OP: IBM Corp + https://globe.adsbexchange.com/?reg=N604 N550JD DB_CAT: As Seen on TV DB_OP: Deere and Company + https://globe.adsbexchange.com/?reg=N604 N600JD DB_CAT: As Seen on TV DB_OP: John Deere & Company + https://globe.adsbexchange.com/?reg=N604 N800J DB_CAT: As Seen on TV DB_OP: Johnson & Johnson + https://globe.adsbexchange.com/?reg=N604 N400J DB_CAT: As Seen on TV DB_OP: Johnson & Johnson + https://globe.adsbexchange.com/?reg=N604 N500J DB_CAT: As Seen on TV DB_OP: Johnson & Johnson + https://globe.adsbexchange.com/?reg=N604 N600J DB_CAT: As Seen on TV DB_OP: Great Clips + https://globe.adsbexchange.com/?reg=N604 N661CH DB_CAT: As Seen on TV DB_OP: JP Morgan Chase Bank + https://globe.adsbexchange.com/?reg=N604 N662CH DB_CAT: As Seen on TV DB_OP: JP Morgan Chase Bank + https://globe.adsbexchange.com/?reg=N604 N601CH DB_CAT: As Seen on TV DB_OP: JP Morgan Chase Bank + https://globe.adsbexchange.com/?reg=N604 N804MS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N108MS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N336LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N383LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N623MS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N883LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N885LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N887LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N889LS DB_CAT: As Seen on TV DB_OP: Las Vegas Sands Corp + https://globe.adsbexchange.com/?reg=N604 N9PF DB_CAT: Climate Crisis DB_OP: Private + https://globe.adsbexchange.com/?reg=N604 N270LE DB_CAT: As Seen on TV DB_OP: Liberty Mutual Insurance + https://globe.adsbexchange.com/?reg=N604 N45JE DB_CAT: As Seen on TV DB_OP: Liberty Mutual Insurance + https://globe.adsbexchange.com/?reg=N604 N650VC DB_CAT: As Seen on TV DB_OP: Lockheed Martin Corp + https://globe.adsbexchange.com/?reg=N604 N344RS DB_CAT: As Seen on TV DB_OP: Lockheed Martin Corp + https://globe.adsbexchange.com/?reg=N604 N359GS DB_CAT: As Seen on TV DB_OP: Lockheed Martin Corp + https://globe.adsbexchange.com/?reg=N604 N33LC DB_CAT: As Seen on TV DB_OP: Lowe's Companies + https://globe.adsbexchange.com/?reg=N604 N44LC DB_CAT: As Seen on TV DB_OP: Lowe's Companies + https://globe.adsbexchange.com/?reg=N604 N782MM DB_CAT: As Seen on TV DB_OP: Mandalay Resorts + https://globe.adsbexchange.com/?reg=N604 N781MM DB_CAT: As Seen on TV DB_OP: Mandalay Resorts + https://globe.adsbexchange.com/?reg=N604 N785MM DB_CAT: As Seen on TV DB_OP: Mandalay Resorts + https://globe.adsbexchange.com/?reg=N604 N721MM DB_CAT: As Seen on TV DB_OP: Mandalay Resorts + https://globe.adsbexchange.com/?reg=N604 N1967M DB_CAT: As Seen on TV DB_OP: McDonalds Corp + https://globe.adsbexchange.com/?reg=N604 N780RW DB_CAT: As Seen on TV DB_OP: IBM Corp + https://globe.adsbexchange.com/?reg=N604 N790J DB_CAT: As Seen on TV DB_OP: IBM Corp + https://globe.adsbexchange.com/?reg=N604 N30QJ DB_CAT: As Seen on TV DB_OP: Johnson & Johnson + https://globe.adsbexchange.com/?reg=N604 N60QJ DB_CAT: As Seen on TV DB_OP: Johnson & Johnson + https://globe.adsbexchange.com/?reg=N604 N610G DB_CAT: Special Forces DB_OP: Comco + https://globe.adsbexchange.com/?reg=N604 N226G DB_CAT: Special Forces DB_OP: Comco + https://globe.adsbexchange.com/?reg=N604 N475LC DB_CAT: As Seen on TV DB_OP: L-3 Harris + https://globe.adsbexchange.com/?reg=N604 N280PH DB_CAT: As Seen on TV DB_OP: General Motors + https://globe.adsbexchange.com/?reg=N604 N69972 DB_CAT: Historic DB_OP: Docs Friends + https://globe.adsbexchange.com/?reg=N604 N529B DB_CAT: Historic DB_OP: Commemorative Air Force + https://globe.adsbexchange.com/?reg=N604 N551HA DB_CAT: Distinctive DB_OP: Missile Defense Agency + https://globe.adsbexchange.com/?reg=N604 N9191 DB_CAT: Oxcart DB_OP: Bear Defence + https://globe.adsbexchange.com/?reg=N604 N488CR DB_CAT: Oxcart DB_OP: United States Army + https://globe.adsbexchange.com/?reg=N604 N159L DB_CAT: Oxcart DB_OP: United States Army + https://globe.adsbexchange.com/?reg=N604 N986HA DB_CAT: Special Forces DB_OP: USAF + https://globe.adsbexchange.com/?reg=N604 N997MG DB_CAT: Special Forces DB_OP: USAF + https://globe.adsbexchange.com/?reg=N604 N860TA DB_CAT: Hired Gun DB_OP: Top Aces Inc + https://globe.adsbexchange.com/?reg=N604 N856TA DB_CAT: Hired Gun DB_OP: Top Aces Inc + https://globe.adsbexchange.com/?reg=N604 N865TA DB_CAT: Hired Gun DB_OP: Top Aces Inc + https://globe.adsbexchange.com/?reg=N604 N858TA DB_CAT: Hired Gun DB_OP: Top Aces Inc + https://globe.adsbexchange.com/?reg=N604 N23NG DB_CAT: As Seen on TV DB_OP: Northrop Grumman + https://globe.adsbexchange.com/?reg=N604 N804X DB_CAT: Distinctive DB_OP: Northrop Gruman + https://globe.adsbexchange.com/?reg=N604 N552HA DB_CAT: Distinctive DB_OP: Missile Defense Agency + https://globe.adsbexchange.com/?reg=N604 N553HA DB_CAT: Distinctive DB_OP: Missile Defense Agency + https://globe.adsbexchange.com/?reg=N604 N331CL DB_CAT: Dogs with Jobs DB_OP: Massachusetts Institute Of Technology + https://globe.adsbexchange.com/?reg=N604 N757AF DB_CAT: Dictator Alert DB_OP: DJT Operations + https://globe.adsbexchange.com/?reg=N604 N444WT DB_CAT: Don't you know who I am? DB_OP: Matt Damon + https://globe.adsbexchange.com/?reg=N604 N1TS DB_CAT: Climate Crisis DB_OP: First Virtual Air II + https://globe.adsbexchange.com/?reg=N604 N2TS DB_CAT: Joe Cool DB_OP: Upland Aviation + https://globe.adsbexchange.com/?reg=N604 N818TH DB_CAT: As Seen on TV DB_OP: Tommy Hilfiger USA + https://globe.adsbexchange.com/?reg=N604 N992DC DB_CAT: Football DB_OP: Dallas Cowboys + https://globe.adsbexchange.com/?reg=N121 N822MK DB_CAT: As Seen on TV DB_OP: Merck Group + https://globe.adsbexchange.com/?reg=N121 N946MM DB_CAT: As Seen on TV DB_OP: Heathrow Enterprises + https://globe.adsbexchange.com/?reg=N121 N608RP DB_CAT: As Seen on TV DB_OP: Purina Petcare + https://globe.adsbexchange.com/?reg=N121 N533GV DB_CAT: As Seen on TV DB_OP: Netflix + https://globe.adsbexchange.com/?reg=N121 N535GV DB_CAT: As Seen on TV DB_OP: Netflix + https://globe.adsbexchange.com/?reg=N121 N6453 DB_CAT: As Seen on TV DB_OP: Nike Corporation + https://globe.adsbexchange.com/?reg=N121 N157NS DB_CAT: As Seen on TV DB_OP: Norfolk Southern Railway + https://globe.adsbexchange.com/?reg=N121 N158NS DB_CAT: As Seen on TV DB_OP: Norfolk Southern Railway + https://globe.adsbexchange.com/?reg=N121 N159NS DB_CAT: As Seen on TV DB_OP: Norfolk Southern Railway + https://globe.adsbexchange.com/?reg=N121 N4050 DB_CAT: As Seen on TV DB_OP: PayPal + https://globe.adsbexchange.com/?reg=N121 N910J DB_CAT: As Seen on TV DB_OP: PENN Entertainment + https://globe.adsbexchange.com/?reg=N121 N500PC DB_CAT: As Seen on TV DB_OP: Pepsico + https://globe.adsbexchange.com/?reg=N121 N502PC DB_CAT: As Seen on TV DB_OP: Pepsico + https://globe.adsbexchange.com/?reg=N121 N508PC DB_CAT: As Seen on TV DB_OP: Pepsico + https://globe.adsbexchange.com/?reg=N121 N3CP DB_CAT: As Seen on TV DB_OP: Pfizer + https://globe.adsbexchange.com/?reg=N121 N4CP DB_CAT: As Seen on TV DB_OP: Pfizer + https://globe.adsbexchange.com/?reg=N121 N5CP DB_CAT: As Seen on TV DB_OP: Pfizer + https://globe.adsbexchange.com/?reg=N121 N6CP DB_CAT: As Seen on TV DB_OP: Pfizer + https://globe.adsbexchange.com/?reg=N121 N1PG DB_CAT: As Seen on TV DB_OP: Pfizer + https://globe.adsbexchange.com/?reg=N121 N2PG DB_CAT: As Seen on TV DB_OP: Procter & Gamble + https://globe.adsbexchange.com/?reg=N121 N6PG DB_CAT: As Seen on TV DB_OP: Procter & Gamble + https://globe.adsbexchange.com/?reg=N121 N7PG DB_CAT: As Seen on TV DB_OP: Procter & Gamble + https://globe.adsbexchange.com/?reg=N121 N82A DB_CAT: As Seen on TV DB_OP: Prudential Insurance Co of America + https://globe.adsbexchange.com/?reg=N121 N30GJ DB_CAT: As Seen on TV DB_OP: Publix Supermarkets + https://globe.adsbexchange.com/?reg=N121 N929GW DB_CAT: As Seen on TV DB_OP: Publix Supermarkets + https://globe.adsbexchange.com/?reg=N121 N89PX DB_CAT: As Seen on TV DB_OP: Publix Supermarkets + https://globe.adsbexchange.com/?reg=N121 N50NP DB_CAT: As Seen on TV DB_OP: Nestle Purina Petcare + https://globe.adsbexchange.com/?reg=N121 N886WT DB_CAT: As Seen on TV DB_OP: Qualcomm + https://globe.adsbexchange.com/?reg=N121 N887WT DB_CAT: As Seen on TV DB_OP: Qualcomm + https://globe.adsbexchange.com/?reg=N121 N661GT DB_CAT: As Seen on TV DB_OP: Rhys Vineyards + https://globe.adsbexchange.com/?reg=N121 N167TV DB_CAT: Don't you know who I am? DB_OP: Jeffrey Vinik + https://globe.adsbexchange.com/?reg=N121 N85D DB_CAT: As Seen on TV DB_OP: Dole Foods + https://globe.adsbexchange.com/?reg=N121 N650MN DB_CAT: Don't you know who I am? DB_OP: Rory McIlroy + https://globe.adsbexchange.com/?reg=N121 N888TY DB_CAT: Climate Crisis DB_OP: BB Five Inc + Netflix N1 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N16 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N13 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N14 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N17 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N11 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N12 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N47 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N66 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N67 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N68 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N69 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N70 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N71 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N72 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N73 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N75 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N76 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N77 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N78 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N79 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N80 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N81 DB_CAT: Vanity Plate DB_OP: Federal Aviation Administration + Netflix N83 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N84 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N85 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N86 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N87 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N88 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N89 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + Netflix N90 DB_CAT: Dogs with Jobs DB_OP: Federal Aviation Administration + https://globe.adsbexchange.com/?reg=N288 N288DX DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N648DX DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N899DX DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N120QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N149QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N338QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N399SA DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N567QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N589QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N687QD DB_CAT: As Seen on TV DB_OP: Quest Diagnostics + https://globe.adsbexchange.com/?reg=N288 N48RT DB_CAT: As Seen on TV DB_OP: Raytheon Systems + https://globe.adsbexchange.com/?reg=N288 N510SR DB_CAT: Football DB_OP: Miami Dolphins + https://globe.adsbexchange.com/?reg=N288 N979JW DB_CAT: As Seen on TV DB_OP: S C Johnson & Son + https://globe.adsbexchange.com/?reg=N288 N989JW DB_CAT: As Seen on TV DB_OP: S C Johnson & Son + https://globe.adsbexchange.com/?reg=N288 N2E DB_CAT: As Seen on TV DB_OP: Snap Inc + https://globe.adsbexchange.com/?reg=N288 N272BG DB_CAT: Don't you know who I am? DB_OP: Falcon Landing LLC + https://globe.adsbexchange.com/?reg=N288 N502SX DB_CAT: Don't you know who I am? DB_OP: Falcon Landing LLC + https://globe.adsbexchange.com/?reg=N288 N154TS DB_CAT: Don't you know who I am? DB_OP: Falcon Aviation Holdings + https://globe.adsbexchange.com/?reg=N288 N19HS DB_CAT: As Seen on TV DB_OP: Starbucks + https://globe.adsbexchange.com/?reg=N288 N721L DB_CAT: As Seen on TV DB_OP: Starbucks + https://globe.adsbexchange.com/?reg=N288 N484EM DB_CAT: As Seen on TV DB_OP: Target Corporation + https://globe.adsbexchange.com/?reg=N288 N45GX DB_CAT: As Seen on TV DB_OP: Texas Instruments + https://globe.adsbexchange.com/?reg=N288 N84HD DB_CAT: As Seen on TV DB_OP: Home Depot + https://globe.adsbexchange.com/?reg=N288 N96UA DB_CAT: As Seen on TV DB_OP: Under Armour Corporation + https://globe.adsbexchange.com/?reg=N288 N844UP DB_CAT: Vanity Plate DB_OP: Union Pacific Railroad + https://globe.adsbexchange.com/?reg=N288 N901X DB_CAT: As Seen on TV DB_OP: United States Steel Corp + https://globe.adsbexchange.com/?reg=N288 N838MF DB_CAT: Don't you know who I am? DB_OP: Ronald Perelman + https://globe.adsbexchange.com/?reg=N288 N411NB DB_CAT: Don't you know who I am? DB_OP: Vivek Ramaswamy + United States Steel Corp N658HC DB_CAT: PIA DB_OP: Group Holdings Aviation + https://globe.adsbexchange.com/?reg=N434 N954GA DB_CAT: As Seen on TV DB_OP: Gulfstream Aerospace Corp + https://globe.adsbexchange.com/?reg=N434 N57UH DB_CAT: As Seen on TV DB_OP: United Healthcare Services + https://globe.adsbexchange.com/?reg=N434 N623CT DB_CAT: As Seen on TV DB_OP: United Healthcare Services + https://globe.adsbexchange.com/?reg=N434 N917VZ DB_CAT: As Seen on TV DB_OP: Verizon Corporate Services + https://globe.adsbexchange.com/?reg=N434 N74VZ DB_CAT: As Seen on TV DB_OP: Verizon Corporate Services + https://globe.adsbexchange.com/?reg=N434 N76VZ DB_CAT: As Seen on TV DB_OP: Verizon Corporate Services + https://globe.adsbexchange.com/?reg=N434 N476V DB_CAT: As Seen on TV DB_OP: Visa + https://globe.adsbexchange.com/?reg=N434 N358V DB_CAT: As Seen on TV DB_OP: Visa + https://globe.adsbexchange.com/?reg=N434 N15DP DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N16CP DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N183CM DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N209MD DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N745KD DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N313BH DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N403LS DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N45GH DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N45HK DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N45VA DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N802AK DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N986BL DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N990WA DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N17ZP DB_CAT: As Seen on TV DB_OP: Walmart + https://globe.adsbexchange.com/?reg=N434 N1911W DB_CAT: As Seen on TV DB_OP: Whirlpool Corp + https://globe.adsbexchange.com/?reg=N434 N88WR DB_CAT: As Seen on TV DB_OP: Wynn Resorts + https://globe.adsbexchange.com/?reg=N434 N188WR DB_CAT: As Seen on TV DB_OP: Wynn Resorts + https://globe.adsbexchange.com/?reg=N434 N8000E DB_CAT: PIA DB_OP: Emerson Electric + https://globe.adsbexchange.com/?reg=N434 N8200E DB_CAT: PIA DB_OP: Emerson Electric + https://globe.adsbexchange.com/?reg=N434 N645FD DB_CAT: As Seen on TV DB_OP: Family Dollar + https://globe.adsbexchange.com/?reg=N434 N445FD DB_CAT: As Seen on TV DB_OP: Family Dollar + https://globe.adsbexchange.com/?reg=N434 N83M DB_CAT: As Seen on TV DB_OP: 3M Company + https://globe.adsbexchange.com/?reg=N434 N93M DB_CAT: As Seen on TV DB_OP: 3M Company + https://globe.adsbexchange.com/?reg=N434 N57SN DB_CAT: As Seen on TV DB_OP: Sony Aviation + https://globe.adsbexchange.com/?reg=N434 N60SN DB_CAT: As Seen on TV DB_OP: Sony Aviation + https://globe.adsbexchange.com/?reg=N434 N58CX DB_CAT: As Seen on TV DB_OP: CSX Transportation + https://globe.adsbexchange.com/?reg=N434 N807DC DB_CAT: As Seen on TV DB_OP: Danaher Corp + https://globe.adsbexchange.com/?reg=N434 N272BC DB_CAT: As Seen on TV DB_OP: Bissell Inc + https://globe.adsbexchange.com/?reg=N434 N543GL DB_CAT: As Seen on TV DB_OP: Skechers USA + https://globe.adsbexchange.com/?reg=N434 N540LF DB_CAT: As Seen on TV DB_OP: Gulfstream Aerospace Corp + https://globe.adsbexchange.com/?reg=N434 N613LF DB_CAT: Don't you know who I am? DB_OP: Frank Lowry + https://globe.adsbexchange.com/?reg=N836 N1F DB_CAT: Vanity Plate DB_OP: Friedkin Intl + Boeing 747 Global SuperTanker N744ST DB_CAT: Dogs with Jobs DB_OP: National Airlines + Boeing 747 Global SuperTanker N936CA DB_CAT: Hired Gun DB_OP: National Airlines + Gulfstream G600 (3 zone) N600GS DB_CAT: As Seen on TV DB_OP: Gulfstream Aerospace Corp + Global 7500 N457AD DB_CAT: As Seen on TV DB_OP: Dangote Group + +--- MISSING (NEED TO ADD) --- + https://globe.adsbexchange.com/?reg=N270 N2702 TYPE: + https://globe.adsbexchange.com/?reg=N270 N551AV TYPE: + https://globe.adsbexchange.com/?reg=N270 N556AV TYPE: + https://globe.adsbexchange.com/?reg=N270 N285AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N1AL TYPE: + https://globe.adsbexchange.com/?reg=N270 N8AL TYPE: + https://globe.adsbexchange.com/?reg=N270 N550AA TYPE: + https://globe.adsbexchange.com/?reg=N270 N550GW TYPE: + https://globe.adsbexchange.com/?reg=N270 N652GB TYPE: + https://globe.adsbexchange.com/?reg=N270 N81GK TYPE: + https://globe.adsbexchange.com/?reg=N270 N689BG TYPE: + https://globe.adsbexchange.com/?reg=N270 N650XF TYPE: + https://globe.adsbexchange.com/?reg=N270 N775E TYPE: + https://globe.adsbexchange.com/?reg=N270 N900SB TYPE: + https://globe.adsbexchange.com/?reg=N270 N372BP TYPE: + https://globe.adsbexchange.com/?reg=N270 N378TM TYPE: + https://globe.adsbexchange.com/?reg=N270 N235BH TYPE: + https://globe.adsbexchange.com/?reg=N270 N700YB TYPE: + https://globe.adsbexchange.com/?reg=N270 N737JB TYPE: + https://globe.adsbexchange.com/?reg=N270 N550BG TYPE: + https://globe.adsbexchange.com/?reg=N270 N3788B TYPE: + https://globe.adsbexchange.com/?reg=N270 N1777M TYPE: + https://globe.adsbexchange.com/?reg=N270 N10199 TYPE: + https://globe.adsbexchange.com/?reg=N270 N550TB TYPE: + https://globe.adsbexchange.com/?reg=N270 N331BN TYPE: + https://globe.adsbexchange.com/?reg=N270 N459BN TYPE: + https://globe.adsbexchange.com/?reg=N270 N721CF TYPE: + https://globe.adsbexchange.com/?reg=N270 N75KX TYPE: + https://globe.adsbexchange.com/?reg=N270 N1902C TYPE: + https://globe.adsbexchange.com/?reg=N270 N50VC TYPE: + https://globe.adsbexchange.com/?reg=N270 N650C TYPE: + https://globe.adsbexchange.com/?reg=N270 N793CG TYPE: + https://globe.adsbexchange.com/?reg=N270 N793MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N472K TYPE: + https://globe.adsbexchange.com/?reg=N270 N60TE TYPE: + https://globe.adsbexchange.com/?reg=N270 N80TE TYPE: + https://globe.adsbexchange.com/?reg=N270 N1KA TYPE: + https://globe.adsbexchange.com/?reg=N270 N901FH TYPE: + https://globe.adsbexchange.com/?reg=N270 N902FH TYPE: + https://globe.adsbexchange.com/?reg=N270 N10274 TYPE: + https://globe.adsbexchange.com/?reg=N270 N820CA TYPE: + https://globe.adsbexchange.com/?reg=N270 N863CA TYPE: + https://globe.adsbexchange.com/?reg=N270 N824CA TYPE: + https://globe.adsbexchange.com/?reg=N270 N790CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N405CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N621AR TYPE: + https://globe.adsbexchange.com/?reg=N270 N792CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N794CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N796CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N795CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N665P TYPE: + https://globe.adsbexchange.com/?reg=N270 N668P TYPE: + https://globe.adsbexchange.com/?reg=N270 N660P TYPE: + https://globe.adsbexchange.com/?reg=N270 N50KC TYPE: + https://globe.adsbexchange.com/?reg=N270 N590BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N297BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N650AL TYPE: + https://globe.adsbexchange.com/?reg=N270 N616RK TYPE: + https://globe.adsbexchange.com/?reg=N270 N996GA TYPE: + https://globe.adsbexchange.com/?reg=N270 N977GA TYPE: + https://globe.adsbexchange.com/?reg=N270 N313CG TYPE: + https://globe.adsbexchange.com/?reg=N270 N1789M TYPE: + https://globe.adsbexchange.com/?reg=N270 N639CS TYPE: + https://globe.adsbexchange.com/?reg=N270 N738A TYPE: + https://globe.adsbexchange.com/?reg=N270 N878VF TYPE: + https://globe.adsbexchange.com/?reg=N270 N305DQ TYPE: + https://globe.adsbexchange.com/?reg=N270 N425HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N608WM TYPE: + https://globe.adsbexchange.com/?reg=N270 N897WM TYPE: + https://globe.adsbexchange.com/?reg=N270 N459WM TYPE: + https://globe.adsbexchange.com/?reg=N270 N417C TYPE: + https://globe.adsbexchange.com/?reg=N270 N718MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N711SW TYPE: + https://globe.adsbexchange.com/?reg=N270 N595TG TYPE: + https://globe.adsbexchange.com/?reg=N270 N117TF TYPE: + https://globe.adsbexchange.com/?reg=N270 N880GC TYPE: + https://globe.adsbexchange.com/?reg=N270 N247GC TYPE: + https://globe.adsbexchange.com/?reg=N270 N80EM TYPE: + https://globe.adsbexchange.com/?reg=N270 N82EM TYPE: + https://globe.adsbexchange.com/?reg=N270 N136EM TYPE: + https://globe.adsbexchange.com/?reg=N270 N421SZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N928SZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N421AL TYPE: + https://globe.adsbexchange.com/?reg=N270 N750KD TYPE: + https://globe.adsbexchange.com/?reg=N270 N831FR TYPE: + https://globe.adsbexchange.com/?reg=N270 N102WG TYPE: + https://globe.adsbexchange.com/?reg=N270 N773MJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N32MJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N222MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N688MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N1NE TYPE: + https://globe.adsbexchange.com/?reg=N270 N19HT TYPE: + https://globe.adsbexchange.com/?reg=N270 N1759C TYPE: + https://globe.adsbexchange.com/?reg=N270 N785QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N257DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N256DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N251DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N252DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N254DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N255DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N258DV TYPE: + https://globe.adsbexchange.com/?reg=N270 N555MZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N711LS TYPE: + https://globe.adsbexchange.com/?reg=N270 N524EA TYPE: + https://globe.adsbexchange.com/?reg=N270 N115MH TYPE: + https://globe.adsbexchange.com/?reg=N270 N10MV TYPE: + https://globe.adsbexchange.com/?reg=N270 N6MV TYPE: + https://globe.adsbexchange.com/?reg=N270 N331AB TYPE: + https://globe.adsbexchange.com/?reg=N270 N238MH TYPE: + https://globe.adsbexchange.com/?reg=N270 N811LS TYPE: + https://globe.adsbexchange.com/?reg=N270 N801DM TYPE: + https://globe.adsbexchange.com/?reg=N270 N106TD TYPE: + https://globe.adsbexchange.com/?reg=N270 N107TD TYPE: + https://globe.adsbexchange.com/?reg=N270 N38AD TYPE: + https://globe.adsbexchange.com/?reg=N270 N388JR TYPE: + https://globe.adsbexchange.com/?reg=N270 N477GJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N560MT TYPE: + https://globe.adsbexchange.com/?reg=N270 N247WE TYPE: + https://globe.adsbexchange.com/?reg=N270 N468KL TYPE: + https://globe.adsbexchange.com/?reg=N270 N612MJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N329SH TYPE: + https://globe.adsbexchange.com/?reg=N270 N229BK TYPE: + https://globe.adsbexchange.com/?reg=N270 N138DE TYPE: + https://globe.adsbexchange.com/?reg=N270 N1DE TYPE: + https://globe.adsbexchange.com/?reg=N270 N3DE TYPE: + https://globe.adsbexchange.com/?reg=N270 N500DE TYPE: + https://globe.adsbexchange.com/?reg=N270 N400DH TYPE: + https://globe.adsbexchange.com/?reg=N270 N1RH TYPE: + https://globe.adsbexchange.com/?reg=N270 N508RH TYPE: + https://globe.adsbexchange.com/?reg=N270 N141SH TYPE: + https://globe.adsbexchange.com/?reg=N270 N60GH TYPE: + https://globe.adsbexchange.com/?reg=N270 N3RC TYPE: + https://globe.adsbexchange.com/?reg=N270 N15VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N25VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N43VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N46VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N47VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N49VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N67VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N70VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N87VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N92VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N98AC TYPE: + https://globe.adsbexchange.com/?reg=N270 N8TA TYPE: + https://globe.adsbexchange.com/?reg=N270 N622GK TYPE: + https://globe.adsbexchange.com/?reg=N270 N901SG TYPE: + https://globe.adsbexchange.com/?reg=N270 N200BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N15QB TYPE: + https://globe.adsbexchange.com/?reg=N270 N669T TYPE: + https://globe.adsbexchange.com/?reg=N270 N500RP TYPE: + https://globe.adsbexchange.com/?reg=N270 N512GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N510GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N559LC TYPE: + https://globe.adsbexchange.com/?reg=N270 N682RW TYPE: + https://globe.adsbexchange.com/?reg=N270 N17NY TYPE: + https://globe.adsbexchange.com/?reg=N270 N78SD TYPE: + https://globe.adsbexchange.com/?reg=N270 N604JJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N703BG TYPE: + https://globe.adsbexchange.com/?reg=N270 N800JM TYPE: + https://globe.adsbexchange.com/?reg=N270 N757CJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N305DG TYPE: + https://globe.adsbexchange.com/?reg=N270 N810GT TYPE: + https://globe.adsbexchange.com/?reg=N270 N518GS TYPE: + https://globe.adsbexchange.com/?reg=N270 N714JB TYPE: + https://globe.adsbexchange.com/?reg=N270 N688JC TYPE: + https://globe.adsbexchange.com/?reg=N270 N845JS TYPE: + https://globe.adsbexchange.com/?reg=N270 N502JB TYPE: + https://globe.adsbexchange.com/?reg=N270 N707JT TYPE: + https://globe.adsbexchange.com/?reg=N270 N492JT TYPE: + https://globe.adsbexchange.com/?reg=N270 N327JT TYPE: + https://globe.adsbexchange.com/?reg=N270 N500CE TYPE: + https://globe.adsbexchange.com/?reg=N270 N768JJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N510CX TYPE: + https://globe.adsbexchange.com/?reg=N270 N1980K TYPE: + https://globe.adsbexchange.com/?reg=N270 N69FH TYPE: + https://globe.adsbexchange.com/?reg=N270 N989DM TYPE: + https://globe.adsbexchange.com/?reg=N270 N600CK TYPE: + https://globe.adsbexchange.com/?reg=N270 N365WW TYPE: + https://globe.adsbexchange.com/?reg=N270 N33055 TYPE: + https://globe.adsbexchange.com/?reg=N270 N220F TYPE: + https://globe.adsbexchange.com/?reg=N270 N1013 TYPE: + https://globe.adsbexchange.com/?reg=N270 N877H TYPE: + https://globe.adsbexchange.com/?reg=N270 N405TK TYPE: + https://globe.adsbexchange.com/?reg=N270 N305PB TYPE: + https://globe.adsbexchange.com/?reg=N270 N700KS TYPE: + https://globe.adsbexchange.com/?reg=N270 N225LH TYPE: + https://globe.adsbexchange.com/?reg=N270 N1073S TYPE: + https://globe.adsbexchange.com/?reg=N270 N906V TYPE: + https://globe.adsbexchange.com/?reg=N270 N52437 TYPE: + https://globe.adsbexchange.com/?reg=N270 N1263S TYPE: + https://globe.adsbexchange.com/?reg=N270 N407SA TYPE: + https://globe.adsbexchange.com/?reg=N270 N157SA TYPE: + https://globe.adsbexchange.com/?reg=N270 N160SA TYPE: + https://globe.adsbexchange.com/?reg=N270 N477GF TYPE: + https://globe.adsbexchange.com/?reg=N270 N5329S TYPE: + https://globe.adsbexchange.com/?reg=N270 N1867 TYPE: + https://globe.adsbexchange.com/?reg=N270 N574ST TYPE: + https://globe.adsbexchange.com/?reg=N270 N8370Q TYPE: + https://globe.adsbexchange.com/?reg=N270 N246CC TYPE: + https://globe.adsbexchange.com/?reg=N270 N145PL TYPE: + https://globe.adsbexchange.com/?reg=N270 N1323Y TYPE: + https://globe.adsbexchange.com/?reg=N270 N70715 TYPE: + https://globe.adsbexchange.com/?reg=N270 N303GV TYPE: + https://globe.adsbexchange.com/?reg=N270 N20786 TYPE: + https://globe.adsbexchange.com/?reg=N270 N4730E TYPE: + https://globe.adsbexchange.com/?reg=N270 N840AK TYPE: + https://globe.adsbexchange.com/?reg=N270 N905AK TYPE: + https://globe.adsbexchange.com/?reg=N270 N42033 TYPE: + https://globe.adsbexchange.com/?reg=N270 N125FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N8460C TYPE: + https://globe.adsbexchange.com/?reg=N270 N82735 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7063J TYPE: + https://globe.adsbexchange.com/?reg=N270 N7023 TYPE: + https://globe.adsbexchange.com/?reg=N270 N607TC TYPE: + https://globe.adsbexchange.com/?reg=N270 N911NT TYPE: + https://globe.adsbexchange.com/?reg=N270 N6705H TYPE: + https://globe.adsbexchange.com/?reg=N270 N911AA TYPE: + https://globe.adsbexchange.com/?reg=N270 N909AK TYPE: + https://globe.adsbexchange.com/?reg=N270 N90918 TYPE: + https://globe.adsbexchange.com/?reg=N270 N88AK TYPE: + https://globe.adsbexchange.com/?reg=N270 N8717Q TYPE: + https://globe.adsbexchange.com/?reg=N270 N82732 TYPE: + https://globe.adsbexchange.com/?reg=N270 N82736 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7761D TYPE: + https://globe.adsbexchange.com/?reg=N270 N7326S TYPE: + https://globe.adsbexchange.com/?reg=N270 N7695S TYPE: + https://globe.adsbexchange.com/?reg=N270 N7196H TYPE: + https://globe.adsbexchange.com/?reg=N270 N7183C TYPE: + https://globe.adsbexchange.com/?reg=N270 N714NK TYPE: + https://globe.adsbexchange.com/?reg=N270 N7085 TYPE: + https://globe.adsbexchange.com/?reg=N270 N70713 TYPE: + https://globe.adsbexchange.com/?reg=N270 N70714 TYPE: + https://globe.adsbexchange.com/?reg=N270 N106WT TYPE: + https://globe.adsbexchange.com/?reg=N270 N1155W TYPE: + https://globe.adsbexchange.com/?reg=N270 N1386A TYPE: + https://globe.adsbexchange.com/?reg=N270 N2400S TYPE: + https://globe.adsbexchange.com/?reg=N270 N270WC TYPE: + https://globe.adsbexchange.com/?reg=N270 N3330D TYPE: + https://globe.adsbexchange.com/?reg=N270 N34FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N4151T TYPE: + https://globe.adsbexchange.com/?reg=N270 N4387Z TYPE: + https://globe.adsbexchange.com/?reg=N270 N54741 TYPE: + https://globe.adsbexchange.com/?reg=N270 N6987B TYPE: + https://globe.adsbexchange.com/?reg=N270 N7040 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7041 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7046 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7051 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7052 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7054 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7055 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7056 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7058 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7059 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7067 TYPE: + https://globe.adsbexchange.com/?reg=N270 N922AZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N207KQ TYPE: + https://globe.adsbexchange.com/?reg=N270 N1816R TYPE: + https://globe.adsbexchange.com/?reg=N270 N61298 TYPE: + https://globe.adsbexchange.com/?reg=N270 N3037Q TYPE: + https://globe.adsbexchange.com/?reg=N270 N761EZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N77HD TYPE: + https://globe.adsbexchange.com/?reg=N270 N390SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N8125N TYPE: + https://globe.adsbexchange.com/?reg=N270 N524SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N523SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N459DF TYPE: + https://globe.adsbexchange.com/?reg=N270 N461DF TYPE: + https://globe.adsbexchange.com/?reg=N270 N463DF TYPE: + https://globe.adsbexchange.com/?reg=N270 N20CA TYPE: + https://globe.adsbexchange.com/?reg=N270 N30CA TYPE: + https://globe.adsbexchange.com/?reg=N270 N21FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N22FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N23FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N24FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N25FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N26FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N28FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N36FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N37FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N137HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N139HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N153HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N156HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N511HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N441HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N443HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N202HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N974HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N975HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N976HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N978HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N979HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N981HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N982HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N983HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N984HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N985HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N988HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N617HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N485DF TYPE: + https://globe.adsbexchange.com/?reg=N270 N161SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N328SF TYPE: + https://globe.adsbexchange.com/?reg=N270 N4211C TYPE: + https://globe.adsbexchange.com/?reg=N270 N959AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N202SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N203SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N205SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N185CC TYPE: + https://globe.adsbexchange.com/?reg=N270 N93827 TYPE: + https://globe.adsbexchange.com/?reg=N270 N105SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N107SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N108SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N1903A TYPE: + https://globe.adsbexchange.com/?reg=N270 N1SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N2SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N6SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N51SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N419FW TYPE: + https://globe.adsbexchange.com/?reg=N270 N600FC TYPE: + https://globe.adsbexchange.com/?reg=N270 N106FW TYPE: + https://globe.adsbexchange.com/?reg=N270 N267HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N773HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N610HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N91HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N107FC TYPE: + https://globe.adsbexchange.com/?reg=N270 N155FC TYPE: + https://globe.adsbexchange.com/?reg=N270 N706HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N280HG TYPE: + https://globe.adsbexchange.com/?reg=N270 N290MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N297MH TYPE: + https://globe.adsbexchange.com/?reg=N270 N266MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N251MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N252MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N256MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N258MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N271MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N429LC TYPE: + https://globe.adsbexchange.com/?reg=N270 N908SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N921SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N922SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N924SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N925SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N926SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N927SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N930SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N940SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N24NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N25NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N26NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N121TD TYPE: + https://globe.adsbexchange.com/?reg=N270 N35945 TYPE: + https://globe.adsbexchange.com/?reg=N270 N4131Q TYPE: + https://globe.adsbexchange.com/?reg=N270 N551SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N661SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N771SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N881SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N6484A TYPE: + https://globe.adsbexchange.com/?reg=N270 N751LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N831LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N971LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N981LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N991LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N54SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N507SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N193SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N407SS TYPE: + https://globe.adsbexchange.com/?reg=N270 N171SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N231SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N996CS TYPE: + https://globe.adsbexchange.com/?reg=N270 N2231E TYPE: + https://globe.adsbexchange.com/?reg=N270 N227SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N1921F TYPE: + https://globe.adsbexchange.com/?reg=N270 N23540 TYPE: + https://globe.adsbexchange.com/?reg=N270 N600HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N650HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N670HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N870HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N900HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N940HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N950HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N980HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N10SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N45SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N46SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N421WJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N148KY TYPE: + https://globe.adsbexchange.com/?reg=N270 N723KY TYPE: + https://globe.adsbexchange.com/?reg=N270 N8237B TYPE: + https://globe.adsbexchange.com/?reg=N270 N282SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N283SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N5175E TYPE: + https://globe.adsbexchange.com/?reg=N270 N64034 TYPE: + https://globe.adsbexchange.com/?reg=N270 N9750L TYPE: + https://globe.adsbexchange.com/?reg=N270 N508SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N354SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N355SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N356SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N357SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N918SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N269SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N810SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N101AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N232AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N241AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N252AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N261AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N262AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N281AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N302AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N382AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N430M TYPE: + https://globe.adsbexchange.com/?reg=N270 N522AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N67183 TYPE: + https://globe.adsbexchange.com/?reg=N270 N811AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N812AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N904HB TYPE: + https://globe.adsbexchange.com/?reg=N270 N880WS TYPE: + https://globe.adsbexchange.com/?reg=N270 N5339N TYPE: + https://globe.adsbexchange.com/?reg=N270 N61368 TYPE: + https://globe.adsbexchange.com/?reg=N270 N185SL TYPE: + https://globe.adsbexchange.com/?reg=N270 N407TN TYPE: + https://globe.adsbexchange.com/?reg=N270 N9494N TYPE: + https://globe.adsbexchange.com/?reg=N270 N985MF TYPE: + https://globe.adsbexchange.com/?reg=N270 N125MD TYPE: + https://globe.adsbexchange.com/?reg=N270 N9111G TYPE: + https://globe.adsbexchange.com/?reg=N270 N902MD TYPE: + https://globe.adsbexchange.com/?reg=N270 N903MD TYPE: + https://globe.adsbexchange.com/?reg=N270 N6340F TYPE: + https://globe.adsbexchange.com/?reg=N270 N891TD TYPE: + https://globe.adsbexchange.com/?reg=N270 N1655M TYPE: + https://globe.adsbexchange.com/?reg=N270 N9461Z TYPE: + https://globe.adsbexchange.com/?reg=N270 N733XN TYPE: + https://globe.adsbexchange.com/?reg=N270 N6275S TYPE: + https://globe.adsbexchange.com/?reg=N270 N5101U TYPE: + https://globe.adsbexchange.com/?reg=N270 N2463B TYPE: + https://globe.adsbexchange.com/?reg=N270 N111SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N312ST TYPE: + https://globe.adsbexchange.com/?reg=N270 N4617E TYPE: + https://globe.adsbexchange.com/?reg=N270 N55MN TYPE: + https://globe.adsbexchange.com/?reg=N270 N14MN TYPE: + https://globe.adsbexchange.com/?reg=N270 N16MN TYPE: + https://globe.adsbexchange.com/?reg=N270 N105NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N125NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N145NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N155NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N205NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N528NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N529NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N605NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N705NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N805NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N905NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N70MN TYPE: + https://globe.adsbexchange.com/?reg=N270 N112SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N114SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N115SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N118SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N119SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N5897E TYPE: + https://globe.adsbexchange.com/?reg=N270 N28SM TYPE: + https://globe.adsbexchange.com/?reg=N270 N30SM TYPE: + https://globe.adsbexchange.com/?reg=N270 N350MS TYPE: + https://globe.adsbexchange.com/?reg=N270 N351MS TYPE: + https://globe.adsbexchange.com/?reg=N270 N956SM TYPE: + https://globe.adsbexchange.com/?reg=N270 N81MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N83MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N84MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N90MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N91MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N92MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N93MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N94MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N95MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N96MP TYPE: + https://globe.adsbexchange.com/?reg=N270 N128VT TYPE: + https://globe.adsbexchange.com/?reg=N270 N338MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N402MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N447MA TYPE: + https://globe.adsbexchange.com/?reg=N270 N42178 TYPE: + https://globe.adsbexchange.com/?reg=N270 N368M TYPE: + https://globe.adsbexchange.com/?reg=N270 N4622E TYPE: + https://globe.adsbexchange.com/?reg=N270 N151HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N1604Z TYPE: + https://globe.adsbexchange.com/?reg=N270 N1664R TYPE: + https://globe.adsbexchange.com/?reg=N270 N28KP TYPE: + https://globe.adsbexchange.com/?reg=N270 N384M TYPE: + https://globe.adsbexchange.com/?reg=N270 N4644Y TYPE: + https://globe.adsbexchange.com/?reg=N270 N6110A TYPE: + https://globe.adsbexchange.com/?reg=N270 N61CV TYPE: + https://globe.adsbexchange.com/?reg=N270 N6690 TYPE: + https://globe.adsbexchange.com/?reg=N270 N6962C TYPE: + https://globe.adsbexchange.com/?reg=N270 N8862Y TYPE: + https://globe.adsbexchange.com/?reg=N270 N84NE TYPE: + https://globe.adsbexchange.com/?reg=N270 N373NE TYPE: + https://globe.adsbexchange.com/?reg=N270 N575NE TYPE: + https://globe.adsbexchange.com/?reg=N270 N2383L TYPE: + https://globe.adsbexchange.com/?reg=N270 N777NV TYPE: + https://globe.adsbexchange.com/?reg=N270 N777NX TYPE: + https://globe.adsbexchange.com/?reg=N270 N711NV TYPE: + https://globe.adsbexchange.com/?reg=N270 N212DF TYPE: + https://globe.adsbexchange.com/?reg=N270 N407FG TYPE: + https://globe.adsbexchange.com/?reg=N270 N407JS TYPE: + https://globe.adsbexchange.com/?reg=N270 N366NH TYPE: + https://globe.adsbexchange.com/?reg=N270 N366SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N110NJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N4NJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N575NM TYPE: + https://globe.adsbexchange.com/?reg=N270 N91GF TYPE: + https://globe.adsbexchange.com/?reg=N270 N605SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N607SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N11SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N13SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N16SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N17SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N18SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N19SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N20SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N129SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N174SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N201NY TYPE: + https://globe.adsbexchange.com/?reg=N270 N224SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N749SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N605 TYPE: + https://globe.adsbexchange.com/?reg=N270 N651SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N103NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N350NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N3521K TYPE: + https://globe.adsbexchange.com/?reg=N270 N370NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N42058 TYPE: + https://globe.adsbexchange.com/?reg=N270 N407NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N421NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N6492G TYPE: + https://globe.adsbexchange.com/?reg=N270 N735AX TYPE: + https://globe.adsbexchange.com/?reg=N270 N735DN TYPE: + https://globe.adsbexchange.com/?reg=N270 N735ED TYPE: + https://globe.adsbexchange.com/?reg=N270 N735EK TYPE: + https://globe.adsbexchange.com/?reg=N270 N800NC TYPE: + https://globe.adsbexchange.com/?reg=N270 N9542W TYPE: + https://globe.adsbexchange.com/?reg=N270 N22593 TYPE: + https://globe.adsbexchange.com/?reg=N270 N193P TYPE: + https://globe.adsbexchange.com/?reg=N270 N200ND TYPE: + https://globe.adsbexchange.com/?reg=N270 N202ND TYPE: + https://globe.adsbexchange.com/?reg=N270 N6284S TYPE: + https://globe.adsbexchange.com/?reg=N270 N299SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N799GF TYPE: + https://globe.adsbexchange.com/?reg=N270 N228ND TYPE: + https://globe.adsbexchange.com/?reg=N270 N6HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N12HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N17HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N18HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N19HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N65HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N71HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N73HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N113HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N311HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N514HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N387LJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N480NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N490NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N550NR TYPE: + https://globe.adsbexchange.com/?reg=N270 N715HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N716HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N717HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N810H TYPE: + https://globe.adsbexchange.com/?reg=N270 N850H TYPE: + https://globe.adsbexchange.com/?reg=N270 N856H TYPE: + https://globe.adsbexchange.com/?reg=N270 N860H TYPE: + https://globe.adsbexchange.com/?reg=N270 N910HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N200HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N370HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N60HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N90HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N880DT TYPE: + https://globe.adsbexchange.com/?reg=N270 N2237S TYPE: + https://globe.adsbexchange.com/?reg=N270 N17386 TYPE: + https://globe.adsbexchange.com/?reg=N270 N2181N TYPE: + https://globe.adsbexchange.com/?reg=N270 N9000V TYPE: + https://globe.adsbexchange.com/?reg=N270 N81PA TYPE: + https://globe.adsbexchange.com/?reg=N270 N871ST TYPE: + https://globe.adsbexchange.com/?reg=N270 N876S TYPE: + https://globe.adsbexchange.com/?reg=N270 N502SL TYPE: + https://globe.adsbexchange.com/?reg=N270 N504SL TYPE: + https://globe.adsbexchange.com/?reg=N270 N19WL TYPE: + https://globe.adsbexchange.com/?reg=N270 N8WL TYPE: + https://globe.adsbexchange.com/?reg=N270 N500SC TYPE: + https://globe.adsbexchange.com/?reg=N270 N330AU TYPE: + https://globe.adsbexchange.com/?reg=N270 N783SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N117TG TYPE: + https://globe.adsbexchange.com/?reg=N270 N121TG TYPE: + https://globe.adsbexchange.com/?reg=N270 N126TS TYPE: + https://globe.adsbexchange.com/?reg=N270 N617BG TYPE: + https://globe.adsbexchange.com/?reg=N270 N214NX TYPE: + https://globe.adsbexchange.com/?reg=N270 N886LF TYPE: + https://globe.adsbexchange.com/?reg=N270 N247FR TYPE: + https://globe.adsbexchange.com/?reg=N270 N350MC TYPE: + https://globe.adsbexchange.com/?reg=N270 N921LL TYPE: + https://globe.adsbexchange.com/?reg=N270 N677F TYPE: + https://globe.adsbexchange.com/?reg=N270 N213EM TYPE: + https://globe.adsbexchange.com/?reg=N270 N700GA TYPE: + https://globe.adsbexchange.com/?reg=N270 N702GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N703GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N703GA TYPE: + https://globe.adsbexchange.com/?reg=N270 N704GA TYPE: + https://globe.adsbexchange.com/?reg=N270 N705GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N779XY TYPE: + https://globe.adsbexchange.com/?reg=N270 N779XW TYPE: + https://globe.adsbexchange.com/?reg=N270 N779XZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N779XX TYPE: + https://globe.adsbexchange.com/?reg=N270 N221NT TYPE: + https://globe.adsbexchange.com/?reg=N270 N222NT TYPE: + https://globe.adsbexchange.com/?reg=N270 N220BT TYPE: + https://globe.adsbexchange.com/?reg=N270 N800G TYPE: + https://globe.adsbexchange.com/?reg=N270 N802GD TYPE: + https://globe.adsbexchange.com/?reg=N270 N882EV TYPE: + https://globe.adsbexchange.com/?reg=N270 N701GL TYPE: + https://globe.adsbexchange.com/?reg=N270 N703DL TYPE: + https://globe.adsbexchange.com/?reg=N270 N9722L TYPE: + https://globe.adsbexchange.com/?reg=N270 N27751 TYPE: + https://globe.adsbexchange.com/?reg=N270 N27752 TYPE: + https://globe.adsbexchange.com/?reg=N270 N903PC TYPE: + https://globe.adsbexchange.com/?reg=N270 N542BJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N280BH TYPE: + https://globe.adsbexchange.com/?reg=N270 N971SK TYPE: + https://globe.adsbexchange.com/?reg=N270 N972SK TYPE: + https://globe.adsbexchange.com/?reg=N270 N100FV TYPE: + https://globe.adsbexchange.com/?reg=N270 N609TR TYPE: + https://globe.adsbexchange.com/?reg=N270 N281PR TYPE: + https://globe.adsbexchange.com/?reg=N270 N531TA TYPE: + https://globe.adsbexchange.com/?reg=N270 N532TX TYPE: + https://globe.adsbexchange.com/?reg=N270 N534TX TYPE: + https://globe.adsbexchange.com/?reg=N270 N7201S TYPE: + https://globe.adsbexchange.com/?reg=N270 N861BC TYPE: + https://globe.adsbexchange.com/?reg=N270 N7874 TYPE: + https://globe.adsbexchange.com/?reg=N270 N716X TYPE: + https://globe.adsbexchange.com/?reg=N270 N400G TYPE: + https://globe.adsbexchange.com/?reg=N270 N60304 TYPE: + https://globe.adsbexchange.com/?reg=N270 N2RF TYPE: + https://globe.adsbexchange.com/?reg=N270 N2MJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N390GM TYPE: + https://globe.adsbexchange.com/?reg=N270 N3175W TYPE: + https://globe.adsbexchange.com/?reg=N270 N5921C TYPE: + https://globe.adsbexchange.com/?reg=N270 N9477A TYPE: + https://globe.adsbexchange.com/?reg=N270 N367HP TYPE: + https://globe.adsbexchange.com/?reg=N270 N949BZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N2423U TYPE: + https://globe.adsbexchange.com/?reg=N270 N318JJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N131AE TYPE: + https://globe.adsbexchange.com/?reg=N270 N801WT TYPE: + https://globe.adsbexchange.com/?reg=N270 N379JM TYPE: + https://globe.adsbexchange.com/?reg=N270 N661MG TYPE: + https://globe.adsbexchange.com/?reg=N270 N8623W TYPE: + https://globe.adsbexchange.com/?reg=N270 N26DT TYPE: + https://globe.adsbexchange.com/?reg=N270 N6355J TYPE: + https://globe.adsbexchange.com/?reg=N270 N62JR TYPE: + https://globe.adsbexchange.com/?reg=N270 N616DP TYPE: + https://globe.adsbexchange.com/?reg=N270 N370RS TYPE: + https://globe.adsbexchange.com/?reg=N270 N52TL TYPE: + https://globe.adsbexchange.com/?reg=N270 N14WS TYPE: + https://globe.adsbexchange.com/?reg=N270 N317SR TYPE: + https://globe.adsbexchange.com/?reg=N270 N888FU TYPE: + https://globe.adsbexchange.com/?reg=N270 N921NG TYPE: + https://globe.adsbexchange.com/?reg=N270 N12768 TYPE: + https://globe.adsbexchange.com/?reg=N270 N88W TYPE: + https://globe.adsbexchange.com/?reg=N270 N964PP TYPE: + https://globe.adsbexchange.com/?reg=N270 N30AQ TYPE: + https://globe.adsbexchange.com/?reg=N270 N22LP TYPE: + https://globe.adsbexchange.com/?reg=N270 N814ST TYPE: + https://globe.adsbexchange.com/?reg=N270 N682TM TYPE: + https://globe.adsbexchange.com/?reg=N270 N888PN TYPE: + https://globe.adsbexchange.com/?reg=N270 N28AR TYPE: + https://globe.adsbexchange.com/?reg=N270 N300WZ TYPE: + https://globe.adsbexchange.com/?reg=N270 N317SP TYPE: + https://globe.adsbexchange.com/?reg=N270 N12VJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N282WB TYPE: + https://globe.adsbexchange.com/?reg=N270 N155AN TYPE: + https://globe.adsbexchange.com/?reg=N270 N545GH TYPE: + https://globe.adsbexchange.com/?reg=N270 N770LM TYPE: + https://globe.adsbexchange.com/?reg=N270 N4144C TYPE: + https://globe.adsbexchange.com/?reg=N270 N988FY TYPE: + https://globe.adsbexchange.com/?reg=N270 N983SV TYPE: + https://globe.adsbexchange.com/?reg=N270 N324FD TYPE: + https://globe.adsbexchange.com/?reg=N270 N96GU TYPE: + https://globe.adsbexchange.com/?reg=N270 N314RG TYPE: + https://globe.adsbexchange.com/?reg=N270 N7WW TYPE: + https://globe.adsbexchange.com/?reg=N270 N2AF TYPE: + https://globe.adsbexchange.com/?reg=N270 N945DC TYPE: + https://globe.adsbexchange.com/?reg=N270 N16WW TYPE: + https://globe.adsbexchange.com/?reg=N270 N80WW TYPE: + https://globe.adsbexchange.com/?reg=N270 N14RU TYPE: + https://globe.adsbexchange.com/?reg=N270 N939SH TYPE: + https://globe.adsbexchange.com/?reg=N270 N117 TYPE: + https://globe.adsbexchange.com/?reg=N270 N8CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N9CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N36RP TYPE: + https://globe.adsbexchange.com/?reg=N270 N605KG TYPE: + https://globe.adsbexchange.com/?reg=N270 N99DQ TYPE: + https://globe.adsbexchange.com/?reg=N270 N9FJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N638MF TYPE: + https://globe.adsbexchange.com/?reg=N270 N905CH TYPE: + https://globe.adsbexchange.com/?reg=N270 N702LF TYPE: + https://globe.adsbexchange.com/?reg=N270 N429HC TYPE: + https://globe.adsbexchange.com/?reg=N270 N833MK TYPE: + https://globe.adsbexchange.com/?reg=N270 N844MK TYPE: + https://globe.adsbexchange.com/?reg=N270 N855MK TYPE: + https://globe.adsbexchange.com/?reg=N270 N467CP TYPE: + https://globe.adsbexchange.com/?reg=N270 N700J TYPE: + https://globe.adsbexchange.com/?reg=N270 N1601H TYPE: + https://globe.adsbexchange.com/?reg=N270 N20AU TYPE: + https://globe.adsbexchange.com/?reg=N270 N1UM TYPE: + https://globe.adsbexchange.com/?reg=N270 N77CV TYPE: + https://globe.adsbexchange.com/?reg=N270 N517PD TYPE: + https://globe.adsbexchange.com/?reg=N270 N1PU TYPE: + https://globe.adsbexchange.com/?reg=N270 N901MJ TYPE: + https://globe.adsbexchange.com/?reg=N270 N12AM TYPE: + https://globe.adsbexchange.com/?reg=N270 N41UA TYPE: + https://globe.adsbexchange.com/?reg=N270 N89UA TYPE: + https://globe.adsbexchange.com/?reg=N270 N814SH TYPE: + https://globe.adsbexchange.com/?reg=N270 N45HF TYPE: + https://globe.adsbexchange.com/?reg=N270 N454GC TYPE: + https://globe.adsbexchange.com/?reg=N270 N151XL TYPE: + https://globe.adsbexchange.com/?reg=N270 N560VA TYPE: + https://globe.adsbexchange.com/?reg=N270 N68UW TYPE: + https://globe.adsbexchange.com/?reg=N270 N200UW TYPE: + https://globe.adsbexchange.com/?reg=N270 N576FA TYPE: + https://globe.adsbexchange.com/?reg=N270 N111GU TYPE: + https://globe.adsbexchange.com/?reg=N270 N41SU TYPE: + https://globe.adsbexchange.com/?reg=N270 N204MS TYPE: + https://globe.adsbexchange.com/?reg=N270 N406SF TYPE: + https://globe.adsbexchange.com/?reg=N270 N370U TYPE: + https://globe.adsbexchange.com/?reg=N270 N51VT TYPE: + https://globe.adsbexchange.com/?reg=N270 N71LU TYPE: + https://globe.adsbexchange.com/?reg=N270 N1863W TYPE: + https://globe.adsbexchange.com/?reg=N270 N7508 TYPE: + https://globe.adsbexchange.com/?reg=N270 N7509 TYPE: + https://globe.adsbexchange.com/?reg=N270 N160QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N141QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N100QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N162QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N142QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N143QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N166QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N104QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N163QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N109QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N111QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N145QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N146QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N147QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N148QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N150QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N167QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N112QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N113QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N165QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N151QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N114QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N115QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N116QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N152QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N117QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N154QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N155QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N156QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N157QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N158QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N175QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N176QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N177QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N178QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N184QS TYPE: + https://globe.adsbexchange.com/?reg=N270 N651FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N653FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N657FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N652FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N656FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N655FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N648FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N380ER TYPE: + https://globe.adsbexchange.com/?reg=N270 N666HD TYPE: + https://globe.adsbexchange.com/?reg=N270 N654FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N666FH TYPE: + https://globe.adsbexchange.com/?reg=N270 N650FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N136ZC TYPE: + https://globe.adsbexchange.com/?reg=N270 N96FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N90FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N91FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N92FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N93FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N97FX TYPE: + https://globe.adsbexchange.com/?reg=N270 N715VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N770TM TYPE: + https://globe.adsbexchange.com/?reg=N270 N710VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N707VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N690VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N680VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N685VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N688VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N70VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N95VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N85VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N80VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N650VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N600VM TYPE: + https://globe.adsbexchange.com/?reg=N270 N541BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N544BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N543BA TYPE: + https://globe.adsbexchange.com/?reg=N270 N520VA TYPE: + 21st Century Fox America N55RG TYPE: N2702 + 21st Century Fox America N24YS TYPE: N2702 + 21st Century Fox America N890TJ TYPE: N2702 + 21st Century Fox America N137GJ TYPE: N2702 + 21st Century Fox America N17KW TYPE: N2702 + 21st Century Fox America N188JS TYPE: N2702 + 21st Century Fox America N105TB TYPE: N2702 + 21st Century Fox America N747JX TYPE: N2702 + 21st Century Fox America N204RC TYPE: N2702 + 21st Century Fox America N30PR TYPE: N2702 + 21st Century Fox America N311MG TYPE: N2702 + 21st Century Fox America N33EN TYPE: N2702 + 21st Century Fox America N650KA TYPE: N2702 + 21st Century Fox America N148V TYPE: N2702 + 21st Century Fox America N2000 TYPE: N2702 + 21st Century Fox America N720Q TYPE: N2702 + 21st Century Fox America N12GP TYPE: N2702 + 21st Century Fox America N74HH TYPE: N2702 + 21st Century Fox America N277GS TYPE: N2702 + 21st Century Fox America N419MS TYPE: N2702 + 21st Century Fox America N179T TYPE: N2702 + 21st Century Fox America N779LC TYPE: N2702 + 21st Century Fox America N671LW TYPE: N2702 + 21st Century Fox America N888YZ TYPE: N2702 + 21st Century Fox America N396CF TYPE: N2702 + 21st Century Fox America N44YS TYPE: N2702 + 21st Century Fox America N1218C TYPE: N2702 + 21st Century Fox America N511PK TYPE: N2702 + 21st Century Fox America N10123 TYPE: N2702 + 21st Century Fox America N608GV TYPE: N2702 + AbbVie N887GV TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N897GV TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N945NA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N711VL TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N892TM TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N868DS TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N829NL TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N2JR TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N400M TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N944NA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N226RM TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N946NA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N947NA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N180AR TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N471GG TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N468HW TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N889JC TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N945PK TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N501JV TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N173EL TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N777RW TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N227LA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N57HE TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N213JA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N608MD TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N91NA TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N721CN TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N4UB TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N826GW TYPE: N550AV, N551AV, N554AV, N556AV + AbbVie N880WE TYPE: N550AV, N551AV, N554AV, N556AV + Adobe N459BL TYPE: N82123 + Adobe N860PM TYPE: N82123 + Adobe N264CL TYPE: N82123 + Adobe N189WS TYPE: N82123 + Adobe N720LH TYPE: N82123 + Adobe N500JW TYPE: N82123 + Adobe N840RG TYPE: N82123 + Adobe N72BP TYPE: N82123 + Adobe N81RR TYPE: N82123 + Adobe N457BE TYPE: N82123 + Adobe N985BB TYPE: N82123 + Adobe N522HS TYPE: N82123 + Adobe N868SM TYPE: N82123 + Adobe N4NR TYPE: N82123 + Adobe N234LR TYPE: N82123 + Adobe N480RW TYPE: N82123 + Adobe N818VB TYPE: N82123 + Adobe N304TS TYPE: N82123 + Adobe N111FU TYPE: N82123 + Adobe N921MG TYPE: N82123 + Adobe N982RK TYPE: N82123 + Adobe N99PD TYPE: N82123 + Adobe N300UJ TYPE: N82123 + Adobe N186PA TYPE: N82123 + Adobe N706JA TYPE: N82123 + Adobe N323G TYPE: N82123 + Adobe N324JW TYPE: N82123 + Adobe N59ME TYPE: N82123 + Adobe N420JC TYPE: N82123 + Adobe N3DP TYPE: N82123 + Adobe N456BE TYPE: N82123 + Adobe N337LR TYPE: N82123 + Adobe N338UA TYPE: N82123 + Adobe N774MB TYPE: N82123 + Adobe N557JK TYPE: N82123 + Adobe N555XS TYPE: N82123 + Adobe N221CM TYPE: N82123 + Adobe N344GW TYPE: N82123 + Adobe N918HD TYPE: N82123 + Adobe N39LF TYPE: N82123 + Adobe N857PR TYPE: N82123 + Adobe N911HJ TYPE: N82123 + Adobe N1454 TYPE: N82123 + Adobe N212BA TYPE: N82123 + Aflac N356BR TYPE: N285AF, N280AF + Aflac N358CY TYPE: N285AF, N280AF + Aflac N50BH TYPE: N285AF, N280AF + Aflac N874RA TYPE: N285AF, N280AF + Aflac N400AA TYPE: N285AF, N280AF + Aflac N855SA TYPE: N285AF, N280AF + Aflac N888SM TYPE: N285AF, N280AF + Aflac N15HE TYPE: N285AF, N280AF + Aflac N320MK TYPE: N285AF, N280AF + Aflac N353VA TYPE: N285AF, N280AF + Aflac N313MS TYPE: N285AF, N280AF + Aflac N270MC TYPE: N285AF, N280AF + Aflac N375LT TYPE: N285AF, N280AF + Aflac N670JF TYPE: N285AF, N280AF + Aflac N377LR TYPE: N285AF, N280AF + Aflac N30WR TYPE: N285AF, N280AF + Aflac N221WR TYPE: N285AF, N280AF + Aflac N461AR TYPE: N285AF, N280AF + Aflac N484GM TYPE: N285AF, N280AF + Aflac N388LR TYPE: N285AF, N280AF + Aflac N303MP TYPE: N285AF, N280AF + Aflac N734TJ TYPE: N285AF, N280AF + Aflac N888WE TYPE: N285AF, N280AF + Aflac N422TK TYPE: N285AF, N280AF + Aflac N175BG TYPE: N285AF, N280AF + Aflac N555GL TYPE: N285AF, N280AF + Aflac N560SH TYPE: N285AF, N280AF + Aflac N456AL TYPE: N285AF, N280AF + Aflac N813MK TYPE: N285AF, N280AF + Aflac N224KL TYPE: N285AF, N280AF + Aflac N461GT TYPE: N285AF, N280AF + Aflac N450BD TYPE: N285AF, N280AF + Aflac N165G TYPE: N285AF, N280AF + Air Lease Corp. N828AH TYPE: N1AL, N8AL + Air Lease Corp. N42FL TYPE: N1AL, N8AL + Air Lease Corp. N431JG TYPE: N1AL, N8AL + Air Lease Corp. N711UF TYPE: N1AL, N8AL + Air Lease Corp. N712AS TYPE: N1AL, N8AL + Air Lease Corp. N492A TYPE: N1AL, N8AL + Air Lease Corp. N17LK TYPE: N1AL, N8AL + Air Lease Corp. N469BT TYPE: N1AL, N8AL + Air Lease Corp. N45KR TYPE: N1AL, N8AL + Air Lease Corp. N18ZL TYPE: N1AL, N8AL + Air Lease Corp. N357KM TYPE: N1AL, N8AL + Air Lease Corp. N928BK TYPE: N1AL, N8AL + Air Lease Corp. N467AM TYPE: N1AL, N8AL + Air Lease Corp. N249JC TYPE: N1AL, N8AL + Air Lease Corp. N118JK TYPE: N1AL, N8AL + Air Lease Corp. N510FR TYPE: N1AL, N8AL + Air Lease Corp. N776MA TYPE: N1AL, N8AL + Air Lease Corp. N36DA TYPE: N1AL, N8AL + Air Lease Corp. N951XF TYPE: N1AL, N8AL + Air Lease Corp. N800TD TYPE: N1AL, N8AL + Air Lease Corp. N555DW TYPE: N1AL, N8AL + Air Lease Corp. N413WJ TYPE: N1AL, N8AL + Air Lease Corp. N194PA TYPE: N1AL, N8AL + Air Lease Corp. N34JE TYPE: N1AL, N8AL + Air Lease Corp. N383MJ TYPE: N1AL, N8AL + Air Lease Corp. N228MD TYPE: N1AL, N8AL + Allen & Company N975RG TYPE: N550AA, N550GW + Allen & Company N550JF TYPE: N550AA, N550GW + Allen & Company N477SJ TYPE: N550AA, N550GW + Allen & Company N111HC TYPE: N550AA, N550GW + Allen & Company N62MV TYPE: N550AA, N550GW + Allen & Company N80SR TYPE: N550AA, N550GW + Allen & Company N416WM TYPE: N550AA, N550GW + Allen & Company N500GF TYPE: N550AA, N550GW + Allen & Company N218EE TYPE: N550AA, N550GW + Allen & Company N388MM TYPE: N550AA, N550GW + Allen & Company N939KM TYPE: N550AA, N550GW + Allen & Company N7513H TYPE: N550AA, N550GW + Allen & Company N384BB TYPE: N550AA, N550GW + Allen & Company N300JZ TYPE: N550AA, N550GW + Abbott Labratories N1W TYPE: N100AL, N900AL, N550AL,N650AL + Abbott Labratories N124 TYPE: N100AL, N900AL, N550AL,N650AL + AT&T N19AH TYPE: N775E, N900SB + AT&T N49AH TYPE: N775E, N900SB + AT&T N145HM TYPE: N775E, N900SB + BIC Lighters and Pens N641SU TYPE: N550BG + CarMax N3KA TYPE: N75KX + CarMax N3BU TYPE: N75KX + Citigroup N6012C TYPE: N2019C, N805WM, N6012C, N8012C + Citigroup N8012C TYPE: N2019C, N805WM, N6012C, N8012C + https://globe.adsbexchange.com/?reg=N131 N131DS TYPE: + https://globe.adsbexchange.com/?reg=N131 N84CW TYPE: + https://globe.adsbexchange.com/?reg=N131 N86CW TYPE: + https://globe.adsbexchange.com/?reg=N131 N91CW TYPE: + https://globe.adsbexchange.com/?reg=N131 N93CW TYPE: + https://globe.adsbexchange.com/?reg=N131 N1040 TYPE: + https://globe.adsbexchange.com/?reg=N131 N1640 TYPE: + https://globe.adsbexchange.com/?reg=N131 N1040C TYPE: + https://globe.adsbexchange.com/?reg=N131 N68CB TYPE: + https://globe.adsbexchange.com/?reg=N131 N283CE TYPE: + https://globe.adsbexchange.com/?reg=N131 N282CE TYPE: + https://globe.adsbexchange.com/?reg=N131 N281CE TYPE: + https://globe.adsbexchange.com/?reg=N131 N6D TYPE: + https://globe.adsbexchange.com/?reg=N131 N235DX TYPE: + https://globe.adsbexchange.com/?reg=N131 N717DX TYPE: + https://globe.adsbexchange.com/?reg=N131 N607DX TYPE: + https://globe.adsbexchange.com/?reg=N131 N858MY TYPE: + https://globe.adsbexchange.com/?reg=N131 N914BD TYPE: + https://globe.adsbexchange.com/?reg=N131 N590MC TYPE: + https://globe.adsbexchange.com/?reg=N131 N260DL TYPE: + https://globe.adsbexchange.com/?reg=N131 N290DL TYPE: + https://globe.adsbexchange.com/?reg=N131 N900ES TYPE: + https://globe.adsbexchange.com/?reg=N131 N499JB TYPE: + https://globe.adsbexchange.com/?reg=N131 N855DG TYPE: + https://globe.adsbexchange.com/?reg=N131 N147CJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N34681 TYPE: + https://globe.adsbexchange.com/?reg=N131 N848JA TYPE: + https://globe.adsbexchange.com/?reg=N131 N575MW TYPE: + https://globe.adsbexchange.com/?reg=N131 N139DE TYPE: + https://globe.adsbexchange.com/?reg=N131 N407LT TYPE: + https://globe.adsbexchange.com/?reg=N131 N992DB TYPE: + https://globe.adsbexchange.com/?reg=N131 N56EL TYPE: + https://globe.adsbexchange.com/?reg=N131 N283EM TYPE: + https://globe.adsbexchange.com/?reg=N131 N1FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N2FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N6FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N21FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N24FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N26FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N28FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N35FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N37FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N39FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N43FE TYPE: + https://globe.adsbexchange.com/?reg=N131 N47SC TYPE: + https://globe.adsbexchange.com/?reg=N131 N881MJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N326K TYPE: + https://globe.adsbexchange.com/?reg=N131 N328K TYPE: + https://globe.adsbexchange.com/?reg=N131 N330K TYPE: + https://globe.adsbexchange.com/?reg=N131 N123FT TYPE: + https://globe.adsbexchange.com/?reg=N131 N221FT TYPE: + https://globe.adsbexchange.com/?reg=N131 N328MM TYPE: + https://globe.adsbexchange.com/?reg=N131 N812G TYPE: + https://globe.adsbexchange.com/?reg=N131 N776GM TYPE: + https://globe.adsbexchange.com/?reg=N131 N775GM TYPE: + https://globe.adsbexchange.com/?reg=N131 N650WS TYPE: + https://globe.adsbexchange.com/?reg=N131 N280WS TYPE: + https://globe.adsbexchange.com/?reg=N131 N998PB TYPE: + https://globe.adsbexchange.com/?reg=N131 N222GV TYPE: + https://globe.adsbexchange.com/?reg=N131 N904G TYPE: + https://globe.adsbexchange.com/?reg=N131 N68GW TYPE: + https://globe.adsbexchange.com/?reg=N131 N716GC TYPE: + https://globe.adsbexchange.com/?reg=N131 N2LA TYPE: + https://globe.adsbexchange.com/?reg=N131 N2N TYPE: + https://globe.adsbexchange.com/?reg=N131 N711RL TYPE: + https://globe.adsbexchange.com/?reg=N131 N173JM TYPE: + https://globe.adsbexchange.com/?reg=N131 N515PL TYPE: + https://globe.adsbexchange.com/?reg=N131 N915FG TYPE: + https://globe.adsbexchange.com/?reg=N131 N74VW TYPE: + https://globe.adsbexchange.com/?reg=N131 N17TE TYPE: + https://globe.adsbexchange.com/?reg=N131 N650FJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N625GN TYPE: + https://globe.adsbexchange.com/?reg=N131 N252TF TYPE: + https://globe.adsbexchange.com/?reg=N131 N919FG TYPE: + https://globe.adsbexchange.com/?reg=N131 N62LV TYPE: + https://globe.adsbexchange.com/?reg=N131 N611BF TYPE: + https://globe.adsbexchange.com/?reg=N131 N627JW TYPE: + https://globe.adsbexchange.com/?reg=N131 N312JC TYPE: + https://globe.adsbexchange.com/?reg=N131 N480JJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N11AF TYPE: + https://globe.adsbexchange.com/?reg=N131 N762F TYPE: + https://globe.adsbexchange.com/?reg=N131 N721F TYPE: + https://globe.adsbexchange.com/?reg=N131 N1DM TYPE: + https://globe.adsbexchange.com/?reg=N131 N356ML TYPE: + https://globe.adsbexchange.com/?reg=N131 N288DG TYPE: + https://globe.adsbexchange.com/?reg=N131 N8439E TYPE: + https://globe.adsbexchange.com/?reg=N131 N89NC TYPE: + https://globe.adsbexchange.com/?reg=N131 N851PB TYPE: + https://globe.adsbexchange.com/?reg=N131 N444DN TYPE: + https://globe.adsbexchange.com/?reg=N131 N886AJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N17JS TYPE: + https://globe.adsbexchange.com/?reg=N131 N13JS TYPE: + https://globe.adsbexchange.com/?reg=N131 N122GA TYPE: + https://globe.adsbexchange.com/?reg=N131 N723GD TYPE: + https://globe.adsbexchange.com/?reg=N131 N335FG TYPE: + https://globe.adsbexchange.com/?reg=N131 N808XX TYPE: + https://globe.adsbexchange.com/?reg=N131 N650AF TYPE: + https://globe.adsbexchange.com/?reg=N131 N1989R TYPE: + https://globe.adsbexchange.com/?reg=N131 N750JE TYPE: + https://globe.adsbexchange.com/?reg=N131 N716AS TYPE: + https://globe.adsbexchange.com/?reg=N131 N793AP TYPE: + https://globe.adsbexchange.com/?reg=N131 N616KG TYPE: + https://globe.adsbexchange.com/?reg=N131 N618KG TYPE: + https://globe.adsbexchange.com/?reg=N131 N906MC TYPE: + https://globe.adsbexchange.com/?reg=N131 N919CH TYPE: + https://globe.adsbexchange.com/?reg=N131 N313TR TYPE: + https://globe.adsbexchange.com/?reg=N131 N84PH TYPE: + https://globe.adsbexchange.com/?reg=N131 N620JK TYPE: + https://globe.adsbexchange.com/?reg=N131 N378AP TYPE: + https://globe.adsbexchange.com/?reg=N131 N387AP TYPE: + https://globe.adsbexchange.com/?reg=N131 N387TP TYPE: + https://globe.adsbexchange.com/?reg=N131 N446CJ TYPE: + https://globe.adsbexchange.com/?reg=N131 N11PH TYPE: + https://globe.adsbexchange.com/?reg=N131 N2320 TYPE: + https://globe.adsbexchange.com/?reg=N131 N2118A TYPE: + https://globe.adsbexchange.com/?reg=N131 N975KA TYPE: + https://globe.adsbexchange.com/?reg=N131 N63628 TYPE: + https://globe.adsbexchange.com/?reg=N131 N10EC TYPE: + https://globe.adsbexchange.com/?reg=N131 N110EC TYPE: + https://globe.adsbexchange.com/?reg=N131 N210EC TYPE: + https://globe.adsbexchange.com/?reg=N131 N510EC TYPE: + https://globe.adsbexchange.com/?reg=N131 N750HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N760HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N780HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N910EC TYPE: + https://globe.adsbexchange.com/?reg=N131 N1TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N40TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N146TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N147TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N148TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N1727L TYPE: + https://globe.adsbexchange.com/?reg=N131 N200RR TYPE: + https://globe.adsbexchange.com/?reg=N131 N215TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N243TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N244TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N329TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N430TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N502TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N503TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N504TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N5271B TYPE: + https://globe.adsbexchange.com/?reg=N131 N454TB TYPE: + https://globe.adsbexchange.com/?reg=N131 N702TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N819TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N956TX TYPE: + https://globe.adsbexchange.com/?reg=N131 N253HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N352HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N353HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N354HP TYPE: + https://globe.adsbexchange.com/?reg=N131 N773TP TYPE: + https://globe.adsbexchange.com/?reg=N131 N2VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N5VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N27VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N28VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N30VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N32VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N34VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N35VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N36VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N39VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N71VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N764VA TYPE: + https://globe.adsbexchange.com/?reg=N131 N102LP TYPE: + https://globe.adsbexchange.com/?reg=N131 N207HB TYPE: + https://globe.adsbexchange.com/?reg=N131 N2446X TYPE: + https://globe.adsbexchange.com/?reg=N131 N305RC TYPE: + https://globe.adsbexchange.com/?reg=N131 N3532K TYPE: + https://globe.adsbexchange.com/?reg=N131 N565E TYPE: + https://globe.adsbexchange.com/?reg=N131 N216KQ TYPE: + https://globe.adsbexchange.com/?reg=N131 N1WV TYPE: + https://globe.adsbexchange.com/?reg=N131 N3WV TYPE: + https://globe.adsbexchange.com/?reg=N131 N5WV TYPE: + https://globe.adsbexchange.com/?reg=N131 N6WV TYPE: + https://globe.adsbexchange.com/?reg=N131 N17UP TYPE: + https://globe.adsbexchange.com/?reg=N131 N204W TYPE: + https://globe.adsbexchange.com/?reg=N131 N2397S TYPE: + https://globe.adsbexchange.com/?reg=N131 N387W TYPE: + https://globe.adsbexchange.com/?reg=N131 N389W TYPE: + https://globe.adsbexchange.com/?reg=N131 N395W TYPE: + https://globe.adsbexchange.com/?reg=N131 N337SS TYPE: + https://globe.adsbexchange.com/?reg=N131 N831MA TYPE: + https://globe.adsbexchange.com/?reg=N131 N832MA TYPE: + https://globe.adsbexchange.com/?reg=N131 N833MA TYPE: + https://globe.adsbexchange.com/?reg=N131 N6991H TYPE: + https://globe.adsbexchange.com/?reg=N131 N735UY TYPE: + https://globe.adsbexchange.com/?reg=N131 N182NR TYPE: + https://globe.adsbexchange.com/?reg=N131 N100DB TYPE: + https://globe.adsbexchange.com/?reg=N131 N1050V TYPE: + https://globe.adsbexchange.com/?reg=N131 N101WY TYPE: + https://globe.adsbexchange.com/?reg=N131 N102WY TYPE: + https://globe.adsbexchange.com/?reg=N131 N104WY TYPE: + Duke Energy N843GG TYPE: N575MW,N139DE,N407LT + Eli Lilly and Company N814LL TYPE: N307EL, N308EL + Enterprise Car Rental N443PR TYPE: N56EL, N57EL + Enterprise Car Rental N44PR TYPE: N56EL, N57EL + ExxonMobile N5PF TYPE: N100A, N200A, N300A, N283EM, N + FedEx N888ZF TYPE: N1FE, N2FE, N6FE, N21FE, N24FE + First Horizon Bank N756LB TYPE: N47SC + https://globe.adsbexchange.com/?reg=N604 N604MH TYPE: + https://globe.adsbexchange.com/?reg=N604 N450MH TYPE: + https://globe.adsbexchange.com/?reg=N604 N1454H TYPE: + https://globe.adsbexchange.com/?reg=N604 N585JC TYPE: + https://globe.adsbexchange.com/?reg=N604 N519BH TYPE: + https://globe.adsbexchange.com/?reg=N604 N2HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N872HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N372HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N72HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N272HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N472HL TYPE: + https://globe.adsbexchange.com/?reg=N604 N151B TYPE: + https://globe.adsbexchange.com/?reg=N604 N933H TYPE: + https://globe.adsbexchange.com/?reg=N604 N705ML TYPE: + https://globe.adsbexchange.com/?reg=N604 N999TB TYPE: + https://globe.adsbexchange.com/?reg=N604 N389H TYPE: + https://globe.adsbexchange.com/?reg=N604 N966H TYPE: + https://globe.adsbexchange.com/?reg=N604 N139H TYPE: + https://globe.adsbexchange.com/?reg=N604 N161B TYPE: + https://globe.adsbexchange.com/?reg=N604 N2030P TYPE: + https://globe.adsbexchange.com/?reg=N604 N620JH TYPE: + https://globe.adsbexchange.com/?reg=N604 N233CL TYPE: + https://globe.adsbexchange.com/?reg=N604 N564HV TYPE: + https://globe.adsbexchange.com/?reg=N604 N565HV TYPE: + https://globe.adsbexchange.com/?reg=N604 N78HV TYPE: + https://globe.adsbexchange.com/?reg=N604 N286CH TYPE: + https://globe.adsbexchange.com/?reg=N604 N286DP TYPE: + https://globe.adsbexchange.com/?reg=N604 N286FM TYPE: + https://globe.adsbexchange.com/?reg=N604 N286SJ TYPE: + https://globe.adsbexchange.com/?reg=N604 N386AZ TYPE: + https://globe.adsbexchange.com/?reg=N604 N486FM TYPE: + https://globe.adsbexchange.com/?reg=N604 N728LM TYPE: + https://globe.adsbexchange.com/?reg=N604 N786WM TYPE: + https://globe.adsbexchange.com/?reg=N604 N873PC TYPE: + https://globe.adsbexchange.com/?reg=N604 N872J TYPE: + https://globe.adsbexchange.com/?reg=N604 N428JE TYPE: + https://globe.adsbexchange.com/?reg=N604 N551GG TYPE: + https://globe.adsbexchange.com/?reg=N604 N282JD TYPE: + https://globe.adsbexchange.com/?reg=N604 N537GS TYPE: + https://globe.adsbexchange.com/?reg=N604 N600JV TYPE: + https://globe.adsbexchange.com/?reg=N604 N637GA TYPE: + https://globe.adsbexchange.com/?reg=N604 N85NV TYPE: + https://globe.adsbexchange.com/?reg=N604 N604SB TYPE: + https://globe.adsbexchange.com/?reg=N604 N109HS TYPE: + https://globe.adsbexchange.com/?reg=N604 N347K TYPE: + https://globe.adsbexchange.com/?reg=N604 N357K TYPE: + https://globe.adsbexchange.com/?reg=N604 N341K TYPE: + https://globe.adsbexchange.com/?reg=N604 N355K TYPE: + https://globe.adsbexchange.com/?reg=N604 N359K TYPE: + https://globe.adsbexchange.com/?reg=N604 N353K TYPE: + https://globe.adsbexchange.com/?reg=N604 N352K TYPE: + https://globe.adsbexchange.com/?reg=N604 N342K TYPE: + https://globe.adsbexchange.com/?reg=N604 N356K TYPE: + https://globe.adsbexchange.com/?reg=N604 N354K TYPE: + https://globe.adsbexchange.com/?reg=N604 N719KX TYPE: + https://globe.adsbexchange.com/?reg=N604 N390KX TYPE: + https://globe.adsbexchange.com/?reg=N604 N265K TYPE: + https://globe.adsbexchange.com/?reg=N604 N302K TYPE: + https://globe.adsbexchange.com/?reg=N604 N797KK TYPE: + https://globe.adsbexchange.com/?reg=N604 N777KK TYPE: + https://globe.adsbexchange.com/?reg=N604 N111KK TYPE: + https://globe.adsbexchange.com/?reg=N604 N101KK TYPE: + https://globe.adsbexchange.com/?reg=N604 N48KR TYPE: + https://globe.adsbexchange.com/?reg=N604 N49KR TYPE: + https://globe.adsbexchange.com/?reg=N604 N302KC TYPE: + https://globe.adsbexchange.com/?reg=N604 N304KC TYPE: + https://globe.adsbexchange.com/?reg=N604 N300KC TYPE: + https://globe.adsbexchange.com/?reg=N604 N50KR TYPE: + https://globe.adsbexchange.com/?reg=N604 N500LS TYPE: + https://globe.adsbexchange.com/?reg=N604 N280BC TYPE: + https://globe.adsbexchange.com/?reg=N604 N347NA TYPE: + https://globe.adsbexchange.com/?reg=N604 N960DT TYPE: + https://globe.adsbexchange.com/?reg=N604 N307PD TYPE: + https://globe.adsbexchange.com/?reg=N604 N55LC TYPE: + https://globe.adsbexchange.com/?reg=N604 N133RL TYPE: + https://globe.adsbexchange.com/?reg=N604 N783MM TYPE: + https://globe.adsbexchange.com/?reg=N604 N57MH TYPE: + https://globe.adsbexchange.com/?reg=N604 N522MH TYPE: + https://globe.adsbexchange.com/?reg=N604 N650NR TYPE: + https://globe.adsbexchange.com/?reg=N604 N1969M TYPE: + https://globe.adsbexchange.com/?reg=N604 N1955M TYPE: + https://globe.adsbexchange.com/?reg=N604 N771HM TYPE: + https://globe.adsbexchange.com/?reg=N604 N772HM TYPE: + https://globe.adsbexchange.com/?reg=N604 N200JB TYPE: + https://globe.adsbexchange.com/?reg=N604 N790R TYPE: + https://globe.adsbexchange.com/?reg=N604 N691BD TYPE: + https://globe.adsbexchange.com/?reg=N604 N799JR TYPE: + https://globe.adsbexchange.com/?reg=N604 N506KM TYPE: + https://globe.adsbexchange.com/?reg=N604 N389DD TYPE: + https://globe.adsbexchange.com/?reg=N604 N3867X TYPE: + https://globe.adsbexchange.com/?reg=N604 N58AJ TYPE: + https://globe.adsbexchange.com/?reg=N604 N437YV TYPE: + https://globe.adsbexchange.com/?reg=N604 N5055J TYPE: + https://globe.adsbexchange.com/?reg=N604 N281MH TYPE: + https://globe.adsbexchange.com/?reg=N604 N320FC TYPE: + https://globe.adsbexchange.com/?reg=N604 N523NB TYPE: + https://globe.adsbexchange.com/?reg=N604 N208SA TYPE: + https://globe.adsbexchange.com/?reg=N604 N552GA TYPE: + https://globe.adsbexchange.com/?reg=N604 N3M TYPE: + https://globe.adsbexchange.com/?reg=N604 N527GA TYPE: + https://globe.adsbexchange.com/?reg=N604 N529GA TYPE: + https://globe.adsbexchange.com/?reg=N604 N473AP TYPE: + https://globe.adsbexchange.com/?reg=N604 N752LT TYPE: + https://globe.adsbexchange.com/?reg=N604 N530G TYPE: + https://globe.adsbexchange.com/?reg=N604 N531GA TYPE: + https://globe.adsbexchange.com/?reg=N604 N645HM TYPE: + https://globe.adsbexchange.com/?reg=N604 N356ER TYPE: + https://globe.adsbexchange.com/?reg=N604 N358ER TYPE: + https://globe.adsbexchange.com/?reg=N604 N590QP TYPE: + https://globe.adsbexchange.com/?reg=N604 N29US TYPE: + https://globe.adsbexchange.com/?reg=N604 N627GB TYPE: + https://globe.adsbexchange.com/?reg=N604 N72NG TYPE: + https://globe.adsbexchange.com/?reg=N604 N77NG TYPE: + https://globe.adsbexchange.com/?reg=N604 N37WH TYPE: + https://globe.adsbexchange.com/?reg=N604 N108EW TYPE: + https://globe.adsbexchange.com/?reg=N604 N108RT TYPE: + https://globe.adsbexchange.com/?reg=N604 N359AR TYPE: + https://globe.adsbexchange.com/?reg=N604 N821AR TYPE: + https://globe.adsbexchange.com/?reg=N604 N41127 TYPE: + https://globe.adsbexchange.com/?reg=N604 N631AB TYPE: + https://globe.adsbexchange.com/?reg=N604 N631CD TYPE: + https://globe.adsbexchange.com/?reg=N604 N190JA TYPE: + https://globe.adsbexchange.com/?reg=N604 N155TM TYPE: + https://globe.adsbexchange.com/?reg=N604 N163WT TYPE: + https://globe.adsbexchange.com/?reg=N604 N97DQ TYPE: + https://globe.adsbexchange.com/?reg=N604 N3TS TYPE: + https://globe.adsbexchange.com/?reg=N604 N858JL TYPE: + https://globe.adsbexchange.com/?reg=N604 N757PL TYPE: + https://globe.adsbexchange.com/?reg=N604 N121RS TYPE: + https://globe.adsbexchange.com/?reg=N604 N283DM TYPE: + https://globe.adsbexchange.com/?reg=N604 N401VE TYPE: + https://globe.adsbexchange.com/?reg=N604 N413PH TYPE: + https://globe.adsbexchange.com/?reg=N604 N900VL TYPE: + https://globe.adsbexchange.com/?reg=N604 N206SU TYPE: + https://globe.adsbexchange.com/?reg=N604 N100ED TYPE: + https://globe.adsbexchange.com/?reg=N604 N4FL TYPE: + https://globe.adsbexchange.com/?reg=N604 N313AG TYPE: + https://globe.adsbexchange.com/?reg=N604 N650KT TYPE: + https://globe.adsbexchange.com/?reg=N604 N1089 TYPE: + https://globe.adsbexchange.com/?reg=N604 N83JJ TYPE: + https://globe.adsbexchange.com/?reg=N604 N15UB TYPE: + https://globe.adsbexchange.com/?reg=N604 N88C TYPE: + https://globe.adsbexchange.com/?reg=N604 N247RU TYPE: + https://globe.adsbexchange.com/?reg=N604 N193LS TYPE: + https://globe.adsbexchange.com/?reg=N604 N948PH TYPE: + https://globe.adsbexchange.com/?reg=N604 N267JR TYPE: + https://globe.adsbexchange.com/?reg=N604 N830NR TYPE: + https://globe.adsbexchange.com/?reg=N604 N584ER TYPE: + https://globe.adsbexchange.com/?reg=N604 N267RF TYPE: + https://globe.adsbexchange.com/?reg=N604 N16DF TYPE: + https://globe.adsbexchange.com/?reg=N604 N518KA TYPE: + https://globe.adsbexchange.com/?reg=N604 N143 TYPE: + https://globe.adsbexchange.com/?reg=N604 N711PV TYPE: + https://globe.adsbexchange.com/?reg=N604 N117AL TYPE: + https://globe.adsbexchange.com/?reg=N604 N246BD TYPE: + https://globe.adsbexchange.com/?reg=N604 N813QS TYPE: + https://globe.adsbexchange.com/?reg=N604 N999YY TYPE: + https://globe.adsbexchange.com/?reg=N604 N4096Q TYPE: + https://globe.adsbexchange.com/?reg=N604 N39871 TYPE: + https://globe.adsbexchange.com/?reg=N604 N1111P TYPE: + Liberty Mutual Insurance N801PR TYPE: N270LE, N45JE, N801PR, N824SS + Liberty Mutual Insurance N824SS TYPE: N270LE, N45JE, N801PR, N824SS + https://globe.adsbexchange.com/?reg=N121 N1219M TYPE: + https://globe.adsbexchange.com/?reg=N121 N1907M TYPE: + https://globe.adsbexchange.com/?reg=N121 N519LM TYPE: + https://globe.adsbexchange.com/?reg=N121 N538M TYPE: + https://globe.adsbexchange.com/?reg=N121 N540M TYPE: + https://globe.adsbexchange.com/?reg=N121 N549M TYPE: + https://globe.adsbexchange.com/?reg=N121 N586M TYPE: + https://globe.adsbexchange.com/?reg=N121 N515CX TYPE: + https://globe.adsbexchange.com/?reg=N121 N563M TYPE: + https://globe.adsbexchange.com/?reg=N121 N811MK TYPE: + https://globe.adsbexchange.com/?reg=N121 N462MK TYPE: + https://globe.adsbexchange.com/?reg=N121 N858CG TYPE: + https://globe.adsbexchange.com/?reg=N121 N854MC TYPE: + https://globe.adsbexchange.com/?reg=N121 N669GD TYPE: + https://globe.adsbexchange.com/?reg=N121 N278L TYPE: + https://globe.adsbexchange.com/?reg=N121 N1TT TYPE: + https://globe.adsbexchange.com/?reg=N121 N512GV TYPE: + https://globe.adsbexchange.com/?reg=N121 N63NB TYPE: + https://globe.adsbexchange.com/?reg=N121 N694GS TYPE: + https://globe.adsbexchange.com/?reg=N121 N950CM TYPE: + https://globe.adsbexchange.com/?reg=N121 N15GX TYPE: + https://globe.adsbexchange.com/?reg=N121 N703DS TYPE: + https://globe.adsbexchange.com/?reg=N121 N183BX TYPE: + https://globe.adsbexchange.com/?reg=N121 N710P TYPE: + https://globe.adsbexchange.com/?reg=N121 N701P TYPE: + https://globe.adsbexchange.com/?reg=N121 N706P TYPE: + https://globe.adsbexchange.com/?reg=N121 N814PS TYPE: + https://globe.adsbexchange.com/?reg=N121 N168PX TYPE: + https://globe.adsbexchange.com/?reg=N121 N101PG TYPE: + https://globe.adsbexchange.com/?reg=N121 N102PG TYPE: + https://globe.adsbexchange.com/?reg=N121 N889CL TYPE: + https://globe.adsbexchange.com/?reg=N121 N889CH TYPE: + https://globe.adsbexchange.com/?reg=N121 N10J TYPE: + https://globe.adsbexchange.com/?reg=N121 N501PC TYPE: + https://globe.adsbexchange.com/?reg=N121 N503PC TYPE: + https://globe.adsbexchange.com/?reg=N121 N273A TYPE: + https://globe.adsbexchange.com/?reg=N121 N673HA TYPE: + https://globe.adsbexchange.com/?reg=N121 N756PC TYPE: + https://globe.adsbexchange.com/?reg=N121 N599HA TYPE: + https://globe.adsbexchange.com/?reg=N121 N756HA TYPE: + https://globe.adsbexchange.com/?reg=N121 N650VL TYPE: + https://globe.adsbexchange.com/?reg=N121 N79PG TYPE: + https://globe.adsbexchange.com/?reg=N121 N179PF TYPE: + https://globe.adsbexchange.com/?reg=N121 N1875A TYPE: + https://globe.adsbexchange.com/?reg=N121 N1948Z TYPE: + https://globe.adsbexchange.com/?reg=N121 N607RP TYPE: + https://globe.adsbexchange.com/?reg=N121 N692GD TYPE: + https://globe.adsbexchange.com/?reg=N121 N14JH TYPE: + https://globe.adsbexchange.com/?reg=N121 N36TA TYPE: + https://globe.adsbexchange.com/?reg=N121 N1065B TYPE: + https://globe.adsbexchange.com/?reg=N121 N910SA TYPE: + https://globe.adsbexchange.com/?reg=N121 N2143J TYPE: + https://globe.adsbexchange.com/?reg=N121 N3267N TYPE: + https://globe.adsbexchange.com/?reg=N121 N880WT TYPE: + https://globe.adsbexchange.com/?reg=N121 N108PB TYPE: + https://globe.adsbexchange.com/?reg=N121 N139MB TYPE: + https://globe.adsbexchange.com/?reg=N121 N188FJ TYPE: + https://globe.adsbexchange.com/?reg=N121 N12JS TYPE: + https://globe.adsbexchange.com/?reg=N121 N1826K TYPE: + https://globe.adsbexchange.com/?reg=N121 N822LC TYPE: + https://globe.adsbexchange.com/?reg=N121 N74JK TYPE: + https://globe.adsbexchange.com/?reg=N121 N11GW TYPE: + https://globe.adsbexchange.com/?reg=N121 N450GG TYPE: + https://globe.adsbexchange.com/?reg=N121 N95VE TYPE: + https://globe.adsbexchange.com/?reg=N121 N424PX TYPE: + https://globe.adsbexchange.com/?reg=N121 N416EL TYPE: + https://globe.adsbexchange.com/?reg=N121 N999GC TYPE: + https://globe.adsbexchange.com/?reg=N121 N582GD TYPE: + https://globe.adsbexchange.com/?reg=N121 N583GD TYPE: + https://globe.adsbexchange.com/?reg=N121 N962GA TYPE: + https://globe.adsbexchange.com/?reg=N121 N605DA TYPE: + https://globe.adsbexchange.com/?reg=N121 N84PJ TYPE: + https://globe.adsbexchange.com/?reg=N121 N83ML TYPE: + https://globe.adsbexchange.com/?reg=N121 N115TR TYPE: + https://globe.adsbexchange.com/?reg=N121 N920JS TYPE: + https://globe.adsbexchange.com/?reg=N121 N148L TYPE: + https://globe.adsbexchange.com/?reg=N121 N148JL TYPE: + https://globe.adsbexchange.com/?reg=N121 N939CC TYPE: + https://globe.adsbexchange.com/?reg=N121 N3877 TYPE: + https://globe.adsbexchange.com/?reg=N121 N704MF TYPE: + https://globe.adsbexchange.com/?reg=N121 N539JS TYPE: + https://globe.adsbexchange.com/?reg=N121 N508LB TYPE: + https://globe.adsbexchange.com/?reg=N121 N725LB TYPE: + https://globe.adsbexchange.com/?reg=N121 N700ME TYPE: + Netflix N2 TYPE: N533GV, N535GV, N512GV + Netflix N15 TYPE: N533GV, N535GV, N512GV + Netflix N35 TYPE: N533GV, N535GV, N512GV + Netflix N54 TYPE: N533GV, N535GV, N512GV + Netflix N55 TYPE: N533GV, N535GV, N512GV + Netflix N56 TYPE: N533GV, N535GV, N512GV + Netflix N57 TYPE: N533GV, N535GV, N512GV + Netflix N58 TYPE: N533GV, N535GV, N512GV + Netflix N59 TYPE: N533GV, N535GV, N512GV + Proctor & Gamble N5PG TYPE: N1PG, N2PG, N5PG, N6PG, N7PG + https://globe.adsbexchange.com/?reg=N288 N197DX TYPE: + https://globe.adsbexchange.com/?reg=N288 N26VW TYPE: + https://globe.adsbexchange.com/?reg=N288 N432CV TYPE: + https://globe.adsbexchange.com/?reg=N288 N465PC TYPE: + https://globe.adsbexchange.com/?reg=N288 N942TW TYPE: + https://globe.adsbexchange.com/?reg=N288 N46RT TYPE: + https://globe.adsbexchange.com/?reg=N288 N67RT TYPE: + https://globe.adsbexchange.com/?reg=N288 N89RT TYPE: + https://globe.adsbexchange.com/?reg=N288 N601RC TYPE: + https://globe.adsbexchange.com/?reg=N288 N63RP TYPE: + https://globe.adsbexchange.com/?reg=N288 N551RC TYPE: + https://globe.adsbexchange.com/?reg=N288 N551SW TYPE: + https://globe.adsbexchange.com/?reg=N288 N660DX TYPE: + https://globe.adsbexchange.com/?reg=N288 N512GL TYPE: + https://globe.adsbexchange.com/?reg=N288 N12MG TYPE: + https://globe.adsbexchange.com/?reg=N288 N50MG TYPE: + https://globe.adsbexchange.com/?reg=N288 N520MG TYPE: + https://globe.adsbexchange.com/?reg=N288 N979TM TYPE: + https://globe.adsbexchange.com/?reg=N288 N289PC TYPE: + https://globe.adsbexchange.com/?reg=N288 N505GD TYPE: + https://globe.adsbexchange.com/?reg=N288 N473HB TYPE: + https://globe.adsbexchange.com/?reg=N288 N244DS TYPE: + https://globe.adsbexchange.com/?reg=N288 N3E TYPE: + https://globe.adsbexchange.com/?reg=N288 N646Y TYPE: + https://globe.adsbexchange.com/?reg=N288 N40NS TYPE: + https://globe.adsbexchange.com/?reg=N288 N212WQ TYPE: + https://globe.adsbexchange.com/?reg=N288 N40WR TYPE: + https://globe.adsbexchange.com/?reg=N288 N721V TYPE: + https://globe.adsbexchange.com/?reg=N288 N211HS TYPE: + https://globe.adsbexchange.com/?reg=N288 N721K TYPE: + https://globe.adsbexchange.com/?reg=N288 N44SF TYPE: + https://globe.adsbexchange.com/?reg=N288 N425TM TYPE: + https://globe.adsbexchange.com/?reg=N288 N686BE TYPE: + https://globe.adsbexchange.com/?reg=N288 N585PL TYPE: + https://globe.adsbexchange.com/?reg=N288 N183T TYPE: + https://globe.adsbexchange.com/?reg=N288 N79TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N707WB TYPE: + https://globe.adsbexchange.com/?reg=N288 N83HD TYPE: + https://globe.adsbexchange.com/?reg=N288 N87HD TYPE: + https://globe.adsbexchange.com/?reg=N288 N86HD TYPE: + https://globe.adsbexchange.com/?reg=N288 N67WV TYPE: + https://globe.adsbexchange.com/?reg=N288 N2120 TYPE: + https://globe.adsbexchange.com/?reg=N288 N805TM TYPE: + https://globe.adsbexchange.com/?reg=N288 N811TM TYPE: + https://globe.adsbexchange.com/?reg=N288 N768BL TYPE: + https://globe.adsbexchange.com/?reg=N288 N715TS TYPE: + https://globe.adsbexchange.com/?reg=N288 N901TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N902TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N903TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N904TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N905TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N907TF TYPE: + https://globe.adsbexchange.com/?reg=N288 N996UA TYPE: + https://globe.adsbexchange.com/?reg=N288 N101UD TYPE: + https://globe.adsbexchange.com/?reg=N288 N845UP TYPE: + https://globe.adsbexchange.com/?reg=N288 N846UP TYPE: + https://globe.adsbexchange.com/?reg=N288 N1886N TYPE: + https://globe.adsbexchange.com/?reg=N288 N1886G TYPE: + https://globe.adsbexchange.com/?reg=N288 N2425J TYPE: + https://globe.adsbexchange.com/?reg=N288 N131EP TYPE: + https://globe.adsbexchange.com/?reg=N288 N5456W TYPE: + https://globe.adsbexchange.com/?reg=N288 N171EX TYPE: + https://globe.adsbexchange.com/?reg=N288 N307PS TYPE: + https://globe.adsbexchange.com/?reg=N288 N479W TYPE: + https://globe.adsbexchange.com/?reg=N288 N128SK TYPE: + https://globe.adsbexchange.com/?reg=N288 N979CB TYPE: + https://globe.adsbexchange.com/?reg=N288 N672WM TYPE: + https://globe.adsbexchange.com/?reg=N288 N898MJ TYPE: + https://globe.adsbexchange.com/?reg=N288 N616RH TYPE: + https://globe.adsbexchange.com/?reg=N288 N440C TYPE: + https://globe.adsbexchange.com/?reg=N288 N609JS TYPE: + https://globe.adsbexchange.com/?reg=N288 N451CS TYPE: + https://globe.adsbexchange.com/?reg=N288 N12MW TYPE: + https://globe.adsbexchange.com/?reg=N288 N651DE TYPE: + https://globe.adsbexchange.com/?reg=N288 N908BH TYPE: + https://globe.adsbexchange.com/?reg=N288 N7JP TYPE: + https://globe.adsbexchange.com/?reg=N288 N169SD TYPE: + https://globe.adsbexchange.com/?reg=N288 N94AD TYPE: + https://globe.adsbexchange.com/?reg=N288 N5SD TYPE: + https://globe.adsbexchange.com/?reg=N288 N6SD TYPE: + https://globe.adsbexchange.com/?reg=N288 N7SD TYPE: + https://globe.adsbexchange.com/?reg=N288 N8SD TYPE: + https://globe.adsbexchange.com/?reg=N288 N340FL TYPE: + https://globe.adsbexchange.com/?reg=N288 N221JS TYPE: + https://globe.adsbexchange.com/?reg=N288 N117MS TYPE: + https://globe.adsbexchange.com/?reg=N288 N1878E TYPE: + https://globe.adsbexchange.com/?reg=N288 N3ED TYPE: + https://globe.adsbexchange.com/?reg=N288 N943EW TYPE: + https://globe.adsbexchange.com/?reg=N288 N747RL TYPE: + https://globe.adsbexchange.com/?reg=N288 N747LE TYPE: + https://globe.adsbexchange.com/?reg=N288 N603BG TYPE: + https://globe.adsbexchange.com/?reg=N288 N702ER TYPE: + https://globe.adsbexchange.com/?reg=N288 N769F TYPE: + https://globe.adsbexchange.com/?reg=N288 N90SD TYPE: + Snapchat/Evan Spiegel N14KL TYPE: N14KL, N3E + Starbucks N721N TYPE: N19HS, N721K, N721N + Trinity Property Group N747HZ TYPE: N768BL + Trinity Property Group N747LA TYPE: N768BL + Trinity Property Group N429RL TYPE: N768BL + Ubiquiti Inc. (Robert Pera) N998R TYPE: N4096Q + https://globe.adsbexchange.com/?reg=N434 N434PB TYPE: + https://globe.adsbexchange.com/?reg=N434 N132M TYPE: + https://globe.adsbexchange.com/?reg=N434 N353V TYPE: + https://globe.adsbexchange.com/?reg=N434 N4VF TYPE: + https://globe.adsbexchange.com/?reg=N434 N5VF TYPE: + https://globe.adsbexchange.com/?reg=N434 N908VZ TYPE: + https://globe.adsbexchange.com/?reg=N434 N313V TYPE: + https://globe.adsbexchange.com/?reg=N434 N503GF TYPE: + https://globe.adsbexchange.com/?reg=N434 N504GF TYPE: + https://globe.adsbexchange.com/?reg=N434 N111MC TYPE: + https://globe.adsbexchange.com/?reg=N434 N506KS TYPE: + https://globe.adsbexchange.com/?reg=N434 N762MS TYPE: + https://globe.adsbexchange.com/?reg=N434 N268RB TYPE: + https://globe.adsbexchange.com/?reg=N434 N673WM TYPE: + https://globe.adsbexchange.com/?reg=N434 N674WM TYPE: + https://globe.adsbexchange.com/?reg=N434 N1500 TYPE: + https://globe.adsbexchange.com/?reg=N434 N222GY TYPE: + https://globe.adsbexchange.com/?reg=N434 N626Z TYPE: + https://globe.adsbexchange.com/?reg=N434 N8800E TYPE: + https://globe.adsbexchange.com/?reg=N434 N412E TYPE: + https://globe.adsbexchange.com/?reg=N434 N806HK TYPE: + https://globe.adsbexchange.com/?reg=N434 N80FE TYPE: + https://globe.adsbexchange.com/?reg=N434 N984BH TYPE: + https://globe.adsbexchange.com/?reg=N434 N984LH TYPE: + https://globe.adsbexchange.com/?reg=N434 N984PC TYPE: + https://globe.adsbexchange.com/?reg=N434 N984BF TYPE: + https://globe.adsbexchange.com/?reg=N434 N910NM TYPE: + https://globe.adsbexchange.com/?reg=N434 N59CX TYPE: + https://globe.adsbexchange.com/?reg=N434 N821AM TYPE: + https://globe.adsbexchange.com/?reg=N434 N921AM TYPE: + https://globe.adsbexchange.com/?reg=N434 N211PB TYPE: + https://globe.adsbexchange.com/?reg=N434 N311PB TYPE: + https://globe.adsbexchange.com/?reg=N434 N716TV TYPE: + https://globe.adsbexchange.com/?reg=N434 N895MM TYPE: + https://globe.adsbexchange.com/?reg=N434 N930GL TYPE: + https://globe.adsbexchange.com/?reg=N434 N865WW TYPE: + https://globe.adsbexchange.com/?reg=N434 N979WW TYPE: + https://globe.adsbexchange.com/?reg=N434 N65RM TYPE: + https://globe.adsbexchange.com/?reg=N434 N973MN TYPE: + https://globe.adsbexchange.com/?reg=N434 N1PK TYPE: + https://globe.adsbexchange.com/?reg=N434 N127UH TYPE: + https://globe.adsbexchange.com/?reg=N434 N427SH TYPE: + https://globe.adsbexchange.com/?reg=N434 N230UH TYPE: + https://globe.adsbexchange.com/?reg=N434 N320UH TYPE: + https://globe.adsbexchange.com/?reg=N434 N846PW TYPE: + https://globe.adsbexchange.com/?reg=N434 N117UH TYPE: + https://globe.adsbexchange.com/?reg=N434 N500UH TYPE: + https://globe.adsbexchange.com/?reg=N434 N686TM TYPE: + https://globe.adsbexchange.com/?reg=N434 N621AB TYPE: + https://globe.adsbexchange.com/?reg=N434 N203FJ TYPE: + https://globe.adsbexchange.com/?reg=N434 N512KS TYPE: + https://globe.adsbexchange.com/?reg=N434 N890D TYPE: + https://globe.adsbexchange.com/?reg=N434 N892D TYPE: + https://globe.adsbexchange.com/?reg=N434 N570D TYPE: + https://globe.adsbexchange.com/?reg=N434 N40D TYPE: + https://globe.adsbexchange.com/?reg=N434 N88T TYPE: + https://globe.adsbexchange.com/?reg=N434 N10SL TYPE: + https://globe.adsbexchange.com/?reg=N434 N122CA TYPE: + https://globe.adsbexchange.com/?reg=N434 N350ZB TYPE: + https://globe.adsbexchange.com/?reg=N434 N650ZB TYPE: + https://globe.adsbexchange.com/?reg=N434 N11A TYPE: + https://globe.adsbexchange.com/?reg=N434 N594GJ TYPE: + https://globe.adsbexchange.com/?reg=N434 N321SD TYPE: + https://globe.adsbexchange.com/?reg=N434 N650D TYPE: + https://globe.adsbexchange.com/?reg=N434 N897D TYPE: + https://globe.adsbexchange.com/?reg=N434 N584V TYPE: + https://globe.adsbexchange.com/?reg=N434 N720LF TYPE: + https://globe.adsbexchange.com/?reg=N434 N360LF TYPE: + https://globe.adsbexchange.com/?reg=N434 N121EF TYPE: + https://globe.adsbexchange.com/?reg=N434 N1415N TYPE: + https://globe.adsbexchange.com/?reg=N434 N142HC TYPE: + https://globe.adsbexchange.com/?reg=N434 N700LE TYPE: + https://globe.adsbexchange.com/?reg=N434 N54DP TYPE: + https://globe.adsbexchange.com/?reg=N434 N4500X TYPE: + https://globe.adsbexchange.com/?reg=N434 N700GF TYPE: + https://globe.adsbexchange.com/?reg=N434 N750PB TYPE: + https://globe.adsbexchange.com/?reg=N434 N313RG TYPE: + https://globe.adsbexchange.com/?reg=N434 N305KH TYPE: + https://globe.adsbexchange.com/?reg=N434 N2016A TYPE: + https://globe.adsbexchange.com/?reg=N434 N600TX TYPE: + Visa N686V TYPE: N476V, N358V, N584V, N686V + 3M Corp N818WP TYPE: N83M, N93M, N818WP + https://globe.adsbexchange.com/?reg=N272 N272GA TYPE: + https://globe.adsbexchange.com/?reg=N272 N501RP TYPE: + https://globe.adsbexchange.com/?reg=N272 N503RP TYPE: + https://globe.adsbexchange.com/?reg=N272 N504RP TYPE: + https://globe.adsbexchange.com/?reg=N272 N655MW TYPE: + https://globe.adsbexchange.com/?reg=N272 N660MW TYPE: + https://globe.adsbexchange.com/?reg=N272 N680MW TYPE: + https://globe.adsbexchange.com/?reg=N272 N564CH TYPE: + https://globe.adsbexchange.com/?reg=N272 N322CG TYPE: + https://globe.adsbexchange.com/?reg=N272 N250CG TYPE: + https://globe.adsbexchange.com/?reg=N272 N999V TYPE: + https://globe.adsbexchange.com/?reg=N272 N393BX TYPE: + https://globe.adsbexchange.com/?reg=N272 N393BZ TYPE: + https://globe.adsbexchange.com/?reg=N272 N393BU TYPE: + https://globe.adsbexchange.com/?reg=N272 N393BW TYPE: + https://globe.adsbexchange.com/?reg=N272 N359V TYPE: + https://globe.adsbexchange.com/?reg=N272 N168FT TYPE: + https://globe.adsbexchange.com/?reg=N272 N963U TYPE: + https://globe.adsbexchange.com/?reg=N272 N827U TYPE: + https://globe.adsbexchange.com/?reg=N272 N315RE TYPE: + https://globe.adsbexchange.com/?reg=N272 N283PH TYPE: + https://globe.adsbexchange.com/?reg=N272 N284PH TYPE: + https://globe.adsbexchange.com/?reg=N272 N285PH TYPE: + https://globe.adsbexchange.com/?reg=N272 N880X TYPE: + https://globe.adsbexchange.com/?reg=N272 N269HM TYPE: + https://globe.adsbexchange.com/?reg=N272 N477SC TYPE: + https://globe.adsbexchange.com/?reg=N272 N711VT TYPE: + https://globe.adsbexchange.com/?reg=N272 N95BD TYPE: + https://globe.adsbexchange.com/?reg=N272 N1960H TYPE: + https://globe.adsbexchange.com/?reg=N272 N800BD TYPE: + https://globe.adsbexchange.com/?reg=N272 N527H TYPE: + https://globe.adsbexchange.com/?reg=N272 N1897S TYPE: + https://globe.adsbexchange.com/?reg=N272 N97SJ TYPE: + https://globe.adsbexchange.com/?reg=N272 N798RS TYPE: + https://globe.adsbexchange.com/?reg=N272 N524AC TYPE: + https://globe.adsbexchange.com/?reg=N272 N527AC TYPE: + https://globe.adsbexchange.com/?reg=N272 N9714G TYPE: + https://globe.adsbexchange.com/?reg=N272 N343AR TYPE: + https://globe.adsbexchange.com/?reg=N272 N684AR TYPE: + https://globe.adsbexchange.com/?reg=N272 N685AR TYPE: + https://globe.adsbexchange.com/?reg=N272 N805AG TYPE: + https://globe.adsbexchange.com/?reg=N272 N806AG TYPE: + https://globe.adsbexchange.com/?reg=N272 N101XT TYPE: + https://globe.adsbexchange.com/?reg=N272 N303XT TYPE: + https://globe.adsbexchange.com/?reg=N272 N818HR TYPE: + https://globe.adsbexchange.com/?reg=N272 N818HF TYPE: + https://globe.adsbexchange.com/?reg=N272 N394GA TYPE: + https://globe.adsbexchange.com/?reg=N272 N203CK TYPE: + https://globe.adsbexchange.com/?reg=N272 N409GB TYPE: + https://globe.adsbexchange.com/?reg=N272 N488GB TYPE: + https://globe.adsbexchange.com/?reg=N272 N454GB TYPE: + https://globe.adsbexchange.com/?reg=N272 N797CX TYPE: + Spirit Aerosysyems N299CX TYPE: N797CX, N299CX + Gothams Disaster Emergency Response N33G TYPE: N33G + https://globe.adsbexchange.com/?reg=N836 N317SK TYPE: + https://globe.adsbexchange.com/?reg=N836 N318SK TYPE: + https://globe.adsbexchange.com/?reg=N836 N470SK TYPE: + https://globe.adsbexchange.com/?reg=N836 N476SK TYPE: + https://globe.adsbexchange.com/?reg=N836 N92RK TYPE: + https://globe.adsbexchange.com/?reg=N836 N2239X TYPE: + https://globe.adsbexchange.com/?reg=N836 N1FC TYPE: + https://globe.adsbexchange.com/?reg=N836 N470B TYPE: + Thoma Bravo N470BB TYPE: N470B, N470BB, N50B + Thoma Bravo N50B TYPE: N470B, N470BB, N50B + Beechcraft King Air 350 N374BH TYPE: N374BH + Boeing BBJ 737-200 N370BC TYPE: N370BC + Bombardier Challenger 300 N5 TYPE: + Bombardier Challenger 601 N275MT TYPE: N275MT + Bombardier Global 5000 N934JM TYPE: N934JM + Bombardier Global 6000 N885AQ TYPE: N885AQ + Bombardier Global 7500 N888GX TYPE: N888GX + Bombardier Global 7500 N265CP TYPE: N265CP + Bombardier Global Express (Global Air Su N320GX TYPE: N320GX + Cessna Citation CJ4 N573AB TYPE: N573AB + Cessna Citation ISP N986DS TYPE: N986DS + Cessna Citation Sovereign N483TW TYPE: N483TW + Cessna Citation X N171PC TYPE: N171PC + Cessna Citation X N751ED TYPE: N751ED + Cirrus Vision Jet N831DX TYPE: N831DX + Cirrus Vision Jet N9AS TYPE: N831DX + Dassault Falcon N3221B TYPE: N3221B + Dassault Falcon N00077 TYPE: SN00077 + Dassault Falcon 50 N199FG TYPE: N199FG + Falcon 50EX N198M TYPE: N198M + Dassault Falcon 7X N500N TYPE: N500N + Dassault Falcon 7X N939TY TYPE: N939TY + Dassault Falcon 8X N225DL TYPE: N225DL + Embraer Legacy 500 N665MC TYPE: N665MC + Embraer Legacy 650 N724SP TYPE: N724SP + Embraer Phenom 300 N911EJ TYPE: N911EJ + Embraer Praetor 500 N473DE TYPE: N473DE + Gulfstream G500 N500GU TYPE: N500GU + Gulfstream G550 (3 1/2 zone) N521SB TYPE: N521SB + Gulfstream G550 (3 zone) N955CM TYPE: N955CM + Gulfstream G550 (4 zone) N5430G TYPE: N5430G + Gulfstream G600 N318AG TYPE: N318AG + Gulfstream G650 (3 zone) N8 TYPE: N616RH + Gulfstream GIV N357PR TYPE: N357PR + Gulfstream GIV N905LP TYPE: N905LP + Gulfstream GIV-SP N899AL TYPE: N899AL + Gulfstream GIV-SP N110SN TYPE: N110SN + Gulfstream GIV-SP N741VE TYPE: N741VE + Gulfstream GIV-SP N6F TYPE: N741VE + Gulfstream GV N625GV TYPE: N625GV + Pilatus PC-12 N880AM TYPE: N880AM + Pilatus PC-12 N47NG TYPE: N47NG + Sikorski S61 Multimission, Construction N721HG TYPE: N721HG + Gulfstream G600 N332DX TYPE: N332DX diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b1db0b0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3.8' + +services: + backend: + build: + context: ./backend + container_name: shadowbroker-backend + ports: + - "8000:8000" + environment: + - AISSTREAM_API_KEY=${AISSTREAM_API_KEY} + - N2YO_API_KEY=${N2YO_API_KEY} + - OPENSKY_USERNAME=${OPENSKY_USERNAME} + - OPENSKY_PASSWORD=${OPENSKY_PASSWORD} + - LTA_ACCOUNT_KEY=${LTA_ACCOUNT_KEY} + volumes: + - backend_data:/app/data + restart: unless-stopped + + frontend: + build: + context: ./frontend + container_name: shadowbroker-frontend + ports: + - "3000:3000" + environment: + - NEXT_PUBLIC_API_URL=http://localhost:8000 + depends_on: + - backend + restart: unless-stopped + +volumes: + backend_data: diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..9e26af2 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,19 @@ +FROM node:18-alpine + +WORKDIR /app + +# Install dependencies +COPY package*.json ./ +RUN npm install + +# Copy source code +COPY . . + +# Expose port +EXPOSE 3000 + +# Next.js telemetry disable +ENV NEXT_TELEMETRY_DISABLED 1 + +# Start development server +CMD ["npm", "run", "dev:frontend"] diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/frontend/build_logs.txt b/frontend/build_logs.txt new file mode 100644 index 0000000..9765230 --- /dev/null +++ b/frontend/build_logs.txt @@ -0,0 +1,33 @@ + +> frontend@0.1.0 build +> next build + +Γû▓ Next.js 16.1.6 (Turbopack) + + Creating an optimized production build ... + +> Build error occurred +Error: Turbopack build failed with 1 errors: +./src/components/MapboxViewer.tsx:4:1 +Module not found: Can't resolve 'react-map-gl' + 2 | + 3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +> 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 5 | import type { LayerProps } from "react-map-gl"; + 6 | import "mapbox-gl/dist/mapbox-gl.css"; + 7 | import * as satellite from "satellite.js"; + + + +Import trace: + Client Component Browser: + ./src/components/MapboxViewer.tsx [Client Component Browser] + ./src/app/page.tsx [Client Component Browser] + ./src/app/page.tsx [Server Component] + +https://nextjs.org/docs/messages/module-not-found + + + at (./src/components/MapboxViewer.tsx:4:1) + at (https://nextjs.org/docs/messages/module-not-found) diff --git a/frontend/build_logs2.txt b/frontend/build_logs2.txt new file mode 100644 index 0000000..9765230 --- /dev/null +++ b/frontend/build_logs2.txt @@ -0,0 +1,33 @@ + +> frontend@0.1.0 build +> next build + +Γû▓ Next.js 16.1.6 (Turbopack) + + Creating an optimized production build ... + +> Build error occurred +Error: Turbopack build failed with 1 errors: +./src/components/MapboxViewer.tsx:4:1 +Module not found: Can't resolve 'react-map-gl' + 2 | + 3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +> 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 5 | import type { LayerProps } from "react-map-gl"; + 6 | import "mapbox-gl/dist/mapbox-gl.css"; + 7 | import * as satellite from "satellite.js"; + + + +Import trace: + Client Component Browser: + ./src/components/MapboxViewer.tsx [Client Component Browser] + ./src/app/page.tsx [Client Component Browser] + ./src/app/page.tsx [Server Component] + +https://nextjs.org/docs/messages/module-not-found + + + at (./src/components/MapboxViewer.tsx:4:1) + at (https://nextjs.org/docs/messages/module-not-found) diff --git a/frontend/build_logs3.txt b/frontend/build_logs3.txt new file mode 100644 index 0000000..9765230 --- /dev/null +++ b/frontend/build_logs3.txt @@ -0,0 +1,33 @@ + +> frontend@0.1.0 build +> next build + +Γû▓ Next.js 16.1.6 (Turbopack) + + Creating an optimized production build ... + +> Build error occurred +Error: Turbopack build failed with 1 errors: +./src/components/MapboxViewer.tsx:4:1 +Module not found: Can't resolve 'react-map-gl' + 2 | + 3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +> 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 5 | import type { LayerProps } from "react-map-gl"; + 6 | import "mapbox-gl/dist/mapbox-gl.css"; + 7 | import * as satellite from "satellite.js"; + + + +Import trace: + Client Component Browser: + ./src/components/MapboxViewer.tsx [Client Component Browser] + ./src/app/page.tsx [Client Component Browser] + ./src/app/page.tsx [Server Component] + +https://nextjs.org/docs/messages/module-not-found + + + at (./src/components/MapboxViewer.tsx:4:1) + at (https://nextjs.org/docs/messages/module-not-found) diff --git a/frontend/build_logs4.txt b/frontend/build_logs4.txt new file mode 100644 index 0000000..9765230 --- /dev/null +++ b/frontend/build_logs4.txt @@ -0,0 +1,33 @@ + +> frontend@0.1.0 build +> next build + +Γû▓ Next.js 16.1.6 (Turbopack) + + Creating an optimized production build ... + +> Build error occurred +Error: Turbopack build failed with 1 errors: +./src/components/MapboxViewer.tsx:4:1 +Module not found: Can't resolve 'react-map-gl' + 2 | + 3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +> 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 5 | import type { LayerProps } from "react-map-gl"; + 6 | import "mapbox-gl/dist/mapbox-gl.css"; + 7 | import * as satellite from "satellite.js"; + + + +Import trace: + Client Component Browser: + ./src/components/MapboxViewer.tsx [Client Component Browser] + ./src/app/page.tsx [Client Component Browser] + ./src/app/page.tsx [Server Component] + +https://nextjs.org/docs/messages/module-not-found + + + at (./src/components/MapboxViewer.tsx:4:1) + at (https://nextjs.org/docs/messages/module-not-found) diff --git a/frontend/build_logs5.txt b/frontend/build_logs5.txt new file mode 100644 index 0000000..9765230 --- /dev/null +++ b/frontend/build_logs5.txt @@ -0,0 +1,33 @@ + +> frontend@0.1.0 build +> next build + +Γû▓ Next.js 16.1.6 (Turbopack) + + Creating an optimized production build ... + +> Build error occurred +Error: Turbopack build failed with 1 errors: +./src/components/MapboxViewer.tsx:4:1 +Module not found: Can't resolve 'react-map-gl' + 2 | + 3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +> 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 5 | import type { LayerProps } from "react-map-gl"; + 6 | import "mapbox-gl/dist/mapbox-gl.css"; + 7 | import * as satellite from "satellite.js"; + + + +Import trace: + Client Component Browser: + ./src/components/MapboxViewer.tsx [Client Component Browser] + ./src/app/page.tsx [Client Component Browser] + ./src/app/page.tsx [Server Component] + +https://nextjs.org/docs/messages/module-not-found + + + at (./src/components/MapboxViewer.tsx:4:1) + at (https://nextjs.org/docs/messages/module-not-found) diff --git a/frontend/cctv.db b/frontend/cctv.db new file mode 100644 index 0000000..c3fe142 Binary files /dev/null and b/frontend/cctv.db differ diff --git a/frontend/errors.txt b/frontend/errors.txt new file mode 100644 index 0000000..e69de29 diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/frontend/next.config.ts b/frontend/next.config.ts new file mode 100644 index 0000000..8b85975 --- /dev/null +++ b/frontend/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + transpilePackages: ['react-map-gl', 'mapbox-gl', 'maplibre-gl'], +}; + +export default nextConfig; diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..f25b494 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,7739 @@ +{ + "name": "frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.1.0", + "dependencies": { + "@types/leaflet": "^1.9.21", + "@types/mapbox-gl": "^3.4.1", + "framer-motion": "^12.34.3", + "leaflet": "^1.9.4", + "lucide-react": "^0.575.0", + "mapbox-gl": "^3.19.0", + "maplibre-gl": "^4.7.1", + "next": "16.1.6", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-leaflet": "^5.0.0", + "react-map-gl": "^8.1.0", + "satellite.js": "^6.0.2" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/mapbox__point-geometry": "^1.0.87", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "concurrently": "^9.2.1", + "eslint": "^9", + "eslint-config-next": "16.1.6", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-3.0.0.tgz", + "integrity": "sha512-2XghOwu16ZwPJLOFVuIOaLbN0iKMn867evzXFyf0P22dqugezfJwLmdanAgU25ITvz1TvOfVP4jsDImlDJzcWg==", + "license": "BSD-3-Clause" + }, + "node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", + "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", + "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^4.0.1" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.6.tgz", + "integrity": "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/mapbox__point-geometry": { + "version": "1.0.87", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-1.0.87.tgz", + "integrity": "sha512-32whuSWD/aDBHpRrZmEMlRjxR0L3sSYUaRnVmw0XwyVMvuU5LsRqrFwYud7gXjqmUE0MSoJB91+IJMqCyYyxag==", + "deprecated": "This is a stub types definition. @mapbox/point-geometry provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "*" + } + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "node_modules/@types/mapbox-gl": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-3.4.1.tgz", + "integrity": "sha512-NsGKKtgW93B+UaLPti6B7NwlxYlES5DpV5Gzj9F75rK5ALKsqSk15CiEHbOnTr09RGbr6ZYiCdI+59NNNcAImg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vis.gl/react-mapbox": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vis.gl/react-mapbox/-/react-mapbox-8.1.0.tgz", + "integrity": "sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==", + "license": "MIT", + "peerDependencies": { + "mapbox-gl": ">=3.5.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "mapbox-gl": { + "optional": true + } + } + }, + "node_modules/@vis.gl/react-maplibre": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vis.gl/react-maplibre/-/react-maplibre-8.1.0.tgz", + "integrity": "sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ==", + "license": "MIT", + "dependencies": { + "@maplibre/maplibre-gl-style-spec": "^19.2.1" + }, + "peerDependencies": { + "maplibre-gl": ">=4.0.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "maplibre-gl": { + "optional": true + } + } + }, + "node_modules/@vis.gl/react-maplibre/node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "19.3.3", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.3.tgz", + "integrity": "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^3.0.0", + "minimist": "^1.2.8", + "rw": "^1.3.3", + "sort-object": "^3.0.3" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@vis.gl/react-maplibre/node_modules/json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "license": "MIT", + "dependencies": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "node_modules/bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "license": "MIT", + "dependencies": { + "typewise-core": "^1.2" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheap-ruler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-4.0.0.tgz", + "integrity": "sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw==", + "license": "ISC" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/earcut": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.6.tgz", + "integrity": "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.1.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/framer-motion": { + "version": "12.34.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.3.tgz", + "integrity": "sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.34.3", + "motion-utils": "^12.29.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "license": "MIT" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-prefix": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "license": "MIT", + "dependencies": { + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.575.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.575.0.tgz", + "integrity": "sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mapbox-gl": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.19.0.tgz", + "integrity": "sha512-SFObIgdxN0b6hZNsRxSUmQWdVW9q9GM2gw4McgFbycyhekew7BZIh8V57pEERDWlI9x/5SxxraTit5Cf0hm9OA==", + "license": "SEE LICENSE IN LICENSE.txt", + "workspaces": [ + "src/style-spec", + "test/build/vite", + "test/build/webpack", + "test/build/typings" + ], + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^3.0.0", + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^2.0.4", + "@types/geojson": "^7946.0.16", + "@types/geojson-vt": "^3.2.5", + "@types/mapbox__point-geometry": "^1.0.87", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "cheap-ruler": "^4.0.0", + "csscolorparser": "~1.0.3", + "earcut": "^3.0.1", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.4", + "grid-index": "^1.1.0", + "kdbush": "^4.0.2", + "martinez-polygon-clipping": "^0.8.1", + "murmurhash-js": "^1.0.0", + "pbf": "^4.0.1", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0" + } + }, + "node_modules/maplibre-gl": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", + "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.1", + "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "global-prefix": "^4.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.3.0", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/maplibre-gl/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/maplibre-gl/node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", + "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/maplibre-gl/node_modules/@maplibre/maplibre-gl-style-spec/node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "license": "MIT" + }, + "node_modules/maplibre-gl/node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/martinez-polygon-clipping": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/martinez-polygon-clipping/-/martinez-polygon-clipping-0.8.1.tgz", + "integrity": "sha512-9PLLMzMPI6ihHox4Ns6LpVBLpRc7sbhULybZ/wyaY8sY3ECNe2+hxm1hA2/9bEEpRrdpjoeduBuZLg2aq1cSIQ==", + "license": "MIT", + "dependencies": { + "robust-predicates": "^2.0.4", + "splaytree": "^0.1.4", + "tinyqueue": "3.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/motion-dom": { + "version": "12.34.3", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz", + "integrity": "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.29.2" + } + }, + "node_modules/motion-utils": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", + "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.1.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pbf": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", + "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", + "license": "BSD-3-Clause", + "dependencies": { + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-leaflet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^3.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/react-map-gl": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-8.1.0.tgz", + "integrity": "sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg==", + "license": "MIT", + "dependencies": { + "@vis.gl/react-mapbox": "8.1.0", + "@vis.gl/react-maplibre": "8.1.0" + }, + "peerDependencies": { + "mapbox-gl": ">=1.13.0", + "maplibre-gl": ">=1.13.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "mapbox-gl": { + "optional": true + }, + "maplibre-gl": { + "optional": true + } + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", + "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==", + "license": "Unlicense" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/satellite.js": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/satellite.js/-/satellite.js-6.0.2.tgz", + "integrity": "sha512-XWKxtqVF5xiJ1xAeiYeT/oSSzsukoCLWvk6nO/WFy4un0M3g4djAU9TAtOCqJLtYW9vxx9pkPJ1L9ITOc607GA==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "license": "MIT", + "dependencies": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/splaytree": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-0.1.4.tgz", + "integrity": "sha512-D50hKrjZgBzqD3FT2Ek53f2dcDLAQT8SSGrzj3vidNH5ISRgceeGVJ2dQIthKOuayqFXfFjXheHNo4bbt9LhRQ==", + "license": "MIT" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "license": "MIT", + "dependencies": { + "typewise-core": "^1.2.0" + } + }, + "node_modules/typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/vt-pbf/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/vt-pbf/node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/vt-pbf/node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..d5ef4e6 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,40 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "concurrently --names \"NEXT,API\" --prefix-colors \"cyan,yellow\" \"next dev\" \"cd ../backend && venv\\Scripts\\python.exe main.py\"", + "dev:frontend": "next dev", + "dev:backend": "cd ../backend && venv\\Scripts\\python.exe main.py", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@types/leaflet": "^1.9.21", + "@types/mapbox-gl": "^3.4.1", + "framer-motion": "^12.34.3", + "leaflet": "^1.9.4", + "lucide-react": "^0.575.0", + "mapbox-gl": "^3.19.0", + "maplibre-gl": "^4.7.1", + "next": "16.1.6", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-leaflet": "^5.0.0", + "react-map-gl": "^8.1.0", + "satellite.js": "^6.0.2" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/mapbox__point-geometry": "^1.0.87", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "concurrently": "^9.2.1", + "eslint": "^9", + "eslint-config-next": "16.1.6", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/frontend/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/frontend/public/cables.geojson b/frontend/public/cables.geojson new file mode 100644 index 0000000..e8b7104 --- /dev/null +++ b/frontend/public/cables.geojson @@ -0,0 +1,245 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "name": "TAT-14" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -74.0, + 40.7 + ], + [ + -30.0, + 45.0 + ], + [ + -5.0, + 50.0 + ], + [ + 0.0, + 51.5 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "Apollo" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -74.0, + 40.7 + ], + [ + -40.0, + 43.0 + ], + [ + -10.0, + 48.0 + ], + [ + -3.0, + 48.5 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "FASTER" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 140.0, + 35.0 + ], + [ + 180.0, + 45.0 + ], + [ + -124.0, + 43.0 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "SEA-ME-WE 3" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 115.0, + -32.0 + ], + [ + 100.0, + 0.0 + ], + [ + 80.0, + 5.0 + ], + [ + 60.0, + 15.0 + ], + [ + 40.0, + 12.0 + ], + [ + 35.0, + 30.0 + ], + [ + 15.0, + 35.0 + ], + [ + 0.0, + 40.0 + ], + [ + -10.0, + 38.0 + ], + [ + -5.0, + 48.0 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "SACS" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -38.5, + -3.7 + ], + [ + -10.0, + -5.0 + ], + [ + 13.2, + -8.8 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "Marea" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -76.0, + 36.8 + ], + [ + -40.0, + 40.0 + ], + [ + -2.9, + 43.3 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "Dunant" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -76.0, + 36.8 + ], + [ + -40.0, + 42.0 + ], + [ + -1.5, + 46.5 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "name": "AAE-1" + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 114.0, + 22.0 + ], + [ + 100.0, + 10.0 + ], + [ + 80.0, + 5.0 + ], + [ + 60.0, + 20.0 + ], + [ + 40.0, + 15.0 + ], + [ + 30.0, + 30.0 + ], + [ + 20.0, + 38.0 + ], + [ + 10.0, + 40.0 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/frontend/public/file.svg b/frontend/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/frontend/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/0-255.pbf b/frontend/public/fonts/arial-unicode-bold/0-255.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/0-255.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/1024-1279.pbf b/frontend/public/fonts/arial-unicode-bold/1024-1279.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/1024-1279.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/256-511.pbf b/frontend/public/fonts/arial-unicode-bold/256-511.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/256-511.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/512-767.pbf b/frontend/public/fonts/arial-unicode-bold/512-767.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/512-767.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/768-1023.pbf b/frontend/public/fonts/arial-unicode-bold/768-1023.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/768-1023.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/arial-unicode-bold/8192-8447.pbf b/frontend/public/fonts/arial-unicode-bold/8192-8447.pbf new file mode 100644 index 0000000..6409c87 --- /dev/null +++ b/frontend/public/fonts/arial-unicode-bold/8192-8447.pbf @@ -0,0 +1,75 @@ + + + + + + OpenMapTiles Font Server - Open-source maps for self-hosting + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

OpenMapTiles Font Server

+

This is the backend server providing vector glyphs for open map styles.

+

+ + Redirecting to the Map Styles gallery... +

+

If you are a developer, you can find the source code on GitHub.

+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/public/fonts/opensans-bold/0-255.pbf b/frontend/public/fonts/opensans-bold/0-255.pbf new file mode 100644 index 0000000..1fc6982 Binary files /dev/null and b/frontend/public/fonts/opensans-bold/0-255.pbf differ diff --git a/frontend/public/fonts/opensans-bold/1024-1279.pbf b/frontend/public/fonts/opensans-bold/1024-1279.pbf new file mode 100644 index 0000000..d8da0a0 Binary files /dev/null and b/frontend/public/fonts/opensans-bold/1024-1279.pbf differ diff --git a/frontend/public/fonts/opensans-bold/256-511.pbf b/frontend/public/fonts/opensans-bold/256-511.pbf new file mode 100644 index 0000000..b8e30c7 Binary files /dev/null and b/frontend/public/fonts/opensans-bold/256-511.pbf differ diff --git a/frontend/public/fonts/opensans-bold/512-767.pbf b/frontend/public/fonts/opensans-bold/512-767.pbf new file mode 100644 index 0000000..d414194 Binary files /dev/null and b/frontend/public/fonts/opensans-bold/512-767.pbf differ diff --git a/frontend/public/fonts/opensans-bold/768-1023.pbf b/frontend/public/fonts/opensans-bold/768-1023.pbf new file mode 100644 index 0000000..13e9a74 Binary files /dev/null and b/frontend/public/fonts/opensans-bold/768-1023.pbf differ diff --git a/frontend/public/fonts/opensans-bold/8192-8447.pbf b/frontend/public/fonts/opensans-bold/8192-8447.pbf new file mode 100644 index 0000000..bde2ebb Binary files /dev/null and b/frontend/public/fonts/opensans-bold/8192-8447.pbf differ diff --git a/frontend/public/globe.svg b/frontend/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/frontend/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/map-style.json b/frontend/public/map-style.json new file mode 100644 index 0000000..f914640 --- /dev/null +++ b/frontend/public/map-style.json @@ -0,0 +1,25 @@ +{ + "version": 8, + "glyphs": "/fonts/{fontstack}/{range}.pbf", + "sources": { + "carto-dark": { + "type": "raster", + "tiles": [ + "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://b.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://c.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://d.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png" + ], + "tileSize": 256 + } + }, + "layers": [ + { + "id": "carto-dark-layer", + "type": "raster", + "source": "carto-dark", + "minzoom": 0, + "maxzoom": 22 + } + ] +} diff --git a/frontend/public/next.svg b/frontend/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/frontend/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/vercel.svg b/frontend/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/frontend/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/window.svg b/frontend/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/frontend/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/server_logs.txt b/frontend/server_logs.txt new file mode 100644 index 0000000..78230d2 --- /dev/null +++ b/frontend/server_logs.txt @@ -0,0 +1,2718 @@ + +> frontend@0.1.0 dev +> concurrently --names "NEXT,API" --prefix-colors "cyan,yellow" "next dev" "..\backend\venv\Scripts\python.exe ../backend/main.py" + +[NEXT] Γû▓ Next.js 16.1.6 (Turbopack) +[NEXT] - Local: http://localhost:3000 +[NEXT] - Network: http://10.0.0.234:3000 +[NEXT] +[NEXT] Γ£ô Starting... +[API] INFO: Will watch for changes in these directories: ['F:\\Codebase\\Oracle\\live-risk-dashboard\\frontend'] +[API] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[API] INFO: Started reloader process [20656] using StatReload +[NEXT] Γ£ô Ready in 2.7s +[API] INFO: Started server process [15128] +[API] INFO: Waiting for application startup. +[API] INFO:services.ais_stream:AIS cache loaded: 26595 vessels from disk +[API] INFO:services.ais_stream:Starting Node.js AIS Stream Proxy... +[API] INFO:services.ais_stream:AIS Stream background thread started +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Added job "update_all_data" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "update_all_data" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "start_scheduler..update_cctvs" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_flights" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_ships" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_geopolitics" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "start_scheduler..update_cctvs" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_flights" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_ships" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_geopolitics" to job store "default" +[API] INFO:apscheduler.scheduler:Scheduler started +[API] INFO: Application startup complete. +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" (scheduled at 2026-02-28 01:27:34.479195-07:00) +[API] INFO:apscheduler.scheduler:Removed job fc1e5373c3c848aca8a21f73ae71b853 +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:services.data_fetcher:Downloading global airports database from ourairports.com... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" (scheduled at 2026-02-28 01:27:34.483189-07:00) +[API] INFO:apscheduler.scheduler:Removed job 0055c6fe5db542db8e3c775bc914547b +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" (scheduled at 2026-02-28 01:27:34.483189-07:00) +[API] INFO:apscheduler.scheduler:Removed job 5af206250cf04a8b98d97edbc4d5c3d9 +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" (scheduled at 2026-02-28 01:27:34.483189-07:00) +[API] INFO:apscheduler.scheduler:Removed job 8ae3e4373fd9490db20ecb05bd8f3462 +[API] INFO:services.ais_stream:AIS Stream proxy started ∩┐╜ receiving vessel data +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21822 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching DeepStateMap from GitHub mirror... +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" (scheduled at 2026-02-28 01:27:34.483189-07:00) +[API] INFO:apscheduler.scheduler:Removed job d08d93b1b8ec4e49915d64ba25f30a09 +[API] INFO:services.geopolitics:Downloading latest DeepStateMap: https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/data/deepstatemap_data_20260228.geojson +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Loaded 1184 large airports into cache. +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21818 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Tracked flights: 0 total (0 from military) +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-8 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 58628: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-10 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 19763: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-12 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 63851: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3552 / 4725 flights +[API] INFO:services.data_fetcher:Tracked flights: 9 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1253 active trails, 0 pruned +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Resolved routes for 3468 / 4726 flights +[API] INFO:services.data_fetcher:Tracked flights: 9 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1334 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: date[2026-02-28 01:27:34 MST], next run at: 2026-02-28 01:27:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 5000 messages, tracking 26507 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26507 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:29:34 MST)" (scheduled at 2026-02-28 01:28:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:29:34 MST)" (scheduled at 2026-02-28 01:28:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21734 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:29:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:29:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 10000 messages, tracking 26414 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26414 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 15000 messages, tracking 26471 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26471 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 20000 messages, tracking 26528 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26528 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:30:34 MST)" (scheduled at 2026-02-28 01:29:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:30:34 MST)" (scheduled at 2026-02-28 01:29:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21754 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:30:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:30:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 25000 messages, tracking 26426 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26426 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 30000 messages, tracking 26469 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26469 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Γ¿» ./src/components/MapboxViewer.tsx:4:1 +[NEXT] Module not found: Can't resolve 'react-map-gl' +[NEXT]   2 | +[NEXT]  3 | import React, { useRef, useEffect, useState, useMemo } from "react"; +[NEXT] > 4 | import Map, { Source, Layer, Fog, Sky, useMap, MapRef } from "react-map-gl"; +[NEXT]  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +[NEXT]  5 | import type { LayerProps } from "react-map-gl"; +[NEXT]  6 | import "mapbox-gl/dist/mapbox-gl.css"; +[NEXT]  7 | import * as satellite from "satellite.js"; +[NEXT] +[NEXT] +[NEXT] +[NEXT] Import trace: +[NEXT] Client Component Browser: +[NEXT] ./src/components/MapboxViewer.tsx [Client Component Browser] +[NEXT] ./src/app/page.tsx [Client Component Browser] +[NEXT] ./src/app/page.tsx [Server Component] +[NEXT] +[NEXT] https://nextjs.org/docs/messages/module-not-found +[NEXT] +[NEXT] +[NEXT] GET / 500 in 1745ms (compile: 1538ms, render: 207ms) +[API] INFO:services.ais_stream:AIS Stream: processed 35000 messages, tracking 26505 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26505 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:33:34 MST)" (scheduled at 2026-02-28 01:30:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:31:34 MST)" (scheduled at 2026-02-28 01:30:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:31:34 MST)" (scheduled at 2026-02-28 01:30:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21759 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:31:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:31:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 40000 messages, tracking 26441 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26441 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 45000 messages, tracking 26489 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26489 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3635 / 4687 flights +[API] INFO:services.data_fetcher:Tracked flights: 10 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1107 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:33:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 50000 messages, tracking 26521 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26521 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:32:34 MST)" (scheduled at 2026-02-28 01:31:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:32:34 MST)" (scheduled at 2026-02-28 01:31:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21739 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:32:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:32:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 55000 messages, tracking 26439 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26439 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 60000 messages, tracking 26497 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26497 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:33:34 MST)" (scheduled at 2026-02-28 01:32:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:37:34 MST)" (scheduled at 2026-02-28 01:32:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:33:34 MST)" (scheduled at 2026-02-28 01:32:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:37:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21750 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:33:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:33:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 65000 messages, tracking 26426 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26426 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 70000 messages, tracking 26465 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26465 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 75000 messages, tracking 26524 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26524 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:36:34 MST)" (scheduled at 2026-02-28 01:33:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:34:34 MST)" (scheduled at 2026-02-28 01:33:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:34:34 MST)" (scheduled at 2026-02-28 01:33:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21759 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:34:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:34:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 80000 messages, tracking 26444 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26444 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 85000 messages, tracking 26503 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26503 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3619 / 4699 flights +[API] INFO:services.data_fetcher:Tracked flights: 10 total (10 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1144 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:36:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 90000 messages, tracking 26548 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26548 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:35:34 MST)" (scheduled at 2026-02-28 01:34:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:35:34 MST)" (scheduled at 2026-02-28 01:34:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21799 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:35:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:35:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:36:34 MST)" (scheduled at 2026-02-28 01:35:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:36:34 MST)" (scheduled at 2026-02-28 01:35:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21702 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:36:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:36:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 95000 messages, tracking 26375 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:39:34 MST)" (scheduled at 2026-02-28 01:36:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:37:34 MST)" (scheduled at 2026-02-28 01:36:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:37:34 MST)" (scheduled at 2026-02-28 01:36:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21544 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:37:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 26375 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:37:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 100000 messages, tracking 26234 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26234 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 105000 messages, tracking 26278 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26278 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3614 / 4704 flights +[API] INFO:services.data_fetcher:Tracked flights: 10 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1166 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:39:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 110000 messages, tracking 26327 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26327 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:38:34 MST)" (scheduled at 2026-02-28 01:37:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:38:34 MST)" (scheduled at 2026-02-28 01:37:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:42:34 MST)" (scheduled at 2026-02-28 01:37:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21566 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:38:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:38:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:42:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 115000 messages, tracking 26264 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26264 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 120000 messages, tracking 26320 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26320 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:39:34 MST)" (scheduled at 2026-02-28 01:38:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:39:34 MST)" (scheduled at 2026-02-28 01:38:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21561 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:39:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 125000 messages, tracking 26214 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:39:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 26214 vessels +[API] Traceback (most recent call last): +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\main.py", line 110, in +[API] uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True) +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\venv\lib\site-packages\uvicorn\main.py", line 582, in run +[API] ChangeReload(config, target=server.run, sockets=[sock]).run() +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\venv\lib\site-packages\uvicorn\supervisors\basereload.py", line 50, in run +[API] for changes in self: +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\venv\lib\site-packages\uvicorn\supervisors\basereload.py", line 69, in __next__ +[API] return self.should_restart() +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\venv\lib\site-packages\uvicorn\supervisors\statreload.py", line 32, in should_restart +[API] for file in self.iter_py_files(): +[API] File "F:\Codebase\Oracle\live-risk-dashboard\backend\venv\lib\site-packages\uvicorn\supervisors\statreload.py", line 52, in iter_py_files +[API] for path in list(reload_dir.rglob("*.py")): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\pathlib.py", line 1047, in rglob +[API] for p in selector.select_from(self): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\pathlib.py", line 493, in _select_from +[API] for p in successor_select(starting_point, is_dir, exists, scandir): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\pathlib.py", line 440, in _select_from +[API] with scandir(parent_path) as scandir_it: +[API] FileNotFoundError: [WinError 3] The system cannot find the path specified: 'F:\\Codebase\\Oracle\\live-risk-dashboard\\frontend\\.next\\diagnostics' +[API] INFO:services.ais_stream:AIS Stream: processed 130000 messages, tracking 26259 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26259 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 135000 messages, tracking 26309 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26309 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:42:34 MST)" (scheduled at 2026-02-28 01:39:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:40:34 MST)" (scheduled at 2026-02-28 01:39:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:40:34 MST)" (scheduled at 2026-02-28 01:39:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21545 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:40:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 140000 messages, tracking 26200 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS cache saved: 26200 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:40:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 145000 messages, tracking 26253 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26253 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3659 / 4759 flights +[API] INFO:services.data_fetcher:Tracked flights: 11 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1154 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:42:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 150000 messages, tracking 26299 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26299 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:41:34 MST)" (scheduled at 2026-02-28 01:40:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:41:34 MST)" (scheduled at 2026-02-28 01:40:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21532 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:41:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:41:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 155000 messages, tracking 26191 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26191 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 160000 messages, tracking 26249 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26249 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 165000 messages, tracking 26305 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26305 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:42:34 MST)" (scheduled at 2026-02-28 01:41:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:42:34 MST)" (scheduled at 2026-02-28 01:41:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21527 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:42:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:42:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 170000 messages, tracking 26225 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26225 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 175000 messages, tracking 26272 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26272 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 180000 messages, tracking 26348 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26348 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:45:34 MST)" (scheduled at 2026-02-28 01:42:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:43:34 MST)" (scheduled at 2026-02-28 01:42:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:43:34 MST)" (scheduled at 2026-02-28 01:42:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:47:34 MST)" (scheduled at 2026-02-28 01:42:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:47:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21603 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:43:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:43:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 185000 messages, tracking 26276 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26276 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3678 / 4776 flights +[API] INFO:services.data_fetcher:Tracked flights: 12 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1163 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:45:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:44:34 MST)" (scheduled at 2026-02-28 01:43:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:44:34 MST)" (scheduled at 2026-02-28 01:43:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21565 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:44:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:44:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Error: Unexpected server response: 503 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:45:34 MST)" (scheduled at 2026-02-28 01:44:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:45:34 MST)" (scheduled at 2026-02-28 01:44:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21303 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:45:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:45:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 190000 messages, tracking 26003 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26003 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 195000 messages, tracking 26069 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26069 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:48:34 MST)" (scheduled at 2026-02-28 01:45:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:46:34 MST)" (scheduled at 2026-02-28 01:45:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:46:34 MST)" (scheduled at 2026-02-28 01:45:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21348 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:46:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:46:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 200000 messages, tracking 26002 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26002 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 205000 messages, tracking 26061 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26061 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3695 / 4831 flights +[API] INFO:services.data_fetcher:Tracked flights: 12 total (6 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1184 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:48:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 210000 messages, tracking 26123 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26123 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:47:34 MST)" (scheduled at 2026-02-28 01:46:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:47:34 MST)" (scheduled at 2026-02-28 01:46:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21361 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:47:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 215000 messages, tracking 25997 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:47:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25997 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Error: Unexpected server response: 503 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Error: Unexpected server response: 503 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:48:34 MST)" (scheduled at 2026-02-28 01:47:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:48:34 MST)" (scheduled at 2026-02-28 01:47:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:52:34 MST)" (scheduled at 2026-02-28 01:47:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21162 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:48:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:48:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:52:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:51:34 MST)" (scheduled at 2026-02-28 01:48:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:49:34 MST)" (scheduled at 2026-02-28 01:48:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:49:34 MST)" (scheduled at 2026-02-28 01:48:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20957 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:49:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:49:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 220000 messages, tracking 25616 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25616 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3678 / 4784 flights +[API] INFO:services.data_fetcher:Tracked flights: 14 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1181 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:51:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 225000 messages, tracking 25683 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25683 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:50:34 MST)" (scheduled at 2026-02-28 01:49:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:50:34 MST)" (scheduled at 2026-02-28 01:49:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20921 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:50:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:50:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 230000 messages, tracking 25559 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25559 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 235000 messages, tracking 25678 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25678 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 240000 messages, tracking 25777 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25777 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:51:34 MST)" (scheduled at 2026-02-28 01:50:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:51:34 MST)" (scheduled at 2026-02-28 01:50:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21264 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:51:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:51:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 245000 messages, tracking 25900 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25900 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 250000 messages, tracking 25967 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25967 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 255000 messages, tracking 26032 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26032 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:54:34 MST)" (scheduled at 2026-02-28 01:51:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:52:34 MST)" (scheduled at 2026-02-28 01:51:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:52:34 MST)" (scheduled at 2026-02-28 01:51:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21391 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:52:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:52:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 260000 messages, tracking 26052 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26052 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 265000 messages, tracking 26114 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26114 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3697 / 4853 flights +[API] INFO:services.data_fetcher:Tracked flights: 14 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1225 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:54:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 270000 messages, tracking 26159 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26159 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:53:34 MST)" (scheduled at 2026-02-28 01:52:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:53:34 MST)" (scheduled at 2026-02-28 01:52:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:57:34 MST)" (scheduled at 2026-02-28 01:52:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 01:57:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21369 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:53:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:53:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 275000 messages, tracking 26068 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26068 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 280000 messages, tracking 26141 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26141 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:54:34 MST)" (scheduled at 2026-02-28 01:53:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:54:34 MST)" (scheduled at 2026-02-28 01:53:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21303 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:54:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:54:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 285000 messages, tracking 25974 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25974 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 290000 messages, tracking 26026 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26026 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 295000 messages, tracking 26073 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26073 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:57:34 MST)" (scheduled at 2026-02-28 01:54:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:55:34 MST)" (scheduled at 2026-02-28 01:54:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:55:34 MST)" (scheduled at 2026-02-28 01:54:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21377 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:55:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:55:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 300000 messages, tracking 26024 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26024 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 305000 messages, tracking 26114 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26114 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 310000 messages, tracking 26165 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26165 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3646 / 4782 flights +[API] INFO:services.data_fetcher:Tracked flights: 14 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1203 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 01:57:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:56:34 MST)" (scheduled at 2026-02-28 01:55:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:56:34 MST)" (scheduled at 2026-02-28 01:55:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21413 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:56:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:56:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:57:34 MST)" (scheduled at 2026-02-28 01:56:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:57:34 MST)" (scheduled at 2026-02-28 01:56:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21054 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:57:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:57:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 315000 messages, tracking 25673 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25673 vessels +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 02:27:34 MST)" (scheduled at 2026-02-28 01:57:34.482190-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:00:34 MST)" (scheduled at 2026-02-28 01:57:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:58:34 MST)" (scheduled at 2026-02-28 01:57:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:58:34 MST)" (scheduled at 2026-02-28 01:57:34.484200-07:00) +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:02:34 MST)" (scheduled at 2026-02-28 01:57:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20895 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:58:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20895 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Tracked flights: 14 total (0 from military) +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:58:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:02:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 320000 messages, tracking 25498 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25498 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (502 Server Error: Bad Gateway for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 325000 messages, tracking 25573 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25573 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-26 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 17679: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-28 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 4282: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 330000 messages, tracking 25627 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25627 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-34 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 70312: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3485 / 4853 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1421 active trails, 374 pruned +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 02:27:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Resolved routes for 3555 / 4852 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1350 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:00:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:59:34 MST)" (scheduled at 2026-02-28 01:58:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:59:34 MST)" (scheduled at 2026-02-28 01:58:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21072 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 01:59:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 335000 messages, tracking 25674 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 01:59:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25674 vessels +[NEXT] Persisting failed: Unable to write SST file 00013700.sst +[NEXT] +[NEXT] Caused by: +[NEXT] The system cannot find the path specified. (os error 3) +[API] INFO:services.ais_stream:AIS Stream: processed 340000 messages, tracking 25784 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS cache saved: 25784 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:00:34 MST)" (scheduled at 2026-02-28 01:59:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:00:34 MST)" (scheduled at 2026-02-28 01:59:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21272 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:00:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:00:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 345000 messages, tracking 25927 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25927 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 350000 messages, tracking 26004 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26004 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 355000 messages, tracking 26058 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26058 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:03:34 MST)" (scheduled at 2026-02-28 02:00:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:01:34 MST)" (scheduled at 2026-02-28 02:00:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:01:34 MST)" (scheduled at 2026-02-28 02:00:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21283 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:01:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:01:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 360000 messages, tracking 25910 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25910 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 365000 messages, tracking 25959 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25959 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3705 / 4837 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1200 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:03:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 370000 messages, tracking 26006 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26006 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:02:34 MST)" (scheduled at 2026-02-28 02:01:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:02:34 MST)" (scheduled at 2026-02-28 02:01:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21301 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:02:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:02:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] +[NEXT] thread 'tokio-runtime-worker' (13712) panicked at C:\actions-runner\_work\next.js\next.js\turbopack\crates\turbo-tasks-backend\src\backend\operation\mod.rs:156:17: +[NEXT] Failed to restore task data (corrupted database or bug): Meta for get_type (TaskId 94695)) +[NEXT] +[NEXT] Caused by: +[NEXT] 0: Looking up data for TaskId 94695 from database failed +[NEXT] 1: Unable to open static sorted file referenced from 00013673.meta +[NEXT] 2: Unable to open static sorted file 00013672.sst +[NEXT] 3: The system cannot find the path specified. (os error 3) +[NEXT] note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +[NEXT] +[NEXT] thread 'tokio-runtime-worker' (13712) panicked at C:\actions-runner\_work\next.js\next.js\turbopack\crates\turbo-tasks-backend\src\backend\operation\mod.rs:156:17: +[NEXT] Failed to restore task data (corrupted database or bug): Meta for get_type (TaskId 94687)) +[NEXT] +[NEXT] Caused by: +[NEXT] 0: Looking up data for TaskId 94687 from database failed +[NEXT] 1: Unable to open static sorted file referenced from 00013673.meta +[NEXT] 2: Unable to open static sorted file 00013672.sst +[NEXT] 3: The system cannot find the path specified. (os error 3) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] +[NEXT] thread 'tokio-runtime-worker' (27016) panicked at C:\actions-runner\_work\next.js\next.js\turbopack\crates\turbo-tasks-backend\src\backend\operation\mod.rs:156:17: +[NEXT] Failed to restore task data (corrupted database or bug): Meta for FileContent::parse_json (TaskId 81)) +[NEXT] +[NEXT] Caused by: +[NEXT] 0: Looking up data for TaskId 81 from database failed +[NEXT] 1: Unable to open static sorted file referenced from 00013673.meta +[NEXT] 2: Unable to open static sorted file 00013672.sst +[NEXT] 3: The system cannot find the path specified. (os error 3) +[NEXT] +[NEXT] thread 'tokio-runtime-worker' (27016) panicked at C:\actions-runner\_work\next.js\next.js\turbopack\crates\turbo-tasks-backend\src\backend\operation\mod.rs:156:17: +[NEXT] Failed to restore task data (corrupted database or bug): Meta for determine_module_type_for_directory (TaskId 96455)) +[NEXT] +[NEXT] Caused by: +[NEXT] 0: Looking up data for TaskId 96455 from database failed +[NEXT] 1: Unable to open static sorted file referenced from 00013673.meta +[NEXT] 2: Unable to open static sorted file 00013672.sst +[NEXT] 3: The system cannot find the path specified. (os error 3) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] ΓÜá Found a change in next.config.ts. Restarting the server to apply the changes... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:03:34 MST)" (scheduled at 2026-02-28 02:02:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:03:34 MST)" (scheduled at 2026-02-28 02:02:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:07:34 MST)" (scheduled at 2026-02-28 02:02:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching DeepStateMap from GitHub mirror... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21298 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:03:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.geopolitics:Downloading latest DeepStateMap: https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/data/deepstatemap_data_20260228.geojson +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:07:34 MST)" executed successfully +[NEXT] Γû▓ Next.js 16.1.6 (Turbopack) +[NEXT] - Local: http://localhost:3000 +[NEXT] - Network: http://10.0.0.234:3000 +[NEXT] +[NEXT] Γ£ô Starting... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[NEXT] Γ£ô Ready in 2.4s +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:03:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Unable to write SST file 00000011.sst +[NEXT] +[NEXT] Caused by: +[NEXT] The system cannot find the path specified. (os error 3) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 375000 messages, tracking 25882 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25882 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:06:34 MST)" (scheduled at 2026-02-28 02:03:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:04:34 MST)" (scheduled at 2026-02-28 02:03:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:04:34 MST)" (scheduled at 2026-02-28 02:03:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21343 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:04:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:04:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 380000 messages, tracking 25941 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25941 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 385000 messages, tracking 26018 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26018 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.data_fetcher:Resolved routes for 3723 / 4874 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1212 active trails, 185 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:06:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 390000 messages, tracking 26056 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS cache saved: 26056 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:05:34 MST)" (scheduled at 2026-02-28 02:04:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:05:34 MST)" (scheduled at 2026-02-28 02:04:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21413 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:05:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:05:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 395000 messages, tracking 26008 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26008 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 400000 messages, tracking 26094 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26094 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 405000 messages, tracking 26248 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26248 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:06:34 MST)" (scheduled at 2026-02-28 02:05:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:06:34 MST)" (scheduled at 2026-02-28 02:05:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21156 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:06:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:06:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 410000 messages, tracking 25766 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25766 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 415000 messages, tracking 25852 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25852 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 420000 messages, tracking 25887 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25887 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:09:34 MST)" (scheduled at 2026-02-28 02:06:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:07:34 MST)" (scheduled at 2026-02-28 02:06:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:07:34 MST)" (scheduled at 2026-02-28 02:06:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21161 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:07:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:07:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 425000 messages, tracking 25721 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25721 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 430000 messages, tracking 25775 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25775 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3676 / 4798 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1194 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:09:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:08:34 MST)" (scheduled at 2026-02-28 02:07:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:08:34 MST)" (scheduled at 2026-02-28 02:07:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:12:34 MST)" (scheduled at 2026-02-28 02:07:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21131 AIS vessels +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:08:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:08:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:12:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 435000 messages, tracking 25655 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25655 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 440000 messages, tracking 25861 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25861 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:09:34 MST)" (scheduled at 2026-02-28 02:08:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:09:34 MST)" (scheduled at 2026-02-28 02:08:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21388 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:09:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 445000 messages, tracking 25924 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25924 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:09:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 450000 messages, tracking 26053 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26053 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 455000 messages, tracking 26139 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26139 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:12:34 MST)" (scheduled at 2026-02-28 02:09:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:10:34 MST)" (scheduled at 2026-02-28 02:09:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:10:34 MST)" (scheduled at 2026-02-28 02:09:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21450 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:10:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 460000 messages, tracking 25966 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25966 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:10:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 465000 messages, tracking 26019 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26019 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3697 / 4868 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1241 active trails, 202 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:12:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:11:34 MST)" (scheduled at 2026-02-28 02:10:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:11:34 MST)" (scheduled at 2026-02-28 02:10:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21363 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:11:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:11:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:12:34 MST)" (scheduled at 2026-02-28 02:11:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:12:34 MST)" (scheduled at 2026-02-28 02:11:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21381 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:12:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:12:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 470000 messages, tracking 25931 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25931 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 475000 messages, tracking 26027 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26027 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 480000 messages, tracking 26081 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26081 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:15:34 MST)" (scheduled at 2026-02-28 02:12:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:13:34 MST)" (scheduled at 2026-02-28 02:12:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:13:34 MST)" (scheduled at 2026-02-28 02:12:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:17:34 MST)" (scheduled at 2026-02-28 02:12:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21540 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:17:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:13:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:13:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 485000 messages, tracking 26081 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26081 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS Stream: processed 490000 messages, tracking 26145 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS cache saved: 26145 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3720 / 4839 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1200 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:15:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 495000 messages, tracking 26204 vessels +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] INFO:services.ais_stream:AIS cache saved: 26204 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:14:34 MST)" (scheduled at 2026-02-28 02:13:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:14:34 MST)" (scheduled at 2026-02-28 02:13:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21519 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:14:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:14:34 MST)" executed successfully +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Persisting failed: Another write batch or compaction is already active (Only a single write operations is allowed at a time) +[NEXT] Γùï Compiling / ... +[API] INFO:services.ais_stream:AIS Stream: processed 500000 messages, tracking 26081 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26081 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:34 MST)" (scheduled at 2026-02-28 02:14:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:34 MST)" (scheduled at 2026-02-28 02:14:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21431 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 505000 messages, tracking 25946 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25946 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 510000 messages, tracking 26013 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26013 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 515000 messages, tracking 26081 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26081 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:18:34 MST)" (scheduled at 2026-02-28 02:15:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:34 MST)" (scheduled at 2026-02-28 02:15:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:34 MST)" (scheduled at 2026-02-28 02:15:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21458 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 520000 messages, tracking 25972 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25972 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 525000 messages, tracking 26026 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26026 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] Exception in thread Thread-40 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 21383: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3635 / 4867 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1282 active trails, 197 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:18:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:34 MST)" (scheduled at 2026-02-28 02:16:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:34 MST)" (scheduled at 2026-02-28 02:16:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21331 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:34 MST)" (scheduled at 2026-02-28 02:17:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:34 MST)" (scheduled at 2026-02-28 02:17:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:22:34 MST)" (scheduled at 2026-02-28 02:17:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21308 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:22:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 530000 messages, tracking 25834 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25834 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 535000 messages, tracking 25896 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25896 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 540000 messages, tracking 25944 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25944 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:21:34 MST)" (scheduled at 2026-02-28 02:18:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:34 MST)" (scheduled at 2026-02-28 02:18:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:34 MST)" (scheduled at 2026-02-28 02:18:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21412 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 545000 messages, tracking 25962 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25962 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 550000 messages, tracking 26010 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26010 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3756 / 4950 flights +[API] INFO:services.data_fetcher:Tracked flights: 15 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1258 active trails, 85 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:21:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 555000 messages, tracking 26082 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26082 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:34 MST)" (scheduled at 2026-02-28 02:19:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:34 MST)" (scheduled at 2026-02-28 02:19:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21334 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 560000 messages, tracking 25931 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25931 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:34 MST)" (scheduled at 2026-02-28 02:20:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:34 MST)" (scheduled at 2026-02-28 02:20:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20308 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 565000 messages, tracking 24773 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24773 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 570000 messages, tracking 24839 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24839 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 575000 messages, tracking 24881 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24881 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:24:34 MST)" (scheduled at 2026-02-28 02:21:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:34 MST)" (scheduled at 2026-02-28 02:21:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:34 MST)" (scheduled at 2026-02-28 02:21:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20278 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 580000 messages, tracking 24736 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 24736 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 585000 messages, tracking 24799 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24799 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-44 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 28044: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] Exception in thread Thread-46 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 17231: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-48 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 11710: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:34 MST)" (scheduled at 2026-02-28 02:22:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:34 MST)" (scheduled at 2026-02-28 02:22:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:27:34 MST)" (scheduled at 2026-02-28 02:22:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:27:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20281 AIS vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] Exception in thread Thread-52 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 2806: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3460 / 4945 flights +[API] INFO:services.data_fetcher:Tracked flights: 16 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1548 active trails, 109 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:24:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:34 MST)" (scheduled at 2026-02-28 02:23:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:34 MST)" (scheduled at 2026-02-28 02:23:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19789 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 590000 messages, tracking 24217 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24217 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 595000 messages, tracking 24291 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24291 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 600000 messages, tracking 24350 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:27:34 MST)" (scheduled at 2026-02-28 02:24:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:34 MST)" (scheduled at 2026-02-28 02:24:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:34 MST)" (scheduled at 2026-02-28 02:24:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19761 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 24350 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 605000 messages, tracking 24241 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24241 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 610000 messages, tracking 24323 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24323 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 615000 messages, tracking 24408 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:34 MST)" (scheduled at 2026-02-28 02:25:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:34 MST)" (scheduled at 2026-02-28 02:25:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19883 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 24408 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Resolved routes for 3692 / 5002 flights +[API] INFO:services.data_fetcher:Tracked flights: 16 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1383 active trails, 115 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:27:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:34 MST)" (scheduled at 2026-02-28 02:26:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:34 MST)" (scheduled at 2026-02-28 02:26:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20444 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 02:57:34 MST)" (scheduled at 2026-02-28 02:27:34.482190-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:30:34 MST)" (scheduled at 2026-02-28 02:27:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:34 MST)" (scheduled at 2026-02-28 02:27:34.484200-07:00) +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:34 MST)" (scheduled at 2026-02-28 02:27:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:32:34 MST)" (scheduled at 2026-02-28 02:27:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20237 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20236 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Tracked flights: 16 total (0 from military) +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:32:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 620000 messages, tracking 24658 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 24658 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-70 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 6556: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 625000 messages, tracking 24733 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS cache saved: 24733 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3698 / 4962 flights +[API] INFO:services.data_fetcher:Tracked flights: 16 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1337 active trails, 0 pruned +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 02:57:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Resolved routes for 3670 / 4962 flights +[API] INFO:services.data_fetcher:Tracked flights: 16 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1364 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:30:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 630000 messages, tracking 24887 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:34 MST)" (scheduled at 2026-02-28 02:28:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:34 MST)" (scheduled at 2026-02-28 02:28:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20237 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 24887 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 635000 messages, tracking 25021 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25021 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 640000 messages, tracking 25712 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25712 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 645000 messages, tracking 25882 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25882 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:34 MST)" (scheduled at 2026-02-28 02:29:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:34 MST)" (scheduled at 2026-02-28 02:29:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21243 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 650000 messages, tracking 25801 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25801 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:33:34 MST)" (scheduled at 2026-02-28 02:30:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:34 MST)" (scheduled at 2026-02-28 02:30:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:34 MST)" (scheduled at 2026-02-28 02:30:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21108 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-82 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 50112: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3658 / 4953 flights +[API] INFO:services.data_fetcher:Tracked flights: 18 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1381 active trails, 510 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:33:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 655000 messages, tracking 25606 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25606 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:34 MST)" (scheduled at 2026-02-28 02:31:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:34 MST)" (scheduled at 2026-02-28 02:31:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21062 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 660000 messages, tracking 25582 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25582 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 665000 messages, tracking 25810 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25810 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 670000 messages, tracking 25944 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25944 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:34 MST)" (scheduled at 2026-02-28 02:32:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:34 MST)" (scheduled at 2026-02-28 02:32:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:37:34 MST)" (scheduled at 2026-02-28 02:32:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:37:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21510 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 675000 messages, tracking 26034 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26034 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 680000 messages, tracking 26103 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26103 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:36:34 MST)" (scheduled at 2026-02-28 02:33:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:34 MST)" (scheduled at 2026-02-28 02:33:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:34 MST)" (scheduled at 2026-02-28 02:33:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21472 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3812 / 5059 flights +[API] INFO:services.data_fetcher:Tracked flights: 20 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1325 active trails, 109 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:36:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:34 MST)" (scheduled at 2026-02-28 02:34:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:34 MST)" (scheduled at 2026-02-28 02:34:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21269 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 685000 messages, tracking 25758 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25758 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:34 MST)" (scheduled at 2026-02-28 02:35:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:34 MST)" (scheduled at 2026-02-28 02:35:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21225 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 690000 messages, tracking 25724 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25724 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 695000 messages, tracking 25796 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25796 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 700000 messages, tracking 25894 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25894 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:39:34 MST)" (scheduled at 2026-02-28 02:36:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:34 MST)" (scheduled at 2026-02-28 02:36:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:34 MST)" (scheduled at 2026-02-28 02:36:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21191 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 705000 messages, tracking 25712 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25712 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 710000 messages, tracking 25790 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25790 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3763 / 5014 flights +[API] INFO:services.data_fetcher:Tracked flights: 21 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1352 active trails, 114 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:39:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:34 MST)" (scheduled at 2026-02-28 02:37:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:34 MST)" (scheduled at 2026-02-28 02:37:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:42:34 MST)" (scheduled at 2026-02-28 02:37:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching DeepStateMap from GitHub mirror... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21200 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:34 MST)" executed successfully +[API] INFO:services.geopolitics:Downloading latest DeepStateMap: https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/data/deepstatemap_data_20260228.geojson +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] WARNING:services.geopolitics:GDELT returned 1 error features. Throttling active. +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:42:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 715000 messages, tracking 25645 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25645 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 720000 messages, tracking 25743 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25743 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:34 MST)" (scheduled at 2026-02-28 02:38:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:34 MST)" (scheduled at 2026-02-28 02:38:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21329 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 725000 messages, tracking 25832 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25832 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 730000 messages, tracking 25901 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25901 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 735000 messages, tracking 26006 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26006 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:42:34 MST)" (scheduled at 2026-02-28 02:39:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:34 MST)" (scheduled at 2026-02-28 02:39:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:34 MST)" (scheduled at 2026-02-28 02:39:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21413 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 740000 messages, tracking 25965 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25965 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3797 / 5064 flights +[API] INFO:services.data_fetcher:Tracked flights: 21 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1377 active trails, 124 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:42:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 745000 messages, tracking 26057 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:34 MST)" (scheduled at 2026-02-28 02:40:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:34 MST)" (scheduled at 2026-02-28 02:40:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21330 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 26057 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 750000 messages, tracking 25864 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25864 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 755000 messages, tracking 25971 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25971 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 760000 messages, tracking 26061 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26061 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:34 MST)" (scheduled at 2026-02-28 02:41:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:34 MST)" (scheduled at 2026-02-28 02:41:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21560 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 765000 messages, tracking 26066 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26066 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 770000 messages, tracking 26135 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26135 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 775000 messages, tracking 26221 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26221 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:45:34 MST)" (scheduled at 2026-02-28 02:42:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:34 MST)" (scheduled at 2026-02-28 02:42:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:34 MST)" (scheduled at 2026-02-28 02:42:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:47:34 MST)" (scheduled at 2026-02-28 02:42:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:47:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21769 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-102 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 23851: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-110 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 39989: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3264 / 4991 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1829 active trails, 108 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:45:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:34 MST)" (scheduled at 2026-02-28 02:43:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:34 MST)" (scheduled at 2026-02-28 02:43:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21516 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:34 MST)" (scheduled at 2026-02-28 02:44:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:34 MST)" (scheduled at 2026-02-28 02:44:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21227 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 780000 messages, tracking 25730 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25730 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 785000 messages, tracking 25791 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25791 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 790000 messages, tracking 25886 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:48:34 MST)" (scheduled at 2026-02-28 02:45:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:34 MST)" (scheduled at 2026-02-28 02:45:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:34 MST)" (scheduled at 2026-02-28 02:45:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21390 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25886 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 795000 messages, tracking 25932 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25932 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 800000 messages, tracking 26078 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 26078 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3832 / 5090 flights +[API] INFO:services.ais_stream:AIS Stream: processed 805000 messages, tracking 26209 vessels +[API] INFO:services.data_fetcher:Tracked flights: 22 total (13 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1344 active trails, 132 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:48:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:34 MST)" (scheduled at 2026-02-28 02:46:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:34 MST)" (scheduled at 2026-02-28 02:46:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21610 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 26209 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:34 MST)" (scheduled at 2026-02-28 02:47:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:34 MST)" (scheduled at 2026-02-28 02:47:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:52:34 MST)" (scheduled at 2026-02-28 02:47:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21237 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:52:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:51:34 MST)" (scheduled at 2026-02-28 02:48:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:34 MST)" (scheduled at 2026-02-28 02:48:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:34 MST)" (scheduled at 2026-02-28 02:48:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21104 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 810000 messages, tracking 25577 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25577 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-118 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 11886: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 815000 messages, tracking 25680 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3732 / 5043 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1421 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:51:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25680 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:34 MST)" (scheduled at 2026-02-28 02:49:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:34 MST)" (scheduled at 2026-02-28 02:49:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21389 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 820000 messages, tracking 25813 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25813 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 825000 messages, tracking 26011 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26011 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 830000 messages, tracking 26142 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26142 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 835000 messages, tracking 26234 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:34 MST)" (scheduled at 2026-02-28 02:50:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:34 MST)" (scheduled at 2026-02-28 02:50:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21739 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 26234 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:34 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:54:34 MST)" (scheduled at 2026-02-28 02:51:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:34 MST)" (scheduled at 2026-02-28 02:51:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:34 MST)" (scheduled at 2026-02-28 02:51:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21536 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] Exception in thread Thread-126 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 49655: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3797 / 5078 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1356 active trails, 101 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:54:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:34 MST)" (scheduled at 2026-02-28 02:52:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:34 MST)" (scheduled at 2026-02-28 02:52:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:57:34 MST)" (scheduled at 2026-02-28 02:52:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:57:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21321 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 840000 messages, tracking 25778 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25778 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 845000 messages, tracking 25859 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25859 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:34 MST)" (scheduled at 2026-02-28 02:53:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:34 MST)" (scheduled at 2026-02-28 02:53:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21378 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 850000 messages, tracking 25813 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25813 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 855000 messages, tracking 25911 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25911 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 860000 messages, tracking 25984 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25984 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:57:34 MST)" (scheduled at 2026-02-28 02:54:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:34 MST)" (scheduled at 2026-02-28 02:54:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:34 MST)" (scheduled at 2026-02-28 02:54:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21420 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 865000 messages, tracking 25848 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25848 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3900 / 5124 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1278 active trails, 239 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:57:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:34 MST)" (scheduled at 2026-02-28 02:55:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:34 MST)" (scheduled at 2026-02-28 02:55:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21360 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 870000 messages, tracking 25793 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:34 MST)" (scheduled at 2026-02-28 02:56:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:34 MST)" (scheduled at 2026-02-28 02:56:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20957 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25793 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 875000 messages, tracking 25433 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25433 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 880000 messages, tracking 25515 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25515 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 885000 messages, tracking 25597 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25597 vessels +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 03:27:34 MST)" (scheduled at 2026-02-28 02:57:34.482190-07:00) +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:00:34 MST)" (scheduled at 2026-02-28 02:57:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:34 MST)" (scheduled at 2026-02-28 02:57:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:34 MST)" (scheduled at 2026-02-28 02:57:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:02:34 MST)" (scheduled at 2026-02-28 02:57:34.484716-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20975 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20975 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Tracked flights: 22 total (0 from military) +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:02:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 890000 messages, tracking 25438 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25438 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 895000 messages, tracking 25528 vessels +[API] Exception in thread Thread-146 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 50519: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS cache saved: 25528 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-152 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 6918: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] Exception in thread Thread-154 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2622: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3786 / 5100 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1394 active trails, 399 pruned +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 03:27:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3707 / 5102 flights +[API] INFO:services.data_fetcher:Tracked flights: 22 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1475 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:00:34 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:34 MST)" (scheduled at 2026-02-28 02:58:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:34 MST)" (scheduled at 2026-02-28 02:58:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21202 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 900000 messages, tracking 25630 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25630 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 905000 messages, tracking 25720 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25720 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 910000 messages, tracking 25813 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25813 vessels +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:34 MST)" (scheduled at 2026-02-28 02:59:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:34 MST)" (scheduled at 2026-02-28 02:59:34.484716-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21416 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:34 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 915000 messages, tracking 25884 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25884 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 920000 messages, tracking 25957 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25957 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 925000 messages, tracking 26020 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26020 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:03:34 MST)" (scheduled at 2026-02-28 03:00:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:34 MST)" (scheduled at 2026-02-28 03:00:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:34 MST)" (scheduled at 2026-02-28 03:00:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21381 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:34 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (502 Server Error: Bad Gateway for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 930000 messages, tracking 25842 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25842 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-162 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 32062: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3697 / 5053 flights +[API] INFO:services.data_fetcher:Tracked flights: 23 total (10 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1432 active trails, 151 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:03:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:34 MST)" (scheduled at 2026-02-28 03:01:34.484200-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:34 MST)" (scheduled at 2026-02-28 03:01:34.484716-07:00) +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21140 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:34 MST)" (scheduled at 2026-02-28 03:02:34.484200-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:34 MST)" (scheduled at 2026-02-28 03:02:34.484716-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:07:34 MST)" (scheduled at 2026-02-28 03:02:34.484716-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:07:34 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21086 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:34 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:34 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 935000 messages, tracking 25559 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25559 vessels diff --git a/frontend/server_logs2.txt b/frontend/server_logs2.txt new file mode 100644 index 0000000..f8695e4 --- /dev/null +++ b/frontend/server_logs2.txt @@ -0,0 +1,1585 @@ + +> frontend@0.1.0 dev +> concurrently --names "NEXT,API" --prefix-colors "cyan,yellow" "next dev" "..\backend\venv\Scripts\python.exe ../backend/main.py" + +[NEXT] ΓÜá Port 3000 is in use by process 27580, using available port 3001 instead. +[NEXT] Γû▓ Next.js 16.1.6 (Turbopack) +[NEXT] - Local: http://localhost:3001 +[NEXT] - Network: http://10.0.0.234:3001 +[NEXT] +[NEXT] Γ£ô Starting... +[NEXT] Γ£ô Ready in 2.1s +[API] INFO: Will watch for changes in these directories: ['F:\\Codebase\\Oracle\\live-risk-dashboard\\frontend'] +[API] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +[API] INFO: Started reloader process [42588] using StatReload +[API] INFO: Started server process [43356] +[API] INFO: Waiting for application startup. +[API] INFO:services.ais_stream:AIS cache loaded: 26328 vessels from disk +[API] INFO:services.ais_stream:Starting Node.js AIS Stream Proxy... +[API] INFO:services.ais_stream:AIS Stream background thread started +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts +[API] INFO:apscheduler.scheduler:Added job "update_all_data" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "update_all_data" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "start_scheduler..update_cctvs" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_flights" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_ships" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_geopolitics" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "start_scheduler..update_cctvs" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_flights" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_ships" to job store "default" +[API] INFO:apscheduler.scheduler:Added job "fetch_geopolitics" to job store "default" +[API] INFO:apscheduler.scheduler:Scheduler started +[API] INFO: Application startup complete. +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" (scheduled at 2026-02-28 02:13:00.847412-07:00) +[API] INFO:apscheduler.scheduler:Removed job 7f2c4e32565a448cb9688a0efdff3e29 +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:services.data_fetcher:Downloading global airports database from ourairports.com... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" (scheduled at 2026-02-28 02:13:00.850410-07:00) +[API] INFO:apscheduler.scheduler:Removed job 4e206a9e1acc44548efb9941891ad4a7 +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" (scheduled at 2026-02-28 02:13:00.851920-07:00) +[API] INFO:apscheduler.scheduler:Removed job 1f65e7364f114f0bab4c92f0db44e751 +[API] INFO:services.ais_stream:AIS Stream proxy started ∩┐╜ receiving vessel data +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" (scheduled at 2026-02-28 02:13:00.851920-07:00) +[API] INFO:apscheduler.scheduler:Removed job 5dc8c0086ab1420ea6a1bf576d445747 +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" (scheduled at 2026-02-28 02:13:00.851920-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.scheduler:Removed job 63d934bc4a984372aa39ac47f8fb0bea +[API] INFO:services.geopolitics:Fetching DeepStateMap from GitHub mirror... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21694 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.geopolitics:Downloading latest DeepStateMap: https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/data/deepstatemap_data_20260228.geojson +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Loaded 1184 large airports into cache. +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21694 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Tracked flights: 0 total (0 from military) +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-24 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 15720: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-30 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 48754: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3627 / 4846 flights +[API] INFO:services.data_fetcher:Tracked flights: 8 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1288 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3507 / 4845 flights +[API] INFO:services.data_fetcher:Tracked flights: 8 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1406 active trails, 0 pruned +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: date[2026-02-28 02:13:00 MST], next run at: 2026-02-28 02:13:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 5000 messages, tracking 26266 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26266 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:00 MST)" (scheduled at 2026-02-28 02:14:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:00 MST)" (scheduled at 2026-02-28 02:14:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21755 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:15:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 10000 messages, tracking 26326 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26326 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 15000 messages, tracking 26379 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26379 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 20000 messages, tracking 26440 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26440 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:00 MST)" (scheduled at 2026-02-28 02:15:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:00 MST)" (scheduled at 2026-02-28 02:15:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21744 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:16:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 25000 messages, tracking 26313 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26313 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 30000 messages, tracking 26399 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26399 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Γùï Compiling / ... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] GET / 200 in 9.2s (compile: 8.8s, render: 490ms) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:00 MST)" (scheduled at 2026-02-28 02:16:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:19:00 MST)" (scheduled at 2026-02-28 02:16:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:00 MST)" (scheduled at 2026-02-28 02:16:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21632 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:17:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Resolved routes for 3724 / 4864 flights +[API] INFO:services.data_fetcher:Tracked flights: 8 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1209 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:19:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:00 MST)" (scheduled at 2026-02-28 02:17:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:00 MST)" (scheduled at 2026-02-28 02:17:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21420 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:18:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:23:00 MST)" (scheduled at 2026-02-28 02:18:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:00 MST)" (scheduled at 2026-02-28 02:18:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:00 MST)" (scheduled at 2026-02-28 02:18:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:23:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21241 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:19:00 MST)" executed successfully +[NEXT] GET / 200 in 741ms (compile: 63ms, render: 677ms) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:00 MST)" (scheduled at 2026-02-28 02:19:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:22:00 MST)" (scheduled at 2026-02-28 02:19:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:00 MST)" (scheduled at 2026-02-28 02:19:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21048 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:20:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3669 / 4988 flights +[API] INFO:services.data_fetcher:Tracked flights: 8 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1380 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:22:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 35000 messages, tracking 25588 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:00 MST)" (scheduled at 2026-02-28 02:20:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:00 MST)" (scheduled at 2026-02-28 02:20:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20803 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25588 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:21:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 40000 messages, tracking 25324 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25324 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 45000 messages, tracking 25418 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25418 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 50000 messages, tracking 25517 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:00 MST)" (scheduled at 2026-02-28 02:21:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:00 MST)" (scheduled at 2026-02-28 02:21:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20824 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25517 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:22:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 55000 messages, tracking 25358 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25358 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 60000 messages, tracking 25431 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25431 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:00 MST)" (scheduled at 2026-02-28 02:22:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:25:00 MST)" (scheduled at 2026-02-28 02:22:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:00 MST)" (scheduled at 2026-02-28 02:22:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21014 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Error: Unexpected server response: 503 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:23:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Error: Unexpected server response: 503 +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 65000 messages, tracking 25547 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25547 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 70000 messages, tracking 25640 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25640 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:28:00 MST)" (scheduled at 2026-02-28 02:23:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:00 MST)" (scheduled at 2026-02-28 02:23:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:00 MST)" (scheduled at 2026-02-28 02:23:00.852928-07:00) +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21056 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:28:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:24:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 75000 messages, tracking 25550 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25550 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 80000 messages, tracking 25611 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25611 vessels +[API] ERROR:services.network_utils:curl fallback exception: Command '['curl.exe', '-s', '-X', 'POST', '-H', 'Content-Type: application/json', '-d', '{"planes": [{"callsign": "NSZ9742", "lat": 47.663635, "lng": 6.634781}, {"callsign": "EJU13LR", "lat": 49.619937, "lng": 6.641755}, {"callsign": "EJU78YD", "lat": 47.311877, "lng": 6.652644}, {"callsign": "KLM27U", "lat": 51.299821, "lng": 6.663208}, {"callsign": "RYR53YV", "lat": 47.568706, "lng": 6.665391}, {"callsign": "RYR19SW", "lat": 51.243439, "lng": 6.687705}, {"callsign": "LBT214", "lat": 50.972672, "lng": 6.688447}, {"callsign": "AUA22D", "lat": 50.268585, "lng": 6.694721}, {"callsign": "RYR13SJ", "lat": 43.839173, "lng": 6.714608}, {"callsign": "RYR261K", "lat": 40.34491, "lng": 6.728516}, {"callsign": "RYR62ST", "lat": 43.209927, "lng": 6.74639}, {"callsign": "ITY576", "lat": 45.884632, "lng": 6.751305}, {"callsign": "CHX9", "lat": 51.380344, "lng": 6.787454}, {"callsign": "JFA65T", "lat": 51.29924, "lng": 6.79304}, {"callsign": "EWG52N", "lat": 51.312698, "lng": 6.821545}, {"callsign": "LGL8254", "lat": 44.650269, "lng": 6.822183}, {"callsign": "IDIOT", "lat": 46.184661, "lng": 6.822372}, {"callsign": "BAW710R", "lat": 47.807984, "lng": 6.841384}, {"callsign": "HBNPG", "lat": 46.67688, "lng": 6.850244}, {"callsign": "VJH784", "lat": 44.393145, "lng": 6.851918}, {"callsign": "RYR27KJ", "lat": 46.284164, "lng": 6.852454}, {"callsign": "AUA312", "lat": 51.621311, "lng": 6.868515}, {"callsign": "VLG1TF", "lat": 46.74813, "lng": 6.918159}, {"callsign": "TVF8939", "lat": 40.909222, "lng": 6.932373}, {"callsign": "WZZ2W", "lat": 53.051954, "lng": 6.952619}, {"callsign": "BEL8XI", "lat": 48.532291, "lng": 6.952828}, {"callsign": "ICV68", "lat": 48.292786, "lng": 6.977656}, {"callsign": "EFW3PJ", "lat": 48.33072, "lng": 6.988895}, {"callsign": "CHX3", "lat": 50.888443, "lng": 7.017517}, {"callsign": "KLM1775", "lat": 52.389935, "lng": 7.031564}, {"callsign": "RYR6YE", "lat": 44.99311, "lng": 7.041164}, {"callsign": "AEE7LD", "lat": 40.909927, "lng": 7.048157}, {"callsign": "RYR32MM", "lat": 46.780623, "lng": 7.084534}, {"callsign": "IBE06SG", "lat": 44.967545, "lng": 7.088536}, {"callsign": "BAW62N", "lat": 58.445962, "lng": 7.095795}, {"callsign": "BCS081", "lat": 39.367355, "lng": 7.099616}, {"callsign": "ULC44", "lat": 46.682165, "lng": 7.108086}, {"callsign": "ITY305", "lat": 47.885308, "lng": 7.137874}, {"callsign": "FIA5903", "lat": 43.58963, "lng": 7.15095}, {"callsign": "RYR7102", "lat": 44.040253, "lng": 7.155549}, {"callsign": "AFR53KA", "lat": 43.712179, "lng": 7.155762}, {"callsign": "HBKGN", "lat": 46.823959, "lng": 7.157258}, {"callsign": "BAW844", "lat": 52.478531, "lng": 7.175827}, {"callsign": "VLG68TP", "lat": 43.914139, "lng": 7.182312}, {"callsign": "SWR7AK", "lat": 45.727611, "lng": 7.184441}, {"callsign": "LHX85P", "lat": 43.455443, "lng": 7.191663}, {"callsign": "CROIX2", "lat": 43.647797, "lng": 7.203941}, {"callsign": "KLM1943", "lat": 48.06067, "lng": 7.207383}, {"callsign": "TUI173", "lat": 45.896851, "lng": 7.217415}, {"callsign": "RAM954V", "lat": 43.516101, "lng": 7.219914}, {"callsign": "XGO1ML", "lat": 43.66572, "lng": 7.22338}, {"callsign": "DLH33E", "lat": 49.663184, "lng": 7.225886}, {"callsign": "EJU96XU", "lat": 48.252045, "lng": 7.23168}, {"callsign": "HBSDS", "lat": 46.802124, "lng": 7.23309}, {"callsign": "SWR4Y", "lat": 47.689556, "lng": 7.239075}, {"callsign": "EDW32L", "lat": 47.444275, "lng": 7.238342}, {"callsign": "DLH9MR", "lat": 52.044067, "lng": 7.279663}, {"callsign": "DLH3PP", "lat": 50.629166, "lng": 7.285815}, {"callsign": "SAS793", "lat": 43.997177, "lng": 7.28994}, {"callsign": "RYR73UV", "lat": 45.892136, "lng": 7.291974}, {"callsign": "RYR227P", "lat": 49.777889, "lng": 7.330034}, {"callsign": "VJH373", "lat": 50.869632, "lng": 7.332306}, {"callsign": "AFR282", "lat": 48.025909, "lng": 7.341064}, {"callsign": "SAS22E", "lat": 56.057367, "lng": 7.352428}, {"callsign": "EJU41VQ", "lat": 47.52301, "lng": 7.35569}, {"callsign": "EIN4RG", "lat": 47.605901, "lng": 7.396827}, {"callsign": "KLM97L", "lat": 50.000931, "lng": 7.409122}, {"callsign": "BAW550", "lat": 44.991993, "lng": 7.41758}, {"callsign": "HBZWD", "lat": 46.884247, "lng": 7.444405}, {"callsign": "GAC587V", "lat": 49.909199, "lng": 7.449581}, {"callsign": "BTI60L", "lat": 51.44339, "lng": 7.4638}, {"callsign": "QTR088", "lat": 49.257435, "lng": 7.471715}, {"callsign": "PGT852E", "lat": 40.316666, "lng": 7.482605}, {"callsign": "NSZ2876", "lat": 51.702172, "lng": 7.492523}, {"callsign": "DLH8LJ", "lat": 49.98674, "lng": 7.539368}, {"callsign": "SIA23", "lat": 50.280624, "lng": 7.554329}, {"callsign": "DELOX", "lat": 53.285191, "lng": 7.563455}, {"callsign": "TKJ2US", "lat": 39.488355, "lng": 7.578125}, {"callsign": "RYR995V", "lat": 40.372055, "lng": 7.586243}, {"callsign": "WMT9MC", "lat": 43.707184, "lng": 7.586762}, {"callsign": "DENCM", "lat": 47.884277, "lng": 7.612015}, {"callsign": "RYR2CD", "lat": 46.377201, "lng": 7.630348}, {"callsign": "KLM87R", "lat": 54.803741, "lng": 7.64083}, {"callsign": "IGGMS", "lat": 44.582845, "lng": 7.653652}, {"callsign": "NOZ2JC", "lat": 56.97952, "lng": 7.673241}, {"callsign": "EZY57YV", "lat": 47.318301, "lng": 7.67888}, {"callsign": "KLM29A", "lat": 50.586082, "lng": 7.693993}, {"callsign": "TUI3DN", "lat": 51.997686, "lng": 7.707145}, {"callsign": "IBE0647", "lat": 40.672806, "lng": 7.707764}, {"callsign": "HBTDZ", "lat": 46.696793, "lng": 7.71401}, {"callsign": "RYR4799", "lat": 47.246246, "lng": 7.716866}, {"callsign": "TVF47AK", "lat": 58.245229, "lng": 7.721283}, {"callsign": "DISGD", "lat": 51.413406, "lng": 7.72324}, {"callsign": "NJE834F", "lat": 51.181, "lng": 7.7513}, {"callsign": "EJU71FL", "lat": 43.377731, "lng": 7.784133}, {"callsign": "AFR53SH", "lat": 47.00647, "lng": 7.786354}, {"callsign": "RYR6JA", "lat": 52.038391, "lng": 7.787857}, {"callsign": "BAW665", "lat": 49.552689, "lng": 7.796896}, {"callsign": "ITY221", "lat": 47.38179, "lng": 7.798164}, {"callsign": "EWG4097", "lat": 51.583557, "lng": 7.798511}]}', 'https://api.adsb.lol/api/0/routeset']' timed out after 20 seconds +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-56 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 9465: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 85000 messages, tracking 25717 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS cache saved: 25717 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3526 / 4943 flights +[API] INFO:services.data_fetcher:Tracked flights: 9 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1473 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:25:00 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:00 MST)" (scheduled at 2026-02-28 02:24:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:00 MST)" (scheduled at 2026-02-28 02:24:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21181 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 90000 messages, tracking 25679 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:25:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25679 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:00 MST)" (scheduled at 2026-02-28 02:25:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:28:00 MST)" (scheduled at 2026-02-28 02:25:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:00 MST)" (scheduled at 2026-02-28 02:25:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20580 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:26:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] Exception in thread Thread-70 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 30262: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-72 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 61813: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3549 / 5024 flights +[API] INFO:services.ais_stream:AIS Stream: processed 95000 messages, tracking 25053 vessels +[API] INFO:services.data_fetcher:Tracked flights: 9 total (8 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1551 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:28:00 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:00 MST)" (scheduled at 2026-02-28 02:26:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:00 MST)" (scheduled at 2026-02-28 02:26:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19657 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25053 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:27:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 100000 messages, tracking 24118 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24118 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 105000 messages, tracking 24186 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24186 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 110000 messages, tracking 24259 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24259 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:00 MST)" (scheduled at 2026-02-28 02:27:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:00 MST)" (scheduled at 2026-02-28 02:27:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19775 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:28:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 115000 messages, tracking 24216 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24216 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 120000 messages, tracking 24291 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24291 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:33:00 MST)" (scheduled at 2026-02-28 02:28:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:00 MST)" (scheduled at 2026-02-28 02:28:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:31:00 MST)" (scheduled at 2026-02-28 02:28:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:00 MST)" (scheduled at 2026-02-28 02:28:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:33:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19879 AIS vessels +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:29:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (502 Server Error: Bad Gateway for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3624 / 4971 flights +[API] INFO:services.data_fetcher:Tracked flights: 9 total (7 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1430 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:31:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:00 MST)" (scheduled at 2026-02-28 02:29:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:00 MST)" (scheduled at 2026-02-28 02:29:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19677 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:30:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 125000 messages, tracking 24065 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:00 MST)" (scheduled at 2026-02-28 02:30:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:00 MST)" (scheduled at 2026-02-28 02:30:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19435 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 24065 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:31:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 130000 messages, tracking 23907 vessels +[API] INFO:services.ais_stream:AIS cache saved: 23907 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 135000 messages, tracking 24055 vessels +[API] INFO:services.ais_stream:AIS cache saved: 24055 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 140000 messages, tracking 24464 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:00 MST)" (scheduled at 2026-02-28 02:31:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:34:00 MST)" (scheduled at 2026-02-28 02:31:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:00 MST)" (scheduled at 2026-02-28 02:31:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 19841 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 24464 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:32:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 145000 messages, tracking 25118 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25118 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-94 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 16340: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 150000 messages, tracking 25363 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25363 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3683 / 4955 flights +[API] INFO:services.data_fetcher:Tracked flights: 11 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1351 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:34:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 155000 messages, tracking 25511 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25511 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:00 MST)" (scheduled at 2026-02-28 02:32:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:00 MST)" (scheduled at 2026-02-28 02:32:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21080 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:33:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:33:00 MST)" (scheduled at 2026-02-28 02:33:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:00 MST)" (scheduled at 2026-02-28 02:33:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:00 MST)" (scheduled at 2026-02-28 02:33:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21080 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:34:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:38:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:00 MST)" (scheduled at 2026-02-28 02:34:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:37:00 MST)" (scheduled at 2026-02-28 02:34:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:00 MST)" (scheduled at 2026-02-28 02:34:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21102 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:35:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 160000 messages, tracking 25697 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25697 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 165000 messages, tracking 25796 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25796 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 170000 messages, tracking 25903 vessels +[API] Exception in thread Thread-104 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 12247: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:00 MST)" (scheduled at 2026-02-28 02:35:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:00 MST)" (scheduled at 2026-02-28 02:35:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21380 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25903 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.data_fetcher:Resolved routes for 3626 / 5042 flights +[API] INFO:services.data_fetcher:Tracked flights: 13 total (11 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1481 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:37:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:36:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 175000 messages, tracking 25916 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25916 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 180000 messages, tracking 25993 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25993 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 185000 messages, tracking 26084 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26084 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:00 MST)" (scheduled at 2026-02-28 02:36:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:00 MST)" (scheduled at 2026-02-28 02:36:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21437 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:37:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:00 MST)" (scheduled at 2026-02-28 02:37:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:40:00 MST)" (scheduled at 2026-02-28 02:37:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:00 MST)" (scheduled at 2026-02-28 02:37:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21237 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:38:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 190000 messages, tracking 25742 vessels +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25742 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-118 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 38847: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3482 / 4992 flights +[API] INFO:services.data_fetcher:Tracked flights: 14 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1596 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:40:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 195000 messages, tracking 25841 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25841 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:43:00 MST)" (scheduled at 2026-02-28 02:38:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:00 MST)" (scheduled at 2026-02-28 02:38:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:00 MST)" (scheduled at 2026-02-28 02:38:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:43:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21238 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:39:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 200000 messages, tracking 25739 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25739 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 205000 messages, tracking 25811 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25811 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 210000 messages, tracking 25880 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25880 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:00 MST)" (scheduled at 2026-02-28 02:39:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:00 MST)" (scheduled at 2026-02-28 02:39:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21188 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:40:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 215000 messages, tracking 25689 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25689 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:00 MST)" (scheduled at 2026-02-28 02:40:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:43:00 MST)" (scheduled at 2026-02-28 02:40:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:00 MST)" (scheduled at 2026-02-28 02:40:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21211 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:41:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 220000 messages, tracking 25718 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25718 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 225000 messages, tracking 25804 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25804 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-130 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 63595: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 230000 messages, tracking 25899 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3575 / 5067 flights +[API] INFO:services.data_fetcher:Tracked flights: 14 total (10 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1591 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:43:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25899 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:00 MST)" (scheduled at 2026-02-28 02:41:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:00 MST)" (scheduled at 2026-02-28 02:41:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21426 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:42:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 235000 messages, tracking 25957 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25957 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 240000 messages, tracking 26047 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26047 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 245000 messages, tracking 26128 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26128 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:00 MST)" (scheduled at 2026-02-28 02:42:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:00 MST)" (scheduled at 2026-02-28 02:42:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21432 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:43:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 250000 messages, tracking 25965 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25965 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 255000 messages, tracking 26078 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26078 vessels +[API] INFO:apscheduler.executors.default:Running job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 03:13:00 MST)" (scheduled at 2026-02-28 02:43:00.850410-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:48:00 MST)" (scheduled at 2026-02-28 02:43:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:00 MST)" (scheduled at 2026-02-28 02:43:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching new data concurrently... +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:46:00 MST)" (scheduled at 2026-02-28 02:43:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:00 MST)" (scheduled at 2026-02-28 02:43:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21326 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21328 AIS vessels +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Tracked flights: 14 total (0 from military) +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:48:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:44:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 260000 messages, tracking 25839 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25839 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 265000 messages, tracking 25919 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25919 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-156 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 50832: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] Exception in thread Thread-158 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 52550: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 270000 messages, tracking 25980 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25980 vessels +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3523 / 5025 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (14 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1587 active trails, 275 pruned +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:00 MST)" (scheduled at 2026-02-28 02:44:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:00 MST)" (scheduled at 2026-02-28 02:44:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Data update complete. +[API] INFO:apscheduler.executors.default:Job "update_all_data (trigger: interval[0:30:00], next run at: 2026-02-28 03:13:00 MST)" executed successfully +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21555 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.data_fetcher:Resolved routes for 3661 / 5029 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (14 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1454 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:46:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:45:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 275000 messages, tracking 26063 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26063 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:00 MST)" (scheduled at 2026-02-28 02:45:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:00 MST)" (scheduled at 2026-02-28 02:45:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21659 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:46:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:00 MST)" (scheduled at 2026-02-28 02:46:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:49:00 MST)" (scheduled at 2026-02-28 02:46:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:00 MST)" (scheduled at 2026-02-28 02:46:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20997 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:47:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 280000 messages, tracking 25432 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25432 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-170 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 27622: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 285000 messages, tracking 25476 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25476 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 290000 messages, tracking 25535 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:00 MST)" (scheduled at 2026-02-28 02:47:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:00 MST)" (scheduled at 2026-02-28 02:47:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 20871 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:00 MST)" executed successfully +[API] Exception in thread Thread-174 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 51890: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25535 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:48:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3675 / 5102 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (13 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1506 active trails, 101 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:49:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 295000 messages, tracking 25355 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25355 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 300000 messages, tracking 25443 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25443 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 305000 messages, tracking 25539 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25539 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:53:00 MST)" (scheduled at 2026-02-28 02:48:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:00 MST)" (scheduled at 2026-02-28 02:48:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:00 MST)" (scheduled at 2026-02-28 02:48:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.geopolitics:Fetching DeepStateMap from GitHub mirror... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21134 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.geopolitics:Downloading latest DeepStateMap: https://raw.githubusercontent.com/cyterat/deepstate-map-data/main/data/deepstatemap_data_20260228.geojson +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:53:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:49:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 310000 messages, tracking 25689 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25689 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Γ£ô Compiled in 312ms +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:00 MST)" (scheduled at 2026-02-28 02:49:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:52:00 MST)" (scheduled at 2026-02-28 02:49:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:00 MST)" (scheduled at 2026-02-28 02:49:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21329 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:50:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 315000 messages, tracking 25802 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25802 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 320000 messages, tracking 25869 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25869 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 325000 messages, tracking 25912 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25912 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3836 / 5063 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1308 active trails, 0 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:52:00 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:00 MST)" (scheduled at 2026-02-28 02:50:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:00 MST)" (scheduled at 2026-02-28 02:50:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21309 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 330000 messages, tracking 25760 vessels +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:51:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 25760 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 335000 messages, tracking 25813 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25813 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 340000 messages, tracking 25866 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25866 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:00 MST)" (scheduled at 2026-02-28 02:51:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:00 MST)" (scheduled at 2026-02-28 02:51:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21257 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:52:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:00 MST)" (scheduled at 2026-02-28 02:52:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:55:00 MST)" (scheduled at 2026-02-28 02:52:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:00 MST)" (scheduled at 2026-02-28 02:52:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21257 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:53:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 345000 messages, tracking 25745 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25745 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3783 / 5074 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (12 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1366 active trails, 126 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:55:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 350000 messages, tracking 25807 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25807 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:58:00 MST)" (scheduled at 2026-02-28 02:53:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:00 MST)" (scheduled at 2026-02-28 02:53:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:00 MST)" (scheduled at 2026-02-28 02:53:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21269 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 88 cameras from LTASingaporeIngestor +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 02:58:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:54:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 355000 messages, tracking 25739 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25739 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 360000 messages, tracking 25793 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25793 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 365000 messages, tracking 25856 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25856 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:00 MST)" (scheduled at 2026-02-28 02:54:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:00 MST)" (scheduled at 2026-02-28 02:54:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21214 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:55:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 370000 messages, tracking 25692 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25692 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[NEXT] Γ£ô Compiled in 174ms +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 375000 messages, tracking 25854 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25854 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:00 MST)" (scheduled at 2026-02-28 02:55:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:58:00 MST)" (scheduled at 2026-02-28 02:55:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:00 MST)" (scheduled at 2026-02-28 02:55:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21230 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:56:00 MST)" executed successfully +[NEXT] Γ£ô Compiled in 317ms +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 380000 messages, tracking 25707 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS cache saved: 25707 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 385000 messages, tracking 25781 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25781 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[NEXT] ΓÜá Fast Refresh had to perform a full reload due to a runtime error. +[NEXT] GET / 200 in 1905ms (compile: 789ms, render: 1116ms) +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.data_fetcher:Resolved routes for 3833 / 5144 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (10 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1368 active trails, 198 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 02:58:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 390000 messages, tracking 25823 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25823 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:00 MST)" (scheduled at 2026-02-28 02:56:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:00 MST)" (scheduled at 2026-02-28 02:56:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21241 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:57:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 395000 messages, tracking 25710 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25710 vessels +[NEXT] GET / 200 in 257ms (compile: 18ms, render: 239ms) +[API] INFO:services.ais_stream:AIS Stream: processed 400000 messages, tracking 25774 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25774 vessels +[NEXT] GET / 200 in 314ms (compile: 18ms, render: 296ms) +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 405000 messages, tracking 25867 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:00 MST)" (scheduled at 2026-02-28 02:57:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:00 MST)" (scheduled at 2026-02-28 02:57:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21207 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 25867 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:58:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 410000 messages, tracking 25805 vessels +[API] INFO:services.ais_stream:AIS cache saved: 25805 vessels +[NEXT] Γ£ô Compiled in 443ms +[API] INFO:services.ais_stream:AIS Stream: processed 415000 messages, tracking 26207 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26207 vessels +[NEXT] Γ£ô Compiled in 312ms +[API] INFO:services.ais_stream:AIS Stream: processed 420000 messages, tracking 26357 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:03:00 MST)" (scheduled at 2026-02-28 02:58:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:00 MST)" (scheduled at 2026-02-28 02:58:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:03:00 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:00 MST)" (scheduled at 2026-02-28 02:58:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:01:00 MST)" (scheduled at 2026-02-28 02:58:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21684 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.ais_stream:AIS cache saved: 26357 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 02:59:00 MST)" executed successfully +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 425000 messages, tracking 26218 vessels +[NEXT] ΓÜá Fast Refresh had to perform a full reload due to a runtime error. +[NEXT] ΓÜá Fast Refresh had to perform a full reload due to a runtime error. +[NEXT] GET / 200 in 973ms (compile: 361ms, render: 612ms) +[NEXT] GET / 200 in 1356ms (compile: 77ms, render: 1279ms) +[API] INFO:services.ais_stream:AIS cache saved: 26218 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] ERROR:services.network_utils:curl fallback failed with exit code 0 +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-210 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 55800: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-212 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 51720: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS Stream: processed 430000 messages, tracking 26275 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26275 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-214 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 73055: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.data_fetcher:Resolved routes for 3455 / 5082 flights +[API] INFO:services.data_fetcher:Tracked flights: 17 total (9 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1702 active trails, 245 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:01:00 MST)" executed successfully +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:00 MST)" (scheduled at 2026-02-28 02:59:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:00 MST)" (scheduled at 2026-02-28 02:59:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21653 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:00:00 MST)" executed successfully +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:00 MST)" (scheduled at 2026-02-28 03:00:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:00 MST)" (scheduled at 2026-02-28 03:00:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21554 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[NEXT] Γ£ô Compiled in 608ms +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:01:00 MST)" executed successfully +[NEXT] ΓÜá Fast Refresh had to perform a full reload due to a runtime error. +[NEXT] GET / 200 in 150ms (compile: 15ms, render: 134ms) +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:services.ais_stream:AIS Stream: processed 435000 messages, tracking 26037 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26037 vessels +[API] INFO:services.ais_stream:AIS Stream: processed 440000 messages, tracking 26161 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26161 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:00 MST)" (scheduled at 2026-02-28 03:01:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:04:00 MST)" (scheduled at 2026-02-28 03:01:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:00 MST)" (scheduled at 2026-02-28 03:01:00.852928-07:00) +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21744 AIS vessels +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:02:00 MST)" executed successfully +[NEXT] GET / 200 in 579ms (compile: 120ms, render: 459ms) +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 445000 messages, tracking 26222 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26222 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] INFO:services.ais_stream:AIS Stream: processed 450000 messages, tracking 26270 vessels +[API] WARNING:services.network_utils:Python HTTP blocked for https://api.adsb.lol/api/0/routeset (420 Client Error: for url: https://api.adsb.lol/api/0/routeset), falling back to curl.exe... +[API] Exception in thread Thread-222 (_readerthread): +[API] Traceback (most recent call last): +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 1016, in _bootstrap_inner +[API] self.run() +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\threading.py", line 953, in run +[API] self._target(*self._args, **self._kwargs) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1515, in _readerthread +[API] buffer.append(fh.read()) +[API] File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode +[API] return codecs.charmap_decode(input,self.errors,decoding_table)[0] +[API] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 12863: character maps to +[API] ERROR:services.network_utils:curl fallback exception: 'NoneType' object has no attribute 'strip' +[API] WARNING:services.data_fetcher:Routeset batch returned HTTP 500 +[API] INFO:services.ais_stream:AIS cache saved: 26270 vessels +[API] INFO:services.data_fetcher:Resolved routes for 3789 / 5067 flights +[API] INFO:services.data_fetcher:Tracked flights: 18 total (10 from civilian) +[API] INFO:services.data_fetcher:Trail accumulation: 1348 active trails, 184 pruned +[API] INFO:apscheduler.executors.default:Job "fetch_flights (trigger: interval[0:03:00], next run at: 2026-02-28 03:04:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 455000 messages, tracking 26327 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26327 vessels +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:00 MST)" (scheduled at 2026-02-28 03:02:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:00 MST)" (scheduled at 2026-02-28 03:02:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21794 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[NEXT] GET / 200 in 423ms (compile: 17ms, render: 406ms) +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:03:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS Stream: processed 460000 messages, tracking 26277 vessels +[API] INFO:services.ais_stream:AIS cache saved: 26277 vessels +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] ERROR:services.ais_stream:AIS Stream error: concurrent connections per user exceeded +[API] WARNING:services.ais_stream:AIS proxy stderr: WebSocket Proxy Closed. Reconnecting in 5s... +[API] INFO:apscheduler.executors.default:Running job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:08:00 MST)" (scheduled at 2026-02-28 03:03:00.852928-07:00) +[API] INFO:services.data_fetcher:Fetching Geopolitics data... +[API] INFO:services.geopolitics:Fetching GDELT Global Military Incidents... +[API] INFO:apscheduler.executors.default:Running job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:04:00 MST)" (scheduled at 2026-02-28 03:03:00.852928-07:00) +[API] INFO:apscheduler.executors.default:Running job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:04:00 MST)" (scheduled at 2026-02-28 03:03:00.852928-07:00) +[API] INFO:services.data_fetcher:Running CCTV Pipeline Ingestion... +[API] INFO:services.data_fetcher:Ships: 5 carriers + 21624 AIS vessels +[API] INFO:apscheduler.executors.default:Job "fetch_ships (trigger: interval[0:01:00], next run at: 2026-02-28 03:04:00 MST)" executed successfully +[API] INFO:services.cctv_pipeline:Successfully ingested 884 cameras from TFLJamCamIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 90 cameras from LTASingaporeIngestor +[API] INFO:services.cctv_pipeline:Successfully ingested 978 cameras from AustinTXIngestor +[API] INFO:services.ais_stream:AIS Stream: processed 465000 messages, tracking 26066 vessels +[API] INFO:services.cctv_pipeline:Successfully ingested 1032 cameras from NYCDOTIngestor +[API] INFO:apscheduler.executors.default:Job "start_scheduler..update_cctvs (trigger: interval[0:01:00], next run at: 2026-02-28 03:04:00 MST)" executed successfully +[API] INFO:apscheduler.executors.default:Job "fetch_geopolitics (trigger: interval[0:05:00], next run at: 2026-02-28 03:08:00 MST)" executed successfully +[API] INFO:services.ais_stream:AIS cache saved: 26066 vessels diff --git a/frontend/src/app/favicon.ico b/frontend/src/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/frontend/src/app/favicon.ico differ diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css new file mode 100644 index 0000000..5599d0c --- /dev/null +++ b/frontend/src/app/globals.css @@ -0,0 +1,73 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} + +/* Styled thin scrollbar for dark HUD UI */ +.styled-scrollbar::-webkit-scrollbar { + width: 5px; +} + +.styled-scrollbar::-webkit-scrollbar-track { + background: transparent; +} + +.styled-scrollbar::-webkit-scrollbar-thumb { + background: rgba(100, 116, 139, 0.3); + border-radius: 10px; +} + +.styled-scrollbar::-webkit-scrollbar-thumb:hover { + background: rgba(100, 116, 139, 0.5); +} + +.styled-scrollbar { + scrollbar-width: thin; +} + +/* MapLibre Popup Overrides */ +.maplibregl-popup-content { + background: transparent !important; + border: none !important; + box-shadow: none !important; + padding: 0 !important; +} + +.maplibregl-popup-tip { + display: none !important; +} + +/* Focus mode: dim the map canvas (tiles + drawn layers) when a popup is active. + Inside MapLibre's DOM, .maplibregl-canvas-container is a SIBLING of .maplibregl-popup, + so this filter dims the map without affecting the popup at all. */ +.map-focus-active .maplibregl-canvas-container { + filter: brightness(0.3); + transition: filter 0.3s ease; +} + +/* Keep popups fully bright and interactive above the dimmed canvas */ +.map-focus-active .maplibregl-popup { + z-index: 10 !important; +} \ No newline at end of file diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx new file mode 100644 index 0000000..a014eb8 --- /dev/null +++ b/frontend/src/app/layout.tsx @@ -0,0 +1,39 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "WORLDVIEW // ORBITAL TRACKING", + description: "Advanced Geopolitical Risk Dashboard", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + + + + {children} + + + ); +} diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx new file mode 100644 index 0000000..e03ecd9 --- /dev/null +++ b/frontend/src/app/page.tsx @@ -0,0 +1,430 @@ +"use client"; + +import { useEffect, useState, useRef, useCallback } from "react"; +import dynamic from 'next/dynamic'; +import { motion } from "framer-motion"; +import WorldviewLeftPanel from "@/components/WorldviewLeftPanel"; +import WorldviewRightPanel from "@/components/WorldviewRightPanel"; +import NewsFeed from "@/components/NewsFeed"; +import MarketsPanel from "@/components/MarketsPanel"; +import FilterPanel from "@/components/FilterPanel"; +import FindLocateBar from "@/components/FindLocateBar"; +import RadioInterceptPanel from "@/components/RadioInterceptPanel"; +import SettingsPanel from "@/components/SettingsPanel"; +import MapLegend from "@/components/MapLegend"; +import ScaleBar from "@/components/ScaleBar"; +import ErrorBoundary from "@/components/ErrorBoundary"; + +// Use dynamic loads for Maplibre to avoid SSR window is not defined errors +const MaplibreViewer = dynamic(() => import('@/components/MaplibreViewer'), { ssr: false }); + +export default function Dashboard() { + const dataRef = useRef({}); + const [dataVersion, setDataVersion] = useState(0); + // Stable reference for child components — only changes when dataVersion increments + const data = dataRef.current; + const [uiVisible, setUiVisible] = useState(true); + const [settingsOpen, setSettingsOpen] = useState(false); + const [legendOpen, setLegendOpen] = useState(false); + const [mapView, setMapView] = useState({ zoom: 2, latitude: 20 }); + const [measureMode, setMeasureMode] = useState(false); + const [measurePoints, setMeasurePoints] = useState<{ lat: number; lng: number }[]>([]); + + const [activeLayers, setActiveLayers] = useState({ + flights: true, + private: true, + jets: true, + military: true, + tracked: true, + satellites: true, + ships_important: true, + ships_civilian: false, + ships_passenger: true, + earthquakes: true, + cctv: false, + ukraine_frontline: true, + global_incidents: true, + day_night: true, + gps_jamming: true, + }); + + const [effects, setEffects] = useState({ + bloom: true, + }); + + const [activeStyle, setActiveStyle] = useState('DEFAULT'); + const stylesList = ['DEFAULT', 'FLIR', 'NVG', 'CRT']; + + const cycleStyle = () => { + setActiveStyle((prev) => { + const idx = stylesList.indexOf(prev); + return stylesList[(idx + 1) % stylesList.length]; + }); + }; + + const [selectedEntity, setSelectedEntity] = useState<{ type: string, id: string | number, extra?: any } | null>(null); + const [activeFilters, setActiveFilters] = useState>({}); + const [flyToLocation, setFlyToLocation] = useState<{ lat: number, lng: number, ts: number } | null>(null); + + // Eavesdrop Mode State + const [isEavesdropping, setIsEavesdropping] = useState(false); + const [eavesdropLocation, setEavesdropLocation] = useState<{ lat: number, lng: number } | null>(null); + const [cameraCenter, setCameraCenter] = useState<{ lat: number, lng: number } | null>(null); + + // Mouse coordinate + reverse geocoding state + const [mouseCoords, setMouseCoords] = useState<{ lat: number, lng: number } | null>(null); + const [locationLabel, setLocationLabel] = useState(''); + const geocodeCache = useRef>(new Map()); + const geocodeTimer = useRef | null>(null); + + const lastGeocodedPos = useRef<{ lat: number; lng: number } | null>(null); + const geocodeAbort = useRef(null); + + const handleMouseCoords = useCallback((coords: { lat: number, lng: number }) => { + setMouseCoords(coords); + + // Throttle reverse geocoding to every 1500ms + distance check + if (geocodeTimer.current) clearTimeout(geocodeTimer.current); + geocodeTimer.current = setTimeout(async () => { + // Skip if cursor hasn't moved far enough (0.05 degrees ~= 5km) + if (lastGeocodedPos.current) { + const dLat = Math.abs(coords.lat - lastGeocodedPos.current.lat); + const dLng = Math.abs(coords.lng - lastGeocodedPos.current.lng); + if (dLat < 0.05 && dLng < 0.05) return; + } + + const gridKey = `${(coords.lat).toFixed(2)},${(coords.lng).toFixed(2)}`; + const cached = geocodeCache.current.get(gridKey); + if (cached) { + setLocationLabel(cached); + lastGeocodedPos.current = coords; + return; + } + + // Cancel any in-flight geocode request + if (geocodeAbort.current) geocodeAbort.current.abort(); + geocodeAbort.current = new AbortController(); + + try { + const res = await fetch( + `https://nominatim.openstreetmap.org/reverse?lat=${coords.lat}&lon=${coords.lng}&format=json&zoom=10&addressdetails=1`, + { headers: { 'Accept-Language': 'en' }, signal: geocodeAbort.current.signal } + ); + if (res.ok) { + const data = await res.json(); + const addr = data.address || {}; + const city = addr.city || addr.town || addr.village || addr.county || ''; + const state = addr.state || addr.region || ''; + const country = addr.country || ''; + const parts = [city, state, country].filter(Boolean); + const label = parts.join(', ') || data.display_name?.split(',').slice(0, 3).join(',') || 'Unknown'; + + // LRU-style cache pruning: keep max 500 entries (Map preserves insertion order) + if (geocodeCache.current.size > 500) { + const iter = geocodeCache.current.keys(); + for (let i = 0; i < 100; i++) { + const key = iter.next().value; + if (key !== undefined) geocodeCache.current.delete(key); + } + } + geocodeCache.current.set(gridKey, label); + setLocationLabel(label); + lastGeocodedPos.current = coords; + } + } catch (e: any) { + if (e.name !== 'AbortError') { /* Silently fail - keep last label */ } + } + }, 1500); + }, []); + + // Region dossier state (right-click intelligence) + const [regionDossier, setRegionDossier] = useState(null); + const [regionDossierLoading, setRegionDossierLoading] = useState(false); + + const handleMapRightClick = useCallback(async (coords: { lat: number, lng: number }) => { + setSelectedEntity({ type: 'region_dossier', id: `${coords.lat.toFixed(4)}_${coords.lng.toFixed(4)}`, extra: coords }); + setRegionDossierLoading(true); + setRegionDossier(null); + try { + const res = await fetch(`http://localhost:8000/api/region-dossier?lat=${coords.lat}&lng=${coords.lng}`); + if (res.ok) { + const data = await res.json(); + setRegionDossier(data); + } + } catch (e) { + console.error("Failed to fetch region dossier", e); + } finally { + setRegionDossierLoading(false); + } + }, []); + + // Clear dossier when selecting a different entity type + useEffect(() => { + if (selectedEntity?.type !== 'region_dossier') { + setRegionDossier(null); + setRegionDossierLoading(false); + } + }, [selectedEntity]); + + // ETag tracking for conditional requests + const fastEtag = useRef(null); + const slowEtag = useRef(null); + + useEffect(() => { + const fetchFastData = async () => { + try { + const headers: Record = {}; + if (fastEtag.current) headers['If-None-Match'] = fastEtag.current; + const res = await fetch("http://localhost:8000/api/live-data/fast", { headers }); + if (res.status === 304) return; // Data unchanged, skip update + if (res.ok) { + fastEtag.current = res.headers.get('etag') || null; + const json = await res.json(); + dataRef.current = { ...dataRef.current, ...json }; + setDataVersion(v => v + 1); + } + } catch (e) { + console.error("Failed fetching fast live data", e); + } + }; + + const fetchSlowData = async () => { + try { + const headers: Record = {}; + if (slowEtag.current) headers['If-None-Match'] = slowEtag.current; + const res = await fetch("http://localhost:8000/api/live-data/slow", { headers }); + if (res.status === 304) return; + if (res.ok) { + slowEtag.current = res.headers.get('etag') || null; + const json = await res.json(); + dataRef.current = { ...dataRef.current, ...json }; + setDataVersion(v => v + 1); + } + } catch (e) { + console.error("Failed fetching slow live data", e); + } + }; + + fetchFastData(); + fetchSlowData(); + + // Fast polling: 15s (backend updates every 60s — polling more often just yields 304s) + // Slow polling: 60s (backend updates every 30min) + const fastInterval = setInterval(fetchFastData, 15000); + const slowInterval = setInterval(fetchSlowData, 60000); + + return () => { + clearInterval(fastInterval); + clearInterval(slowInterval); + }; + }, []); + + return ( +
+ + {/* MAPLIBRE WEBGL OVERLAY */} + + { + setMeasurePoints(prev => prev.length >= 3 ? prev : [...prev, pt]); + }} + measurePoints={measurePoints} + /> + + + {uiVisible && ( + <> + {/* WORLDVIEW HEADER */} + +
+ {/* Target Reticle Icon */} +
+
+
+
+
+
+
+

+ S H A D O W B R O K E R +

+ GLOBAL THREAT INTERCEPT +
+
+ + {/* SYSTEM METRICS TOP LEFT */} +
+ OPTIC VIS:113 SRC:180 DENS:1.42 0.8ms +
+ + {/* SYSTEM METRICS TOP RIGHT */} +
+
RTX
+
VSR
+
+ + {/* LEFT HUD CONTAINER */} +
+ {/* LEFT PANEL - DATA LAYERS */} + setSettingsOpen(true)} onLegendClick={() => setLegendOpen(true)} /> + + {/* LEFT BOTTOM - DISPLAY CONFIG */} + +
+ + {/* RIGHT HUD CONTAINER */} +
+ {/* FIND / LOCATE */} +
+ { + setFlyToLocation({ lat, lng, ts: Date.now() }); + }} + onFilter={(filterKey, value) => { + setActiveFilters(prev => { + const current = prev[filterKey] || []; + if (!current.includes(value)) { + return { ...prev, [filterKey]: [...current, value] }; + } + return prev; + }); + }} + /> +
+ + {/* TOP RIGHT - MARKETS */} +
+ +
+ + {/* SIGINT & RADIO INTERCEPTS */} +
+ +
+ + {/* DATA FILTERS */} +
+ +
+ + {/* BOTTOM RIGHT - NEWS FEED (fills remaining space) */} +
+ +
+
+ + {/* BOTTOM CENTER COORDINATE / LOCATION BAR */} + +
+ {/* Coordinates */} +
+
COORDINATES
+
+ {mouseCoords ? `${mouseCoords.lat.toFixed(4)}, ${mouseCoords.lng.toFixed(4)}` : '0.0000, 0.0000'} +
+
+ + {/* Divider */} +
+ + {/* Location name */} +
+
LOCATION
+
+ {locationLabel || 'Hover over map...'} +
+
+ + {/* Divider */} +
+ + {/* Style preset (compact) */} +
+
STYLE
+
{activeStyle}
+
+
+ + + )} + + {/* RESTORE UI BUTTON (If Hidden) */} + {!uiVisible && ( + + )} + + {/* DYNAMIC SCALE BAR */} +
+ { + setMeasureMode(m => !m); + if (measureMode) setMeasurePoints([]); + }} + onClearMeasure={() => setMeasurePoints([])} + /> +
+ + {/* STATIC CRT VIGNETTE */} +
+ + {/* SCANLINES OVERLAY */} +
+ + {/* SETTINGS PANEL */} + setSettingsOpen(false)} /> + + {/* MAP LEGEND */} + setLegendOpen(false)} /> + +
+ ); +} diff --git a/frontend/src/components/AdvancedFilterModal.tsx b/frontend/src/components/AdvancedFilterModal.tsx new file mode 100644 index 0000000..efa380c --- /dev/null +++ b/frontend/src/components/AdvancedFilterModal.tsx @@ -0,0 +1,345 @@ +"use client"; + +import { useState, useMemo, useRef, useCallback, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { Search, X, Check, GripHorizontal } from 'lucide-react'; + +interface FilterField { + key: string; + label: string; + options: string[]; + optionLabels?: Record; +} + +interface AdvancedFilterModalProps { + title: string; + icon: React.ReactNode; + accentColor: string; // CSS color string e.g. '#00bcd4' + accentColorName: string; // tailwind name e.g. 'cyan' + fields: FilterField[]; + activeFilters: Record; + onApply: (filters: Record) => void; + onClose: () => void; +} + +export default function AdvancedFilterModal({ + title, icon, accentColor, accentColorName, fields, activeFilters, onApply, onClose +}: AdvancedFilterModalProps) { + // Local draft state — only committed on Apply + const [draft, setDraft] = useState>>(() => { + const init: Record> = {}; + for (const field of fields) { + init[field.key] = new Set(activeFilters[field.key] || []); + } + return init; + }); + + const [searchTerms, setSearchTerms] = useState>(() => { + const init: Record = {}; + for (const field of fields) init[field.key] = ''; + return init; + }); + + const [activeTab, setActiveTab] = useState(fields[0]?.key || ''); + + // Dragging state + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [isDragging, setIsDragging] = useState(false); + const dragStartRef = useRef({ x: 0, y: 0, posX: 0, posY: 0 }); + const modalRef = useRef(null); + + // Center on mount + useEffect(() => { + if (modalRef.current) { + const rect = modalRef.current.getBoundingClientRect(); + setPosition({ + x: (window.innerWidth - rect.width) / 2, + y: (window.innerHeight - rect.height) / 2 + }); + } + }, []); + + const handleMouseDown = useCallback((e: React.MouseEvent) => { + e.preventDefault(); + setIsDragging(true); + dragStartRef.current = { x: e.clientX, y: e.clientY, posX: position.x, posY: position.y }; + }, [position]); + + useEffect(() => { + if (!isDragging) return; + const handleMove = (e: MouseEvent) => { + const dx = e.clientX - dragStartRef.current.x; + const dy = e.clientY - dragStartRef.current.y; + setPosition({ + x: dragStartRef.current.posX + dx, + y: dragStartRef.current.posY + dy + }); + }; + const handleUp = () => setIsDragging(false); + window.addEventListener('mousemove', handleMove); + window.addEventListener('mouseup', handleUp); + return () => { + window.removeEventListener('mousemove', handleMove); + window.removeEventListener('mouseup', handleUp); + }; + }, [isDragging]); + + const toggleItem = (fieldKey: string, value: string) => { + setDraft(prev => { + const next = { ...prev }; + const s = new Set(prev[fieldKey]); + if (s.has(value)) s.delete(value); + else s.add(value); + next[fieldKey] = s; + return next; + }); + }; + + const removeChip = (fieldKey: string, value: string) => { + setDraft(prev => { + const next = { ...prev }; + const s = new Set(prev[fieldKey]); + s.delete(value); + next[fieldKey] = s; + return next; + }); + }; + + const clearField = (fieldKey: string) => { + setDraft(prev => ({ ...prev, [fieldKey]: new Set() })); + }; + + const clearAll = () => { + const cleared: Record> = {}; + for (const f of fields) cleared[f.key] = new Set(); + setDraft(cleared); + }; + + const handleApply = () => { + const result: Record = {}; + for (const [key, set] of Object.entries(draft)) { + if (set.size > 0) result[key] = Array.from(set); + } + onApply(result); + onClose(); + }; + + const totalSelected = Object.values(draft).reduce((acc, s) => acc + s.size, 0); + + const activeField = fields.find(f => f.key === activeTab); + const filteredOptions = useMemo(() => { + if (!activeField) return []; + const term = (searchTerms[activeTab] || '').toLowerCase(); + const opts = activeField.options; + if (!term) return opts; + return opts.filter(o => { + const displayLabel = activeField.optionLabels?.[o] || o; + return displayLabel.toLowerCase().includes(term); + }); + }, [activeField, activeTab, searchTerms]); + + const accentBorder = `border-[${accentColor}]/30`; + + // Tailwind color map for dynamic classes + const colorMap: Record = { + cyan: { text: 'text-cyan-400', bg: 'bg-cyan-500/10', bgHover: 'hover:bg-cyan-500/15', border: 'border-cyan-500/30', ring: 'ring-cyan-500/50' }, + orange: { text: 'text-orange-400', bg: 'bg-orange-500/10', bgHover: 'hover:bg-orange-500/15', border: 'border-orange-500/30', ring: 'ring-orange-500/50' }, + yellow: { text: 'text-yellow-400', bg: 'bg-yellow-500/10', bgHover: 'hover:bg-yellow-500/15', border: 'border-yellow-500/30', ring: 'ring-yellow-500/50' }, + pink: { text: 'text-pink-400', bg: 'bg-pink-500/10', bgHover: 'hover:bg-pink-500/15', border: 'border-pink-500/30', ring: 'ring-pink-500/50' }, + blue: { text: 'text-blue-400', bg: 'bg-blue-500/10', bgHover: 'hover:bg-blue-500/15', border: 'border-blue-500/30', ring: 'ring-blue-500/50' }, + }; + const c = colorMap[accentColorName] || colorMap.cyan; + + return ( +
{ if (e.target === e.currentTarget) onClose(); }}> + {/* Backdrop */} +
+ + {/* Modal */} +
+ + {/* ── Title Bar (Draggable) ── */} +
+
+ + {icon} + {title} + {totalSelected > 0 && ( + + {totalSelected} SELECTED + + )} +
+ +
+ + {/* ── Tab Bar (for multi-field categories) ── */} + {fields.length > 1 && ( +
+ {fields.map(field => { + const isActive = activeTab === field.key; + const count = draft[field.key]?.size || 0; + return ( + + ); + })} +
+ )} + + {/* ── Selected Chips ── */} + {activeField && draft[activeTab]?.size > 0 && ( +
+ {Array.from(draft[activeTab]).map(val => { + const displayVal = activeField.optionLabels?.[val] || val; + return ( + + {displayVal.length > 28 ? displayVal.slice(0, 28) + '…' : displayVal} + + + ); + })} + +
+ )} + + {/* ── Search Bar ── */} +
+
+ + setSearchTerms(prev => ({ ...prev, [activeTab]: e.target.value }))} + placeholder={`Search ${activeField?.label.toLowerCase() || ''}...`} + className={`w-full bg-black/50 border border-gray-700/70 rounded-lg text-[11px] text-gray-300 pl-8 pr-8 py-2 font-mono tracking-wide focus:outline-none focus:${c.border} focus:ring-1 ${c.ring} placeholder-gray-600 transition-all`} + autoFocus + /> + {searchTerms[activeTab] && ( + + )} +
+
+ + {filteredOptions.length} AVAILABLE + + + {draft[activeTab]?.size || 0} SELECTED + +
+
+ + {/* ── Scrollable Checkbox List ── */} +
+ {filteredOptions.length === 0 ? ( +
+ NO MATCHING RESULTS +
+ ) : ( +
+ {filteredOptions.map((option) => { + const isChecked = draft[activeTab]?.has(option); + return ( + + ); + })} +
+ )} +
+ + {/* ── Footer ── */} +
+ +
+ + +
+
+
+
+
+ ); +} diff --git a/frontend/src/components/CesiumViewer.tsx b/frontend/src/components/CesiumViewer.tsx new file mode 100644 index 0000000..5a3c02a --- /dev/null +++ b/frontend/src/components/CesiumViewer.tsx @@ -0,0 +1,1822 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import * as satellite from 'satellite.js'; + +export default function CesiumViewer({ data, activeLayers, activeFilters, effects, onEntityClick, selectedEntity, flyToLocation, isEavesdropping, onEavesdropClick, onCameraMove }: { data: any, activeLayers: any, activeFilters?: Record, effects: any, onEntityClick?: any, selectedEntity?: any, flyToLocation?: { lat: number, lng: number, ts: number } | null, isEavesdropping?: boolean, onEavesdropClick?: (loc: { lat: number, lng: number }) => void, onCameraMove?: (loc: { lat: number, lng: number }) => void }) { + const cesiumContainer = useRef(null); + const viewerRef = useRef(null); + const flightBillboardsRef = useRef(null); + const flightLabelsRef = useRef(null); + const flightPrimitivesRef = useRef>(new Map()); + const shipDataSourceRef = useRef(null); + const cctvDataSourceRef = useRef(null); + const [cesiumLoaded, setCesiumLoaded] = useState(false); + const [popupPosition, setPopupPosition] = useState<{ x: number, y: number } | null>(null); + + // Fly camera to a specific location when triggered by Find/Locate + useEffect(() => { + if (!flyToLocation || !viewerRef.current) return; + const Cesium = (window as any).Cesium; + if (!Cesium) return; + viewerRef.current.camera.flyTo({ + destination: Cesium.Cartesian3.fromDegrees(flyToLocation.lng, flyToLocation.lat, 50000), + orientation: { + heading: 0, + pitch: Cesium.Math.toRadians(-45), + roll: 0, + }, + duration: 2.0, + }); + }, [flyToLocation]); + + // Poll for the CDN script to finish downloading + useEffect(() => { + const interval = setInterval(() => { + if (typeof window !== "undefined" && (window as any).Cesium) { + // Configure base URL before initialization + (window as any).CESIUM_BASE_URL = "https://cesium.com/downloads/cesiumjs/releases/1.115/Build/Cesium/"; + setCesiumLoaded(true); + clearInterval(interval); + } + }, 100); + return () => clearInterval(interval); + }, []); + + useEffect(() => { + if (!cesiumLoaded || !cesiumContainer.current || viewerRef.current) return; + + const Cesium = (window as any).Cesium; + + // Allow Cesium to use default credentials for its Ion assets if needed (we'll mostly bypass) + // Cesium.Ion.defaultAccessToken = 'YOUR_EXPERIMENTAL_OR_FREE_TOKEN'; + + viewerRef.current = new Cesium.Viewer(cesiumContainer.current, { + animation: false, + baseLayerPicker: false, + fullscreenButton: false, + geocoder: false, + homeButton: false, + infoBox: false, + sceneModePicker: false, + selectionIndicator: false, + timeline: false, + navigationHelpButton: false, + navigationInstructionsInitiallyVisible: false, + scene3DOnly: true, + skyAtmosphere: false, + skyBox: false, + // Automatically render when changes occur + requestRenderMode: false, + }); + + // Remove the default cesium credit banner for tactical purity + const credit = viewerRef.current.bottomContainer; + if (credit) credit.style.display = "none"; + + const scene = viewerRef.current.scene; + scene.globe.baseColor = Cesium.Color.BLACK; + + // High-resolution Satellite layer via Mapbox for a realistic earth + const mapboxToken = "YOUR_MAPBOX_TOKEN_HERE"; + const baseImageryProvider = new Cesium.UrlTemplateImageryProvider({ + // Using satellite-streets-v12 gives us country/state borders baked into the map + url: `https://api.mapbox.com/styles/v1/mapbox/satellite-streets-v12/tiles/256/{z}/{x}/{y}?access_token=${mapboxToken}`, + credit: "" + }); + viewerRef.current.imageryLayers.removeAll(); + viewerRef.current.imageryLayers.addImageryProvider(baseImageryProvider); + + // CartoDB Dark Matter LABELS overlay removed to prevent duplication with Mapbox Streets + + // Google Photorealistic 3D Tiles removed to fix loading errors on localhost + + // Set initial camera view + viewerRef.current.camera.setView({ + destination: Cesium.Cartesian3.fromDegrees(-95.0, 39.0, 20000000.0) + }); + // Add TomTom Traffic Flow Layer (Raster) + const trafficProvider = new Cesium.UrlTemplateImageryProvider({ + url: "https://api.tomtom.com/traffic/map/4/tile/flow/relative/{z}/{x}/{y}.png?key=uLndz1KvLDpwetYRwoiw8wKwk9i23sWG", + credit: "" + }); + viewerRef.current.trafficLayer = viewerRef.current.imageryLayers.addImageryProvider(trafficProvider); + viewerRef.current.trafficLayer.show = false; // default off + + // ── Primitive Collections for Fast Rendering ── + const Cesium2 = (window as any).Cesium; + + const flightBillboards = new Cesium2.BillboardCollection({ disableDepthTestDistance: 1000000.0 }); + const flightLabels = new Cesium2.LabelCollection({ disableDepthTestDistance: 1000000.0 }); + viewerRef.current.scene.primitives.add(flightBillboards); + viewerRef.current.scene.primitives.add(flightLabels); + flightBillboardsRef.current = flightBillboards; + flightLabelsRef.current = flightLabels; + + const shipDS = new Cesium2.CustomDataSource('ships'); + shipDS.clustering.enabled = true; + shipDS.clustering.pixelRange = 40; + shipDS.clustering.minimumClusterSize = 3; + viewerRef.current.dataSources.add(shipDS); + shipDataSourceRef.current = shipDS; + + shipDS.clustering.clusterEvent.addEventListener((clusteredEntities: any[], cluster: any) => { + const count = clusteredEntities.length; + const radius = Math.min(10 + Math.log2(count) * 4, 30); + cluster.billboard.show = false; + cluster.label.show = true; + cluster.label.text = String(count); + cluster.label.font = `bold ${Math.max(10, Math.min(radius, 14))}px monospace`; + cluster.label.fillColor = Cesium2.Color.WHITE; + cluster.label.outlineColor = Cesium2.Color.BLACK; + cluster.label.outlineWidth = 2; + cluster.label.style = Cesium2.LabelStyle.FILL_AND_OUTLINE; + cluster.label.horizontalOrigin = Cesium2.HorizontalOrigin.CENTER; + cluster.label.verticalOrigin = Cesium2.VerticalOrigin.CENTER; + cluster.label.disableDepthTestDistance = 1000000.0; + cluster.point.show = true; + cluster.point.pixelSize = radius; + cluster.point.color = Cesium2.Color.fromCssColorString('rgba(0, 100, 255, 0.7)'); + cluster.point.outlineColor = Cesium2.Color.fromCssColorString('rgba(100, 150, 255, 0.9)'); + cluster.point.outlineWidth = 2; + cluster.point.disableDepthTestDistance = 1000000.0; + }); + + // CCTV clustering + const cctvDS = new Cesium2.CustomDataSource('cctv'); + cctvDS.clustering.enabled = true; + cctvDS.clustering.pixelRange = 50; + cctvDS.clustering.minimumClusterSize = 5; + viewerRef.current.dataSources.add(cctvDS); + cctvDataSourceRef.current = cctvDS; + + cctvDS.clustering.clusterEvent.addEventListener((clusteredEntities: any[], cluster: any) => { + const count = clusteredEntities.length; + const radius = Math.min(10 + Math.log2(count) * 4, 35); + cluster.billboard.show = false; + cluster.label.show = true; + cluster.label.text = String(count); + cluster.label.font = `bold ${Math.max(9, Math.min(radius, 14))}px monospace`; + cluster.label.fillColor = Cesium2.Color.WHITE; + cluster.label.outlineColor = Cesium2.Color.BLACK; + cluster.label.outlineWidth = 2; + cluster.label.style = Cesium2.LabelStyle.FILL_AND_OUTLINE; + cluster.label.horizontalOrigin = Cesium2.HorizontalOrigin.CENTER; + cluster.label.verticalOrigin = Cesium2.VerticalOrigin.CENTER; + cluster.label.disableDepthTestDistance = 1000000.0; + cluster.point.show = true; + cluster.point.pixelSize = radius; + cluster.point.color = Cesium2.Color.fromCssColorString('rgba(0, 200, 50, 0.7)'); + cluster.point.outlineColor = Cesium2.Color.fromCssColorString('rgba(100, 255, 100, 0.9)'); + cluster.point.outlineWidth = 2; + cluster.point.disableDepthTestDistance = 1000000.0; + }); + + // Lighting and Bloom Settings + scene.globe.enableLighting = true; // Provides dynamic day/night terminator line + + if (scene.postProcessStages) { + const bloom = scene.postProcessStages.bloom; + // Disable bloom by default to prevent washed out continents + bloom.enabled = false; + bloom.uniforms.glowOnly = false; + bloom.uniforms.contrast = 120; + bloom.uniforms.brightness = -0.1; + bloom.uniforms.delta = 0.9; + bloom.uniforms.sigma = 1.5; + bloom.uniforms.stepSize = 0.5; + + const nvgShader = ` + uniform sampler2D colorTexture; + in vec2 v_textureCoordinates; + void main() { + vec4 color = texture(colorTexture, v_textureCoordinates); + float lum = dot(color.rgb, vec3(0.299, 0.587, 0.114)); + vec3 nvg = vec3(0.0, lum * 2.0, 0.0); + float dist = distance(v_textureCoordinates, vec2(0.5)); + nvg *= smoothstep(0.8, 0.2, dist); + out_FragColor = vec4(nvg, 1.0); + } + `; + const flirShader = ` + uniform sampler2D colorTexture; + in vec2 v_textureCoordinates; + void main() { + vec4 color = texture(colorTexture, v_textureCoordinates); + float lum = dot(color.rgb, vec3(0.299, 0.587, 0.114)); + vec3 col; + if (lum < 0.25) col = mix(vec3(0, 0, 1), vec3(0, 1, 1), lum * 4.0); + else if (lum < 0.5) col = mix(vec3(0, 1, 1), vec3(0, 1, 0), (lum - 0.25) * 4.0); + else if (lum < 0.75) col = mix(vec3(0, 1, 0), vec3(1, 1, 0), (lum - 0.5) * 4.0); + else col = mix(vec3(1, 1, 0), vec3(1, 0, 0), (lum - 0.75) * 4.0); + out_FragColor = vec4(col, 1.0); + } + `; + const crtShader = ` + uniform sampler2D colorTexture; + in vec2 v_textureCoordinates; + void main() { + vec2 uv = v_textureCoordinates; + vec4 color = texture(colorTexture, uv); + color.rgb -= sin(uv.y * 800.0) * 0.05; + float r = texture(colorTexture, uv + vec2(0.002, 0.0)).r; + float b = texture(colorTexture, uv - vec2(0.002, 0.0)).b; + out_FragColor = vec4(r, color.g, b, 1.0); + } + `; + + viewerRef.current.customStages = { + NVG: new Cesium.PostProcessStage({ fragmentShader: nvgShader }), + FLIR: new Cesium.PostProcessStage({ fragmentShader: flirShader }), + CRT: new Cesium.PostProcessStage({ fragmentShader: crtShader }) + }; + scene.postProcessStages.add(viewerRef.current.customStages.NVG); + scene.postProcessStages.add(viewerRef.current.customStages.FLIR); + scene.postProcessStages.add(viewerRef.current.customStages.CRT); + viewerRef.current.customStages.NVG.enabled = false; + viewerRef.current.customStages.FLIR.enabled = false; + viewerRef.current.customStages.CRT.enabled = false; + } + + return () => { + // Cleanup on unmount (often skipped in dev hot-reload but good practice) + if (viewerRef.current && typeof window !== "undefined" && !(window as any).nextHotReload) { + viewerRef.current.destroy(); + viewerRef.current = null; + } + }; + }, [cesiumLoaded]); + + // Setup input handler for picking + useEffect(() => { + if (!viewerRef.current) return; + const Cesium = (window as any).Cesium; + const viewer = viewerRef.current; + + const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); + handler.setInputAction((movement: any) => { + // Eavesdrop Mode: Intercept clicks on the globe to get Lat/Lng instead of picking entities + if (isEavesdropping && onEavesdropClick) { + const ray = viewer.camera.getPickRay(movement.position); + const earthPosition = viewer.scene.globe.pick(ray, viewer.scene); + if (earthPosition) { + const cartographic = Cesium.Cartographic.fromCartesian(earthPosition); + const lng = Cesium.Math.toDegrees(cartographic.longitude); + const lat = Cesium.Math.toDegrees(cartographic.latitude); + onEavesdropClick({ lat, lng }); + } + return; // Suppress normal entity selection during Eavesdrop + } + + const pickedObject = viewer.scene.pick(movement.position); + if (Cesium.defined(pickedObject) && pickedObject.id) { + const entityId = pickedObject.id.id || pickedObject.id; + if (typeof entityId === 'string') { + if (entityId.startsWith('news-')) { + const idx = parseInt(entityId.split('-')[1]); + onEntityClick?.({ type: 'news', id: idx, entityId: entityId }); + } else if (entityId.startsWith('gdelt-')) { + const idx = parseInt(entityId.split('-')[1]); + onEntityClick?.({ type: 'gdelt', id: idx, entityId: entityId }); + } else if (entityId.startsWith('private-jet-')) { + const icao = entityId.replace('private-jet-', ''); + const flight = data?.private_jets?.find((f: any) => (f.icao24 || f.registration || f.callsign) === icao); + if (flight) { + onEntityClick?.({ type: 'private_jet', id: flight.icao24 || icao, callsign: flight.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('private-flight-')) { + const icao = entityId.replace('private-flight-', ''); + const flight = data?.private_flights?.find((f: any) => (f.icao24 || f.registration || f.callsign) === icao); + if (flight) { + onEntityClick?.({ type: 'private_flight', id: flight.icao24 || icao, callsign: flight.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('flight-')) { + const icao = entityId.replace('flight-', ''); + const flight = data?.commercial_flights?.find((f: any) => (f.icao24 || f.registration || f.callsign) === icao); + if (flight) { + onEntityClick?.({ type: 'flight', id: flight.icao24 || icao, callsign: flight.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('mil-flight-')) { + const icao = entityId.replace('mil-flight-', ''); + const flight = data?.military_flights?.find((f: any) => (f.icao24 || f.registration || f.callsign) === icao); + if (flight) { + onEntityClick?.({ type: 'military_flight', id: flight.icao24 || icao, callsign: flight.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('tracked-')) { + const icao = entityId.replace('tracked-', ''); + const flight = data?.tracked_flights?.find((f: any) => (f.icao24 || f.registration || f.callsign) === icao); + if (flight) { + onEntityClick?.({ type: 'tracked_flight', id: flight.icao24 || icao, callsign: flight.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('uav-entity-')) { + const uavIcao = entityId.replace('uav-entity-', ''); + const uav = data?.uavs?.find((u: any) => u.icao24 === uavIcao); + if (uav) { + onEntityClick?.({ type: 'uav', id: uav.icao24 || uavIcao, callsign: uav.callsign, entityId: entityId }); + } + } else if (entityId.startsWith('ship-')) { + const shipKey = entityId.replace('ship-', ''); + const ship = data?.ships?.find((s: any) => String(s.mmsi) === shipKey); + if (ship) { + onEntityClick?.({ type: 'ship', id: ship.mmsi, name: ship.name, entityId: entityId }); + } + } else if (entityId.startsWith('cctv-')) { + const entity = viewer.entities.getById(entityId); + // The CCTV ID is the remaining part + const cctvId = entityId.replace('cctv-', ''); + // Find the camera in data + const cam = data?.cctv?.find((c: any) => String(c.id) === cctvId); + onEntityClick?.({ type: 'cctv', id: cctvId, name: cam?.name || cam?.direction_facing, media_url: cam?.media_url, entityId: entityId }); + } else if (entityId.startsWith('satellite-')) { + const satId = entityId.replace('satellite-', ''); + const sat = data?.satellites?.find((c: any) => String(c.id) === satId); + onEntityClick?.({ type: 'satellite', id: satId, name: sat?.name, tle1: sat?.tle1, tle2: sat?.tle2, entityId: entityId }); + } else if (entityId.startsWith('apt-')) { + const aptId = entityId.replace('apt-', ''); + const apt = data?.airports?.find((a: any) => String(a.id) === aptId); + onEntityClick?.({ type: 'airport', id: aptId, name: apt?.name, iata: apt?.iata, entityId: entityId }); + } else if (entityId.startsWith('gdelt-')) { + const idx = parseInt(entityId.replace('gdelt-', '')); + if (!isNaN(idx) && data?.gdelt?.[idx]) { + onEntityClick?.({ type: 'gdelt', id: idx, entityId: entityId }); + } + } else { + // Click on empty space or unhandled entity + onEntityClick?.(null); + } + } + } else { + onEntityClick?.(null); + } + }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + + return () => { + handler.destroy(); + }; + }, [cesiumLoaded, data, onEntityClick, isEavesdropping, onEavesdropClick]); + + // Effect to track the selected entity's screen position + useEffect(() => { + if (!viewerRef.current || !selectedEntity || !selectedEntity.entityId) { + setPopupPosition(null); + return; + } + + const viewer = viewerRef.current; + const Cesium = (window as any).Cesium; + + const updatePopupPosition = () => { + let position: any = null; + + // 1. Search viewer.entities first + let entity = viewer.entities.getById(selectedEntity.entityId); + if (!entity && cctvDataSourceRef.current) entity = cctvDataSourceRef.current.entities.getById(selectedEntity.entityId); + if (!entity && shipDataSourceRef.current) entity = shipDataSourceRef.current.entities.getById(selectedEntity.entityId); + + if (entity && entity.position) { + const time = viewer.clock.currentTime; + position = entity.position.getValue(time); + } + + // 2. Search Primitives + if (!position && selectedEntity.entityId) { + const isFlight = selectedEntity.entityId.startsWith('flight-') || selectedEntity.entityId.startsWith('private-flight-') || selectedEntity.entityId.startsWith('private-jet-') || selectedEntity.entityId.startsWith('mil-flight-') || selectedEntity.entityId.startsWith('tracked-'); + if (isFlight) { + const uid = selectedEntity.entityId.split('-').slice(1).join('-'); // Handles 'flight-icao', 'private-flight-icao', etc. + position = flightPrimitivesRef.current.get(uid)?.billboard?.position; + } + } + + if (position) { + const canvasPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, position); + if (canvasPosition) { + setPopupPosition({ x: canvasPosition.x, y: canvasPosition.y }); + return; + } + } + + setPopupPosition(null); + }; + + let lastMoveReport = 0; + const updateCameraCenter = () => { + if (!onCameraMove) return; + const now = Date.now(); + if (now - lastMoveReport < 1000) return; // Throttle to 1s + + // Find center of screen + const canvas = viewer.scene.canvas; + const center = new Cesium.Cartesian2(canvas.clientWidth / 2, canvas.clientHeight / 2); + const ray = viewer.camera.getPickRay(center); + const earthPosition = viewer.scene.globe.pick(ray, viewer.scene); + + if (earthPosition) { + const cartographic = Cesium.Cartographic.fromCartesian(earthPosition); + const lng = Cesium.Math.toDegrees(cartographic.longitude); + const lat = Cesium.Math.toDegrees(cartographic.latitude); + onCameraMove({ lat, lng }); + lastMoveReport = now; + } + }; + + // Initial update and attach to render loop + updatePopupPosition(); + viewer.scene.preRender.addEventListener(updatePopupPosition); + viewer.camera.changed.addEventListener(updateCameraCenter); + + return () => { + viewer.scene.preRender.removeEventListener(updatePopupPosition); + viewer.camera.changed.removeEventListener(updateCameraCenter); + }; + }, [selectedEntity, onCameraMove]); + + // Effect to update data entities and effects + useEffect(() => { + if (!viewerRef.current || !data) return; + const Cesium = (window as any).Cesium; + const viewer = viewerRef.current; + const occluder = new Cesium.EllipsoidalOccluder(Cesium.Ellipsoid.WGS84, viewer.camera.positionWC); + const cameraHeight = viewer.camera.positionCartographic.height; + + // Instead of removing all, we should manage entities by ID for performance + // For now, wipe and redraw as prototyping is small relative to Cesium engine + // Handle Entities gracefully to prevent stutter + viewer.entities.suspendEvents(); + const shipDS = shipDataSourceRef.current; + const cctvDS = cctvDataSourceRef.current; + if (shipDS) shipDS.entities.suspendEvents(); + if (cctvDS) cctvDS.entities.suspendEvents(); + + const touchedIds = new Set(); + const touchedCctvIds = new Set(); + const touchedShipIds = new Set(); // Added for ship cleanup + + const addOrUpdate = (props: any) => { + if (!props.id) props.id = "gen-" + Math.random().toString(36).substr(2, 9); + touchedIds.add(props.id); + const existing = viewer.entities.getById(props.id); + if (existing) { + if (props.position) existing.position = props.position; + if (props.show !== undefined) { + existing.show = props.show; + } else { + existing.show = true; + } + + if (props.label && existing.label) { + existing.label.text = props.label.text; + if (props.label.show !== undefined) { + existing.label.show = props.label.show; + } else { + existing.label.show = true; + } + } + + if (props.billboard && existing.billboard) { + existing.billboard.rotation = props.billboard.rotation; + existing.billboard.image = props.billboard.image; + } + if (props.polyline && existing.polyline) { + existing.polyline.positions = props.polyline.positions; + } + + if (props.point && existing.point) { + if (props.point.show !== undefined) existing.point.show = props.point.show; + else existing.point.show = true; + if (props.point.distanceDisplayCondition !== undefined) existing.point.distanceDisplayCondition = props.point.distanceDisplayCondition; + } + + if (props.ellipse && existing.ellipse) { + if (props.ellipse.show !== undefined) existing.ellipse.show = props.ellipse.show; + else existing.ellipse.show = true; + if (props.ellipse.distanceDisplayCondition !== undefined) existing.ellipse.distanceDisplayCondition = props.ellipse.distanceDisplayCondition; + } + } else { + viewer.entities.add(props); + } + }; + + const updatePrimitive = (uid: string, props: any, mapRef: Map, billboardsRef: any, labelsRef: any) => { + let prims = mapRef.get(uid); + if (!props.show) { + if (prims) { + prims.billboard.show = false; + prims.label.show = false; + } + return; + } + + if (!prims) { + const b = billboardsRef.add({ ...props.billboard, position: props.position, id: props.id }); + const l = labelsRef.add({ ...props.label, position: props.position, id: props.id }); + prims = { billboard: b, label: l }; + mapRef.set(uid, prims); + } + + prims.billboard.position = props.position; + prims.billboard.show = props.show; + if (props.billboard.image !== undefined) prims.billboard.image = props.billboard.image; + if (props.billboard.rotation !== undefined) prims.billboard.rotation = props.billboard.rotation; + + prims.label.position = props.position; + prims.label.show = props.label.show !== false ? props.show : false; + if (props.label.text !== undefined) prims.label.text = props.label.text; + }; + + const svgToBase64 = (svg: string) => `data:image/svg+xml;base64,${btoa(svg)}`; + const svgPlaneCyan = svgToBase64(``); + const svgPlaneYellow = svgToBase64(``); + const svgPlaneOrange = svgToBase64(``); + const svgPlanePurple = svgToBase64(``); + + const svgFighter = svgToBase64(``); + const svgHeli = svgToBase64(``); + const svgHeliCyan = svgToBase64(``); + const svgHeliOrange = svgToBase64(``); + const svgHeliPurple = svgToBase64(``); + const svgTanker = svgToBase64(``); + const svgRecon = svgToBase64(``); + + const milIconMap: any = { + 'fighter': svgFighter, + 'heli': svgHeli, + 'tanker': svgTanker, + 'cargo': svgPlaneYellow, + 'recon': svgRecon, + 'default': svgPlaneYellow + }; + + // Tracked aircraft SVGs (Plane-Alert DB) + const svgPlanePink = svgToBase64(``); + const svgPlaneAlertRed = svgToBase64(``); + const svgPlaneDarkBlue = svgToBase64(``); + const svgPlaneWhiteAlert = svgToBase64(``); + + const svgHeliPink = svgToBase64(``); + const svgHeliAlertRed = svgToBase64(``); + const svgHeliDarkBlue = svgToBase64(``); + const svgHeliWhiteAlert = svgToBase64(``); + + const trackedPlaneIcons: any = { + 'pink': svgPlanePink, 'red': svgPlaneAlertRed, 'darkblue': svgPlaneDarkBlue, 'white': svgPlaneWhiteAlert + }; + const trackedHeliIcons: any = { + 'pink': svgHeliPink, 'red': svgHeliAlertRed, 'darkblue': svgHeliDarkBlue, 'white': svgHeliWhiteAlert + }; + const trackedColorMap: any = { + 'pink': Cesium.Color.fromCssColorString('#FF1493'), + 'red': Cesium.Color.fromCssColorString('#FF2020'), + 'darkblue': Cesium.Color.fromCssColorString('#1A3A8A'), + 'white': Cesium.Color.WHITE + }; + + // Parked/landed aircraft SVGs (dark/black) + const svgPlaneBlack = svgToBase64(``); + const svgHeliBlack = svgToBase64(``); + const COLOR_BLACK = Cesium.Color.fromCssColorString('#222222'); + + // Detect parked/landed aircraft: altitude near 0 AND low ground speed + const isOnGround = (f: any) => { + const alt = f.alt || 0; // already in meters + const spd = f.speed_knots || 0; + return alt <= 500 && spd < 30; + }; + + // Render accumulated flight trail as a polyline + const renderTrail = (f: any, uid: string, trailColor: any, show: boolean) => { + const trail = f.trail; + if (!trail || trail.length < 2) return; + + const trailId = `trail-${uid}`; + // Build positions array from trail points [lat, lng, alt, ts] + const positions = trail.map((p: number[]) => + Cesium.Cartesian3.fromDegrees(p[1], p[0], Math.max(p[2] || 0, 100)) + ); + // Add current position as final point + positions.push(Cesium.Cartesian3.fromDegrees(f.lng, f.lat, Math.max(f.alt || 0, 100))); + + addOrUpdate({ + id: trailId, + show: show, + polyline: { + positions: positions, + width: 2, + material: new Cesium.PolylineGlowMaterialProperty({ + glowPower: 0.15, + color: trailColor + }), + disableDepthTestDistance: 1000000.0 + } + }); + }; + + // Filter matching helpers (multi-select: OR logic across selected values) + const filters = activeFilters || {}; + const matchesAny = (value: string, selectedValues: string[]) => { + if (!selectedValues || selectedValues.length === 0) return true; + const v = (value || '').toLowerCase(); + return selectedValues.some(sv => v.includes(sv.toLowerCase())); + }; + const matchesCommercialFilter = (f: any) => { + if (filters.commercial_departure?.length) { + if (!matchesAny(f.origin_name, filters.commercial_departure)) return false; + } + if (filters.commercial_arrival?.length) { + if (!matchesAny(f.dest_name, filters.commercial_arrival)) return false; + } + if (filters.commercial_airline?.length) { + if (!matchesAny(f.airline_code, filters.commercial_airline)) return false; + } + return true; + }; + const matchesPrivateFilter = (f: any) => { + if (filters.private_callsign?.length) { + const cs = (f.callsign || '').toLowerCase(); + const reg = (f.registration || '').toLowerCase(); + if (!filters.private_callsign.some(sv => { + const q = sv.toLowerCase(); + return cs.includes(q) || reg.includes(q); + })) return false; + } + if (filters.private_aircraft_type?.length) { + if (!matchesAny(f.model, filters.private_aircraft_type)) return false; + } + return true; + }; + const matchesMilitaryFilter = (f: any) => { + if (filters.military_country?.length) { + const reg = (f.registration || '').toLowerCase(); + const country = (f.country || '').toLowerCase(); + if (!filters.military_country.some(sv => { + const q = sv.toLowerCase(); + return reg.includes(q) || country.includes(q); + })) return false; + } + if (filters.military_aircraft_type?.length) { + if (!matchesAny(f.military_type, filters.military_aircraft_type)) return false; + } + return true; + }; + const matchesTrackedFilter = (f: any) => { + if (filters.tracked_category?.length) { + if (!matchesAny(f.alert_category, filters.tracked_category)) return false; + } + if (filters.tracked_owner?.length) { + const op = (f.alert_operator || '').toLowerCase(); + const t1 = (f.alert_tag1 || '').toLowerCase(); + const t2 = (f.alert_tag2 || '').toLowerCase(); + const t3 = (f.alert_tag3 || '').toLowerCase(); + const cs = (f.callsign || '').toLowerCase(); + if (!filters.tracked_owner.some(sv => { + const q = sv.toLowerCase(); + return op.includes(q) || t1.includes(q) || t2.includes(q) || t3.includes(q) || cs.includes(q); + })) return false; + } + return true; + }; + const matchesShipFilter = (f: any) => { + if (filters.ship_name?.length) { + if (!matchesAny(f.name, filters.ship_name)) return false; + } + if (filters.ship_type?.length) { + if (!matchesAny(f.type, filters.ship_type)) return false; + } + return true; + }; + + // ── Cross-category filter hiding ── + // When ANY air filter is active, categories WITHOUT their own filters should hide. + // This ensures filtering Lufthansa hides all private/military/tracked unless they also have filters. + const hasCommercialFilter = !!(filters.commercial_departure?.length || filters.commercial_arrival?.length || filters.commercial_airline?.length); + const hasPrivateFilter = !!(filters.private_callsign?.length || filters.private_aircraft_type?.length); + const hasMilitaryFilter = !!(filters.military_country?.length || filters.military_aircraft_type?.length); + const hasTrackedFilter = !!(filters.tracked_category?.length || filters.tracked_owner?.length); + const hasShipFilter = !!(filters.ship_name?.length || filters.ship_type?.length); + const hasAnyAirFilter = hasCommercialFilter || hasPrivateFilter || hasMilitaryFilter || hasTrackedFilter; + const hasAnyFilter = hasAnyAirFilter || hasShipFilter; + const svgDrone = svgToBase64(``); + const svgShipGray = svgToBase64(``); + const svgShipRed = svgToBase64(``); + const svgShipYellow = svgToBase64(``); + const svgShipBlue = svgToBase64(``); + const svgShipWhite = svgToBase64(``); + const svgCarrier = svgToBase64(``); + const svgCctv = svgToBase64(``); + const svgWarning = svgToBase64(``); + + // Apply Post-Process Effects + if (viewer.scene.postProcessStages) { + viewer.scene.postProcessStages.bloom.enabled = effects?.bloom ?? true; + if (viewer.customStages) { + viewer.customStages.NVG.enabled = effects?.style === 'NVG'; + viewer.customStages.FLIR.enabled = effects?.style === 'FLIR'; + viewer.customStages.CRT.enabled = effects?.style === 'CRT'; + } + } + + // Apply Traffic Layer visibility + if (viewer.trafficLayer) { + viewer.trafficLayer.show = activeLayers?.traffic !== false; + } + + // Process DeepStateMap Ukraine Frontlines (GeoJSON parsing) + const frontlineId = "deepstate-frontline"; + if (data.frontlines && activeLayers?.ukraine_frontline !== false) { + // Check if we already loaded it so we don't spam the Cesium entity system with huge polygons + if (!viewer.dataSources.getByName(frontlineId).length) { + // GeoJSON processing + Cesium.GeoJsonDataSource.load(data.frontlines, { + stroke: Cesium.Color.RED, + fill: Cesium.Color.RED.withAlpha(0.2), + strokeWidth: 2 + }).then((dataSource: any) => { + dataSource.name = frontlineId; + viewer.dataSources.add(dataSource); + + const entities = dataSource.entities.values; + for (let i = 0; i < entities.length; i++) { + const entity = entities[i]; + const status = entity.properties?.status?.getValue(); // 1=Liberated, 2=Occupied, 3=Contested (approximation) + let polyColor = Cesium.Color.RED.withAlpha(0.3); // Default occupied + let outlineColor = Cesium.Color.RED; + + if (status === 1) { + // Liberated + polyColor = Cesium.Color.GREEN.withAlpha(0.2); + outlineColor = Cesium.Color.GREEN; + } else if (status === 3) { + // Contested + polyColor = Cesium.Color.ORANGE.withAlpha(0.2); + outlineColor = Cesium.Color.ORANGE; + } + + if (entity.polygon) { + entity.polygon.material = polyColor; + entity.polygon.outlineColor = outlineColor; + entity.polygon.outlineWidth = 2; + } + } + }); + } else { + // Make sure it's visible if already loaded + const ds = viewer.dataSources.getByName(frontlineId)[0]; + if (ds && !ds.show) ds.show = true; + } + } else { + // Hide it if turned off + const ds = viewer.dataSources.getByName(frontlineId)[0]; + if (ds && ds.show) ds.show = false; + } + + // Process GDELT Global Military Incidents + if (data.gdelt && activeLayers?.global_incidents !== false) { + data.gdelt.forEach((incident: any, idx: number) => { + const geom = incident.geometry; + if (!geom || geom.type !== 'Point' || !geom.coordinates) return; + + const lng = geom.coordinates[0]; + const lat = geom.coordinates[1]; + const id = `gdelt-${idx}`; + const isSelected = selectedEntity?.id === id; + + addOrUpdate({ + id: id, + position: Cesium.Cartesian3.fromDegrees(lng, lat, 0), + point: { + pixelSize: 8, + color: Cesium.Color.ORANGE, + outlineColor: Cesium.Color.RED, + outlineWidth: 2, + disableDepthTestDistance: 4000000.0, + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 5000000.0) + }, + ellipse: { + semiMinorAxis: 15000, + semiMajorAxis: 15000, + material: Cesium.Color.RED.withAlpha(0.3), + outline: true, + outlineColor: Cesium.Color.ORANGE, + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 5000000.0) + } + }); + }); + } + + // Process News Alerts (Risk Coordinates) + if (data.news) { + data.news.forEach((n: any, idx: number) => { + if (n.coords && n.coords.length === 2) { + let riskColorHex = '#22c55e'; // Green (1-3) + if (n.risk_score >= 9) riskColorHex = '#ef4444'; // Red (9-10) + else if (n.risk_score >= 7) riskColorHex = '#f97316'; // Orange (7-8) + else if (n.risk_score >= 4) riskColorHex = '#eab308'; // Yellow (4-6) + const currentPos = Cesium.Cartesian3.fromDegrees(n.coords[1], n.coords[0], 0); + // Cull if on the other side of the planet + if (!occluder.isPointVisible(currentPos)) return; + + const color = Cesium.Color.fromCssColorString(riskColorHex); + + addOrUpdate({ + id: `news-${idx}`, + position: currentPos, + point: { + pixelSize: n.risk_score >= 8 ? 16 : 8, + color: Cesium.Color.fromCssColorString('rgba(0,0,0,0)'), + outlineColor: color, + outlineWidth: 3 + }, + ellipse: { + semiMinorAxis: n.risk_score * 40000, + semiMajorAxis: n.risk_score * 40000, + material: color.withAlpha(0.2), + outline: true, + outlineColor: color + }, + label: { + text: n.cluster_count > 1 ? `!! ALERT LVL ${n.risk_score} !!\n${n.title.substring(0, 30)}...\n[+${n.cluster_count - 1} MORE]` : `!! ALERT LVL ${n.risk_score}!!\n${n.title.substring(0, 30)}...`, + font: 'bold 10px monospace', + fillColor: color, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -16), + // Pushes it forward from planes, but not through the earth + eyeOffset: new Cesium.Cartesian3(0, 0, -100000), + disableDepthTestDistance: Number.POSITIVE_INFINITY // Always overlays over planes now that backface culling handles planet occlusion + } + }); + } + }); + } + + // Process Commercial Flights (teal) + if (data.commercial_flights && activeLayers?.flights !== false) { + const anyFlightSelected = selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet'; + const selectedFlightIdx = selectedEntity?.type === 'flight' ? String(selectedEntity.entityId).replace('flight-', '') : null; + const seenIds = new Set(); + + data.commercial_flights.forEach((f: any, idx: number) => { + if (hasAnyAirFilter && !hasCommercialFilter) return; + if (!matchesCommercialFilter(f)) return; + const uid = f.icao24 || f.registration || f.callsign || `unk-${idx}`; + const currentPos = Cesium.Cartesian3.fromDegrees(f.lng, f.lat, f.alt || 5000); + + // Culling: Skip rendering heavily if planes are behind the planet + if (!occluder.isPointVisible(currentPos)) return; + + const id = `flight-${uid}`; + const isSelected = selectedFlightIdx === String(uid); + const showEntity = !anyFlightSelected || isSelected; + seenIds.add(uid); + + updatePrimitive(uid, { + id: id, + show: showEntity, + position: currentPos, + billboard: { + image: isOnGround(f) ? (f.aircraft_category === 'heli' ? svgHeliBlack : svgPlaneBlack) : (f.aircraft_category === 'heli' ? svgHeliCyan : svgPlaneCyan), + width: 14, height: 14, + rotation: Cesium.Math.toRadians(-f.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + show: isSelected, + text: `[${f.callsign || 'FLT'} ]`, + font: '10px monospace', + fillColor: Cesium.Color.CYAN, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -12), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 10000000.0), + disableDepthTestDistance: 1000000.0 + } + }, flightPrimitivesRef.current, flightBillboardsRef.current, flightLabelsRef.current); + + // Draw accumulated trail for unrouted flights ONLY if selected to avoid crashing the 16-bit WebGL array limits + if (isSelected) renderTrail(f, uid, Cesium.Color.CYAN.withAlpha(0.5), isSelected); + }); + + // Cull disappeared flights + for (const [uid, prims] of Array.from(flightPrimitivesRef.current.entries())) { + if (!seenIds.has(uid) && prims.billboard.id.startsWith('flight-')) { + flightBillboardsRef.current.remove(prims.billboard); + flightLabelsRef.current.remove(prims.label); + flightPrimitivesRef.current.delete(uid); + } + } + } else if (flightPrimitivesRef.current.size > 0) { + flightBillboardsRef.current.removeAll(); + flightLabelsRef.current.removeAll(); + flightPrimitivesRef.current.clear(); + } + + // Process Private Flights (orange) + if (data.private_flights && activeLayers?.private !== false) { + const now = Cesium.JulianDate.now(); + const future = Cesium.JulianDate.addSeconds(now, 30, new Cesium.JulianDate()); + + const anyFlightSelected = selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet'; + const selectedPrivateIdx = selectedEntity?.type === 'private_flight' ? String(selectedEntity.entityId).replace('private-flight-', '') : null; + const seenIds = new Set(); + + const orangeColor = Cesium.Color.fromCssColorString('#FF8C00'); + + data.private_flights.forEach((f: any, idx: number) => { + if (hasAnyAirFilter && !hasPrivateFilter) return; + if (!matchesPrivateFilter(f)) return; + const uid = f.icao24 || f.registration || f.callsign || `unk-${idx}`; + const currentPos = Cesium.Cartesian3.fromDegrees(f.lng, f.lat, f.alt || 3000); + if (!occluder.isPointVisible(currentPos)) return; + + const id = `private-flight-${uid}`; + const isSelected = selectedPrivateIdx === String(uid); + const showEntity = !anyFlightSelected || isSelected; + seenIds.add(uid); + + updatePrimitive(uid, { + id: id, + show: showEntity, + position: currentPos, + billboard: { + image: isOnGround(f) ? (f.aircraft_category === 'heli' ? svgHeliBlack : svgPlaneBlack) + : f.aircraft_category === 'heli' ? svgHeliOrange + : svgPlaneOrange, + width: 12, height: 12, + rotation: Cesium.Math.toRadians(-f.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + show: isSelected, + text: `[${f.callsign || 'PVT'} ]`, + font: '10px monospace', + fillColor: orangeColor, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -12), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 10000000.0), + disableDepthTestDistance: 1000000.0 + } + }, flightPrimitivesRef.current, flightBillboardsRef.current, flightLabelsRef.current); + if (isSelected) renderTrail(f, uid, Cesium.Color.fromCssColorString('#FF8C00').withAlpha(0.5), isSelected); + }); + // Cull disappeared flights + for (const [uid, prims] of Array.from(flightPrimitivesRef.current.entries())) { + if (!seenIds.has(uid) && prims.billboard.id.startsWith('private-flight-')) { // Only remove if it's a private flight and not seen + flightBillboardsRef.current.remove(prims.billboard); + flightLabelsRef.current.remove(prims.label); + flightPrimitivesRef.current.delete(uid); + } + } + } + + // Process Private Jets (purple) + if (data.private_jets && activeLayers?.jets !== false) { + const now = Cesium.JulianDate.now(); + const future = Cesium.JulianDate.addSeconds(now, 30, new Cesium.JulianDate()); + + const anyFlightSelected = selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet'; + const selectedJetIdx = selectedEntity?.type === 'private_jet' ? String(selectedEntity.entityId).replace('private-jet-', '') : null; + const seenIds = new Set(); + + const purpleColor = Cesium.Color.fromCssColorString('#9B59B6'); + + data.private_jets.forEach((f: any, idx: number) => { + if (hasAnyAirFilter && !hasPrivateFilter) return; + if (!matchesPrivateFilter(f)) return; + const uid = f.icao24 || f.registration || f.callsign || `unk-${idx}`; + const currentPos = Cesium.Cartesian3.fromDegrees(f.lng, f.lat, f.alt || 8000); + if (!occluder.isPointVisible(currentPos)) return; + + const id = `private-jet-${uid}`; + const isSelected = selectedJetIdx === String(uid); + const showEntity = !anyFlightSelected || isSelected; + seenIds.add(uid); + + updatePrimitive(uid, { + id: id, + show: showEntity, + position: currentPos, + billboard: { + image: isOnGround(f) ? (f.aircraft_category === 'heli' ? svgHeliBlack : svgPlaneBlack) + : f.aircraft_category === 'heli' ? svgHeliPurple + : svgPlanePurple, + width: 14, height: 14, + rotation: Cesium.Math.toRadians(-f.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + show: isSelected, + text: `[${f.callsign || 'JET'} ]`, + font: '10px monospace', + fillColor: purpleColor, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -12), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 10000000.0), + disableDepthTestDistance: 1000000.0 + } + }, flightPrimitivesRef.current, flightBillboardsRef.current, flightLabelsRef.current); + if (isSelected) renderTrail(f, uid, Cesium.Color.fromCssColorString('#9B59B6').withAlpha(0.5), isSelected); + }); + // Cull disappeared flights + for (const [uid, prims] of Array.from(flightPrimitivesRef.current.entries())) { + if (!seenIds.has(uid) && prims.billboard.id.startsWith('private-jet-')) { // Only remove if it's a private jet and not seen + flightBillboardsRef.current.remove(prims.billboard); + flightLabelsRef.current.remove(prims.label); + flightPrimitivesRef.current.delete(uid); + } + } + } + + // Process Military Flights + if (data.military_flights && activeLayers?.military !== false) { + const now = Cesium.JulianDate.now(); + const future = Cesium.JulianDate.addSeconds(now, 30, new Cesium.JulianDate()); + + const anyFlightSelected = selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight'; + const selectedMilFlightIdx = selectedEntity?.type === 'military_flight' ? String(selectedEntity.id) : null; + const seenIds = new Set(); + + data.military_flights.forEach((f: any, idx: number) => { + if (hasAnyAirFilter && !hasMilitaryFilter) return; + if (!matchesMilitaryFilter(f)) return; + const uid = f.icao24 || f.registration || f.callsign || `unk-${idx}`; + const startPos = Cesium.Cartesian3.fromDegrees(f.lng, f.lat, f.alt || 8000); + if (!occluder.isPointVisible(startPos)) return; + + const id = `mil-flight-${uid}`; + const isSelected = selectedMilFlightIdx === String(idx); + const showEntity = !anyFlightSelected || isSelected; + seenIds.add(uid); + + let positionProp = viewer.entities.getById(id)?.position; + + if (!positionProp || !(positionProp instanceof Cesium.SampledPositionProperty)) { + positionProp = new Cesium.SampledPositionProperty(); + positionProp.forwardExtrapolationType = Cesium.ExtrapolationType.EXTRAPOLATE; + positionProp.backwardExtrapolationType = Cesium.ExtrapolationType.HOLD; + } + + (positionProp as any).addSample(now, startPos); + + // Use actual ground speed from ADS-B (knots → m/s) or fallback + const speedMps = f.speed_knots ? f.speed_knots * 0.514444 : 400; + const distanceMeters = speedMps * 30; + + const R = 6371e3; + const lat1 = f.lat * Math.PI / 180; + const lon1 = f.lng * Math.PI / 180; + const brng = f.heading * Math.PI / 180; + + const lat2 = Math.asin(Math.sin(lat1) * Math.cos(distanceMeters / R) + + Math.cos(lat1) * Math.sin(distanceMeters / R) * Math.cos(brng)); + const lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(distanceMeters / R) * Math.cos(lat1), + Math.cos(distanceMeters / R) - Math.sin(lat1) * Math.sin(lat2)); + + const endPos = Cesium.Cartesian3.fromDegrees(lon2 * 180 / Math.PI, lat2 * 180 / Math.PI, f.alt || 8000); + (positionProp as any).addSample(future, endPos); + + updatePrimitive(uid, { + id: id, + show: showEntity, + position: positionProp, + billboard: { + image: isOnGround(f) ? svgPlaneBlack : (milIconMap[f.military_type || 'default'] || svgPlaneYellow), + width: 18, + height: 18, + rotation: Cesium.Math.toRadians(-f.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + show: isSelected, // Only show label when isolated + text: `[${f.callsign} ]`, + font: 'bold 10px monospace', + fillColor: Cesium.Color.YELLOW, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -14), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 12000000.0), + disableDepthTestDistance: 1000000.0 + } + }, flightPrimitivesRef.current, flightBillboardsRef.current, flightLabelsRef.current); + if (isSelected) renderTrail(f, uid, Cesium.Color.YELLOW.withAlpha(0.5), isSelected); + }); + // Cull disappeared flights + for (const [uid, prims] of Array.from(flightPrimitivesRef.current.entries())) { + if (!seenIds.has(uid) && prims.billboard.id.startsWith('mil-flight-')) { // Only remove if it's a military flight and not seen + flightBillboardsRef.current.remove(prims.billboard); + flightLabelsRef.current.remove(prims.label); + flightPrimitivesRef.current.delete(uid); + } + } + } + + // Process Tracked/Alert Flights (Plane-Alert DB) + if (data.tracked_flights && activeLayers?.tracked !== false) { + const now = Cesium.JulianDate.now(); + const future = Cesium.JulianDate.addSeconds(now, 30, new Cesium.JulianDate()); + + const anyFlightSelected = selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet' || selectedEntity?.type === 'tracked_flight'; + const selectedTrackedIdx = selectedEntity?.type === 'tracked_flight' ? String(selectedEntity.entityId).replace('tracked-', '') : null; + const seenIds = new Set(); + + data.tracked_flights.forEach((f: any, idx: number) => { + if (hasAnyAirFilter && !hasTrackedFilter) return; + if (!matchesTrackedFilter(f)) return; + const uid = f.icao24 || f.registration || f.callsign || `unk-${idx}`; + const currentPos = Cesium.Cartesian3.fromDegrees(f.lng, f.lat, f.alt || 5000); + if (!occluder.isPointVisible(currentPos)) return; + + const id = `tracked-${uid}`; + const isSelected = selectedTrackedIdx === String(uid); + const showEntity = !anyFlightSelected || isSelected; + seenIds.add(uid); + + const alertColor = f.alert_color || 'white'; + const cesiumColor = trackedColorMap[alertColor] || Cesium.Color.WHITE; + const planeIcon = f.aircraft_category === 'heli' + ? (trackedHeliIcons[alertColor] || svgHeliWhiteAlert) + : (trackedPlaneIcons[alertColor] || svgPlaneWhiteAlert); + + updatePrimitive(uid, { + id: id, + show: showEntity, + position: currentPos, + billboard: { + image: isOnGround(f) ? (f.aircraft_category === 'heli' ? svgHeliBlack : svgPlaneBlack) : planeIcon, + width: 16, height: 16, + rotation: Cesium.Math.toRadians(-f.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + show: isSelected, + text: `⚠ ${f.alert_operator || f.callsign || 'TRACKED'}`, + font: 'bold 10px monospace', + fillColor: cesiumColor, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.85)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -14), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 12000000.0), + disableDepthTestDistance: 1000000.0 + } + }, flightPrimitivesRef.current, flightBillboardsRef.current, flightLabelsRef.current); + const trailAlertColor = f.alert_color || 'white'; + const trailClr = trackedColorMap[trailAlertColor] || Cesium.Color.WHITE; + if (isSelected) renderTrail(f, uid, trailClr.withAlpha(0.5), isSelected); + }); + // Cull disappeared flights + for (const [uid, prims] of Array.from(flightPrimitivesRef.current.entries())) { + if (!seenIds.has(uid) && prims.billboard.id.startsWith('tracked-')) { // Only remove if it's a tracked flight and not seen + flightBillboardsRef.current.remove(prims.billboard); + flightLabelsRef.current.remove(prims.label); + flightPrimitivesRef.current.delete(uid); + } + } + } + + // Process UAV Loitering Patterns + if (data.uavs && activeLayers?.military !== false) { + data.uavs.forEach((uav: any, idx: number) => { + // Drone entity + addOrUpdate({ + id: `uav-entity-${idx}`, + position: Cesium.Cartesian3.fromDegrees(uav.lng, uav.lat, uav.alt || 10000), + point: { + pixelSize: 6, + color: Cesium.Color.ORANGE, + disableDepthTestDistance: 1000000.0 + }, + billboard: { + image: svgDrone, + width: 18, + height: 18, + rotation: Cesium.Math.toRadians(-uav.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + text: `[UAV: ${uav.callsign} ]`, + font: 'bold 10px monospace', + fillColor: Cesium.Color.ORANGE, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -14), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 15000000.0), + disableDepthTestDistance: 1000000.0 + } + }); + + // Loitering Orbit Ring + addOrUpdate({ + id: `uav-orbit-${idx}`, + polyline: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights(uav.path), + width: 1, + material: new Cesium.PolylineDashMaterialProperty({ + color: Cesium.Color.ORANGE.withAlpha(0.3), + dashLength: 8.0 + }) + } + }); + + // Tracked Center Point (Area of Interest) + addOrUpdate({ + id: `uav-target-${idx}`, + position: Cesium.Cartesian3.fromDegrees(uav.center[1], uav.center[0], 0), + point: { + pixelSize: 4, + color: Cesium.Color.RED.withAlpha(0.5), + outlineColor: Cesium.Color.RED, + outlineWidth: 1, + disableDepthTestDistance: 1000000.0 + } + }); + }); + } + + // Project Triangulated Flight Paths + if (selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet' || selectedEntity?.type === 'tracked_flight') { + const fList = selectedEntity.type === 'flight' ? data.commercial_flights + : selectedEntity.type === 'private_flight' ? data.private_flights + : selectedEntity.type === 'private_jet' ? data.private_jets + : selectedEntity.type === 'tracked_flight' ? data.tracked_flights + : data.military_flights; + const flight = fList?.find((f: any) => f.icao24 === selectedEntity.id); + if (flight && flight.origin_loc && flight.dest_loc) { + const color = selectedEntity.type === 'flight' ? Cesium.Color.CYAN + : selectedEntity.type === 'private_flight' ? Cesium.Color.fromCssColorString('#FF8C00') + : selectedEntity.type === 'private_jet' ? Cesium.Color.fromCssColorString('#9B59B6') + : selectedEntity.type === 'tracked_flight' ? (trackedColorMap[flight.alert_color] || Cesium.Color.WHITE) + : Cesium.Color.YELLOW; + + // Add Polyline Arc from origin, through current position, to destination + addOrUpdate({ + id: `sel-poly-${selectedEntity.entityId}`, + polyline: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights([ + flight.origin_loc[0], flight.origin_loc[1], 0, + flight.lng, flight.lat, flight.alt || 5000, + flight.dest_loc[0], flight.dest_loc[1], 0 + ]), + width: 2, + material: new Cesium.PolylineDashMaterialProperty({ + color: color, + dashLength: 16.0 + }) + } + }); + } + } + + // Project Holographic 3D CCTV Video + if (selectedEntity?.type === 'cctv') { + const cam = data?.cctv?.find((c: any) => String(c.id) === String(selectedEntity.id)); + if (cam && !cam.media_url?.includes('embed')) { + const isVideo = cam.media_url?.includes('.mp4'); + let material: any = Cesium.Color.LIME.withAlpha(0.2); + const lng = cam.lng !== undefined ? cam.lng : cam.lon; + + try { + if (isVideo) { + const videoElement = document.createElement('video'); + videoElement.crossOrigin = 'anonymous'; + videoElement.src = cam.media_url; + videoElement.autoplay = true; + videoElement.loop = true; + videoElement.muted = true; + videoElement.play().catch(() => { }); // Catch autoplay errors silently + + material = new Cesium.ImageMaterialProperty({ + image: videoElement, + color: Cesium.Color.WHITE.withAlpha(0.9) + }); + } else { + material = new Cesium.ImageMaterialProperty({ + image: cam.media_url, + color: Cesium.Color.WHITE.withAlpha(0.9) + }); + } + + // A wall stands vertical. Calculate a 400m wide line facing mostly south for visibility. + // To maintain aspect ratio and prevent severe distortion, use a smaller width. + // ~200 meters wide, centered on the camera. + const widthOffset = 0.001; + + addOrUpdate({ + id: `holo-cctv-${cam.id}`, + wall: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights([ + lng - widthOffset, cam.lat, 200, + lng + widthOffset, cam.lat, 200 + ]), + maximumHeights: [600, 600], + minimumHeights: [200, 200], + material: material, + outline: true, + outlineColor: Cesium.Color.LIME + } + }); + } catch (e) { } + } + } + + // Process Ships and Carriers + if (data.ships) { + const importantTypes = new Set(['carrier', 'military_vessel', 'tanker', 'cargo']); + data.ships.forEach((s: any, idx: number) => { + if (hasShipFilter && !matchesShipFilter(s)) return; + const isImportant = importantTypes.has(s.type); + const isPassenger = s.type === 'passenger'; + + // Category-based filtering + if (s.type === 'carrier' && activeLayers?.satellites === false) return; + if (isImportant && s.type !== 'carrier' && activeLayers?.ships_important === false) return; + if (isPassenger && activeLayers?.ships_passenger === false) return; + if (!isImportant && !isPassenger && activeLayers?.ships_civilian === false) return; + + let svg = svgShipWhite; + let color = Cesium.Color.WHITE; + let width = 10, height = 10; + if (s.type === 'carrier') { + svg = svgCarrier; + color = Cesium.Color.ORANGE; + width = 24; + height = 24; + } else if (s.type === 'tanker' || s.type === 'cargo') { + svg = svgShipRed; + color = Cesium.Color.RED; + width = 12; + height = 12; + } else if (s.type === 'yacht') { + svg = svgShipWhite; + color = Cesium.Color.WHITE; + width = 12; + height = 12; + } else if (s.type === 'military_vessel') { + svg = svgShipYellow; + color = Cesium.Color.YELLOW; + width = 14; + height = 14; + } else if (s.type === 'passenger') { + svg = svgShipWhite; + color = Cesium.Color.WHITE; + width = 14; + height = 14; + } + + const currentPos = Cesium.Cartesian3.fromDegrees(s.lng, s.lat, 0); + if (!occluder.isPointVisible(currentPos)) return; + + const shipId = s.mmsi ? `ship-${s.mmsi}` : `ship-${idx}`; + + let entity = shipDS.entities.getById(shipId); + if (!entity) { + shipDS.entities.add({ + id: shipId, + position: currentPos, + billboard: { + image: svg, + width: width, height: height, + rotation: Cesium.Math.toRadians(-s.heading || 0), + disableDepthTestDistance: 1000000.0 + }, + label: { + text: s.type === 'carrier' ? `[[${s.name}]]` : `[${s.name} ]`, + font: s.type === 'carrier' ? 'bold 12px monospace' : '9px monospace', + fillColor: color, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -(height / 2 + 6)), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, s.type === 'carrier' ? 12000000.0 : 3000000.0), + disableDepthTestDistance: 1000000.0 + } + }); + } else { + entity.position = currentPos as any; + if (entity.billboard) { + entity.billboard.rotation = Cesium.Math.toRadians(-s.heading || 0) as any; + } + } + + touchedShipIds.add(shipId); + }); + } + + // Process Earthquakes + if (data.earthquakes && activeLayers?.earthquakes !== false) { + data.earthquakes.forEach((q: any) => { + const color = q.mag > 5 ? Cesium.Color.RED : Cesium.Color.ORANGE; + addOrUpdate({ + id: `quake - ${q.id}`, + position: Cesium.Cartesian3.fromDegrees(q.lng, q.lat, 0), + point: { + pixelSize: q.mag * 3, + color: Cesium.Color.fromCssColorString('rgba(0,0,0,0)'), + outlineColor: color, + outlineWidth: 2 + }, + label: { + text: `[M${q.mag.toFixed(1)} ]\n${q.place.substring(0, 20)}`, + font: 'bold 9px monospace', + fillColor: color, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -10), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 5000000.0) + } + }); + }); + } + + // Process Weather Radar + if (data.weather && activeLayers?.weather !== false) { + const targetUrl = `${data.weather.host}/v2/radar/${data.weather.time}/256/{z}/{x}/{y}/2/1_1.png`; + let weatherLayer = viewer.imageryLayers._layers.find((l: any) => l.imageryProvider.url && l.imageryProvider.url.includes("rainviewer")); + + if (weatherLayer && weatherLayer.imageryProvider.url !== targetUrl) { + viewer.imageryLayers.remove(weatherLayer); + weatherLayer = null; + } + if (!weatherLayer) { + viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({ + url: targetUrl, + credit: "" + }), 1); + } + } else { + const weatherLayer = viewer.imageryLayers._layers.find((l: any) => l.imageryProvider.url && l.imageryProvider.url.includes("rainviewer")); + if (weatherLayer) viewer.imageryLayers.remove(weatherLayer); + } + + // Process Airports + if (data.airports) { + const findByIcao = (list: any[]) => list?.find((f: any) => f.icao24 === selectedEntity?.id); + const selectedFlight = (selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet' || selectedEntity?.type === 'tracked_flight') + ? (selectedEntity?.type === 'flight' ? findByIcao(data.commercial_flights) + : selectedEntity?.type === 'private_flight' ? findByIcao(data.private_flights) + : selectedEntity?.type === 'private_jet' ? findByIcao(data.private_jets) + : selectedEntity?.type === 'tracked_flight' ? findByIcao(data.tracked_flights) + : findByIcao(data.military_flights)) + : null; + + data.airports.forEach((apt: any) => { + const isExplicitlySelected = selectedEntity?.type === 'airport' && String(selectedEntity.id) === String(apt.id); + const isOrigin = selectedFlight && selectedFlight.origin_name && selectedFlight.origin_name.startsWith(apt.iata); + const isDest = selectedFlight && selectedFlight.dest_name && selectedFlight.dest_name.startsWith(apt.iata); + + const showAirport = isExplicitlySelected || isOrigin || isDest; + + addOrUpdate({ + id: `apt-${apt.id}`, + show: showAirport, + position: Cesium.Cartesian3.fromDegrees(apt.lng, apt.lat, 0), + point: { + pixelSize: 6, + color: Cesium.Color.WHITE, + outlineColor: Cesium.Color.BLACK, + outlineWidth: 2, + disableDepthTestDistance: 1000000.0 + }, + label: { + show: showAirport, + text: `(${apt.iata}: ${apt.name})`, + font: 'bold 10px monospace', + fillColor: Cesium.Color.WHITE, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -10), + // Only show labels when reasonably zoomed in to prevent map clutter (approx 5M meters) + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 5000000.0) + } + }); + }); + } + + // Process CCTV (clustered) + if (data.cctv && activeLayers?.cctv !== false && cctvDS) { + data.cctv.forEach((cam: any) => { + const lng = cam.lon !== undefined ? cam.lon : cam.lng; + if (lng === undefined || cam.lat === undefined) return; + + const cctvId = `cctv-${cam.id}`; + touchedCctvIds.add(cctvId); + + const existing = cctvDS.entities.getById(cctvId); + if (existing) { + existing.position = Cesium.Cartesian3.fromDegrees(lng, cam.lat, 0); + } else { + cctvDS.entities.add({ + id: cctvId, + position: Cesium.Cartesian3.fromDegrees(lng, cam.lat, 0), + point: { + pixelSize: 8, + color: Cesium.Color.LIME, + outlineColor: Cesium.Color.BLACK, + outlineWidth: 2, + disableDepthTestDistance: 1000000.0 + }, + label: { + text: `[CCTV: ${cam.direction_facing ? cam.direction_facing.substring(0, 15) : 'Camera'}... ]`, + font: 'bold 10px monospace', + fillColor: Cesium.Color.LIME, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -10), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 500000.0) + } + }); + } + }); + } else if (cctvDS) { + // Layer toggled off — remove all CCTV entities + cctvDS.entities.removeAll(); + } + + // Bikeshare removed per user request + + + // Process Traffic Accidents/Signs removed per User request to declutter CCTV + + // Process Satellites + if (data.satellites && activeLayers?.satellites !== false) { + const date = new Date(); + data.satellites.forEach((sat: any, idx: number) => { + try { + const satrec = satellite.twoline2satrec(sat.tle1, sat.tle2); + const positionAndVelocity = satellite.propagate(satrec, date); + const gmst = satellite.gstime(date); + if (positionAndVelocity && (positionAndVelocity as any).position && typeof (positionAndVelocity as any).position !== 'boolean') { + const positionGd = satellite.eciToGeodetic((positionAndVelocity as any).position, gmst); + const longitude = satellite.degreesLong(positionGd.longitude); + const latitude = satellite.degreesLat(positionGd.latitude); + const height = positionGd.height * 1000; + + addOrUpdate({ + id: `satellite-${sat.id}`, + position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height), + point: { + pixelSize: 6, + color: Cesium.Color.AQUA, + disableDepthTestDistance: 1000000.0 + }, + label: { + text: `[ SAT: ${sat.name} ]`, + font: 'bold 10px monospace', + fillColor: Cesium.Color.AQUA, + backgroundColor: Cesium.Color.fromCssColorString('rgba(0,0,0,0.8)'), + showBackground: true, + style: Cesium.LabelStyle.FILL, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -10), + distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 10000000.0), + disableDepthTestDistance: 1000000.0 + } + }); + + // Add Orbital Path (sampled for performance) + if (idx % 20 === 0) { // Only show paths for every 20th satellite + const orbitPoints = []; + for (let i = 0; i < 90; i += 5) { + const futureDate = new Date(date.getTime() + i * 60000); + const fPV = satellite.propagate(satrec, futureDate); + const fGmst = satellite.gstime(futureDate); + if (fPV && (fPV as any).position && typeof (fPV as any).position !== 'boolean') { + const fGd = satellite.eciToGeodetic((fPV as any).position, fGmst); + orbitPoints.push(satellite.degreesLong(fGd.longitude)); + orbitPoints.push(satellite.degreesLat(fGd.latitude)); + orbitPoints.push(fGd.height * 1000); + } + } + if (orbitPoints.length > 3) { + addOrUpdate({ + polyline: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights(orbitPoints), + width: 1, + material: new Cesium.PolylineGlowMaterialProperty({ + glowPower: 0.1, + color: Cesium.Color.AQUA.withAlpha(0.3) + }) + } + }); + } + } + } + } catch (e) { } + }); + } + + // Draw orbital path if satellite selected + if (selectedEntity && selectedEntity.type === 'satellite') { + try { + const satrec = satellite.twoline2satrec(selectedEntity.tle1, selectedEntity.tle2); + const positions = []; + const date = new Date(); + // 100 minutes forward for LEO orbit track + for (let i = 0; i <= 100; i++) { + const d = new Date(date.getTime() + i * 60000); + const p = satellite.propagate(satrec, d); + if (p && (p as any).position && typeof (p as any).position !== 'boolean') { + const gmst = satellite.gstime(d); + const posGd = satellite.eciToGeodetic((p as any).position, gmst); + positions.push(satellite.degreesLong(posGd.longitude)); + positions.push(satellite.degreesLat(posGd.latitude)); + positions.push(posGd.height * 1000); + } + } + + if (positions.length > 0) { + addOrUpdate({ + id: `orbit - ${selectedEntity.entityId}`, + polyline: { + positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions), + width: 2, + material: new Cesium.PolylineDashMaterialProperty({ + color: Cesium.Color.CYAN, + dashLength: 16.0 + }) + } + }); + } + } catch (e) { } + } + + // Prune unused entities from viewer.entities + const allEntities = viewer.entities.values; + for (let i = allEntities.length - 1; i >= 0; i--) { + const e = allEntities[i]; + if (!touchedIds.has(e.id)) { + viewer.entities.remove(e); + } + } + viewer.entities.resumeEvents(); + + // Prune stale ships from clustered data source + if (shipDS) { + const entities = shipDS.entities.values; + for (let i = entities.length - 1; i >= 0; i--) { + const id = entities[i].id; + if (!touchedShipIds.has(id)) { + shipDS.entities.removeById(id); + } + } + shipDS.entities.resumeEvents(); + } + + // Prune stale CCTV from clustered data source + if (cctvDS) { + const entities = cctvDS.entities.values; + for (let i = entities.length - 1; i >= 0; i--) { + const id = entities[i].id; + if (!touchedCctvIds.has(id)) { + cctvDS.entities.removeById(id); + } + } + cctvDS.entities.resumeEvents(); + } + }, [data, activeLayers, effects, selectedEntity]); + + return ( +
+ {/* IN-MAP CONTEXT OVERLAYS */} + {selectedEntity && selectedEntity.type === 'news' && popupPosition && ( +
+
+ {(() => { + const cluster = data?.news?.[selectedEntity.id as number]; + if (!cluster) return null; + return ( +
+ {cluster.machine_assessment && ( +
+
+ >_ SYS.ANALYSIS: + {cluster.machine_assessment} +
+ )} + +
+ {cluster.articles && cluster.articles.map((item: any, idx: number) => { + const isHigh = item.risk_score >= 5; + const titleClass = isHigh ? "text-red-300 font-bold" : "text-cyan-300 font-medium"; + return ( +
+
+ + >_ {item.source} + + LVL: {item.risk_score}/10 +
+ + {item.title} + +
+ ); + })} +
+
+ ); + })()} +
+
+
+ )} + + {selectedEntity && selectedEntity.type === 'cctv' && popupPosition && ( +
+
+ {(() => { + const cam = data?.cctv?.find((c: any) => String(c.id) === String(selectedEntity.id)); + if (!cam) return null; + return ( +
+
+ + >_ {cam.source_agency || 'INTERCEPT'} + + LIVE +
+
+
+ [ FEED DIVERTED TO HOLOGRAPHIC MESH ] +
+
+ REC // {cam.id} +
+
+
+ {cam.direction_facing || 'UNKNOWN MOUNT'} +
+
+ ); + })()} + {/* Connecting line to the marker */} +
+
+
+ )} + + {selectedEntity && selectedEntity.type === 'gdelt' && popupPosition && ( +
+
+ {(() => { + const incident = data?.gdelt?.[selectedEntity.id as number]; + if (!incident) return null; + const props = incident.properties || {}; + // Use regex to strip GDELT's inline a-tags so we can render cleanly or just render dangerously + return ( +
+
+ + >_ KINETIC EVENT + + MILITARY +
+
+ {props.location || props.name || 'UNKNOWN LOCATION'} +
+
+
+ ); + })()} +
+
+
+ )} +
+ ); +} diff --git a/frontend/src/components/ErrorBoundary.tsx b/frontend/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..e0cbdc6 --- /dev/null +++ b/frontend/src/components/ErrorBoundary.tsx @@ -0,0 +1,52 @@ +"use client"; + +import React, { Component, ErrorInfo, ReactNode } from "react"; + +interface Props { + children: ReactNode; + fallback?: ReactNode; + name?: string; +} + +interface State { + hasError: boolean; + error: Error | null; +} + +class ErrorBoundary extends Component { + constructor(props: Props) { + super(props); + this.state = { hasError: false, error: null }; + } + + static getDerivedStateFromError(error: Error): State { + return { hasError: true, error }; + } + + componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error(`[ErrorBoundary${this.props.name ? `: ${this.props.name}` : ""}]`, error, errorInfo); + } + + render() { + if (this.state.hasError) { + if (this.props.fallback) return this.props.fallback; + return ( +
+
+
⚠ SYSTEM ERROR
+
{this.props.name || "Component"} failed to render
+ +
+
+ ); + } + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/frontend/src/components/FilterPanel.tsx b/frontend/src/components/FilterPanel.tsx new file mode 100644 index 0000000..23cf0cd --- /dev/null +++ b/frontend/src/components/FilterPanel.tsx @@ -0,0 +1,339 @@ +"use client"; + +import { useState, useMemo } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { ChevronUp, Filter, Plane, Shield, Star, Ship, SlidersHorizontal } from 'lucide-react'; +import AdvancedFilterModal from './AdvancedFilterModal'; +import { airlineNames } from '../lib/airlineCodes'; +import { trackedCategories, trackedOperators } from '../lib/trackedData'; + +interface FilterPanelProps { + data: any; + activeFilters: Record; + setActiveFilters: (filters: Record) => void; +} + +type ModalConfig = { + title: string; + icon: React.ReactNode; + accentColor: string; + accentColorName: string; + fields: { key: string; label: string; options: string[]; optionLabels?: Record }[]; +}; + +export default function FilterPanel({ data, activeFilters, setActiveFilters }: FilterPanelProps) { + const [isMinimized, setIsMinimized] = useState(true); + const [openModal, setOpenModal] = useState(null); + + // ── Extract unique values from live data ── + + // Commercial: departures, arrivals, airlines + const uniqueOrigins = useMemo(() => { + const origins = new Set(); + for (const f of data?.commercial_flights || []) { + if (f.origin_name && f.origin_name !== 'UNKNOWN') origins.add(f.origin_name); + } + return Array.from(origins).sort(); + }, [data?.commercial_flights]); + + const uniqueDestinations = useMemo(() => { + const dests = new Set(); + for (const f of data?.commercial_flights || []) { + if (f.dest_name && f.dest_name !== 'UNKNOWN') dests.add(f.dest_name); + } + return Array.from(dests).sort(); + }, [data?.commercial_flights]); + + const uniqueAirlines = useMemo(() => { + const airlines = new Set(); + for (const f of data?.commercial_flights || []) { + if (f.airline_code && f.airline_code.trim()) airlines.add(f.airline_code.trim()); + } + return Array.from(airlines).sort(); + }, [data?.commercial_flights]); + + const airlineLabels = useMemo(() => { + const labels: Record = {}; + for (const code of uniqueAirlines) { + const name = airlineNames[code]; + if (name) { + labels[code] = `${code} - ${name}`; + } else { + labels[code] = code; + } + } + return labels; + }, [uniqueAirlines]); + + // Private: callsigns + aircraft types + const uniquePrivateCallsigns = useMemo(() => { + const callsigns = new Set(); + for (const f of [...(data?.private_flights || []), ...(data?.private_jets || [])]) { + if (f.callsign) callsigns.add(f.callsign); + if (f.registration) callsigns.add(f.registration); + } + return Array.from(callsigns).sort(); + }, [data?.private_flights, data?.private_jets]); + + const uniquePrivateAircraftTypes = useMemo(() => { + const types = new Set(); + for (const f of [...(data?.private_flights || []), ...(data?.private_jets || [])]) { + if (f.model && f.model !== 'Unknown') types.add(f.model); + } + return Array.from(types).sort(); + }, [data?.private_flights, data?.private_jets]); + + // Military: country + aircraft type + const uniqueMilCountries = useMemo(() => { + const countries = new Set(); + for (const f of data?.military_flights || []) { + if (f.country) countries.add(f.country); + else if (f.registration) countries.add(f.registration); + } + return Array.from(countries).sort(); + }, [data?.military_flights]); + + const uniqueMilAircraftTypes = useMemo(() => { + const types = new Set(); + for (const f of data?.military_flights || []) { + if (f.military_type && f.military_type !== 'default') types.add(f.military_type); + } + return Array.from(types).sort(); + }, [data?.military_flights]); + + // Tracked: operators + categories + const uniqueTrackedOperators = useMemo(() => { + const ops = new Set(trackedOperators); + for (const f of data?.tracked_flights || []) { + if (f.alert_operator) ops.add(f.alert_operator); + if (f.alert_tag1) ops.add(f.alert_tag1); + if (f.alert_tag2) ops.add(f.alert_tag2); + } + return Array.from(ops).sort(); + }, [data?.tracked_flights]); + + const uniqueTrackedCategories = useMemo(() => { + const cats = new Set(trackedCategories); + for (const f of data?.tracked_flights || []) { + if (f.alert_category) cats.add(f.alert_category); + } + return Array.from(cats).sort(); + }, [data?.tracked_flights]); + + // Maritime: vessel names + vessel types (using 'type' field, not 'ship_type') + const uniqueShipNames = useMemo(() => { + const names = new Set(); + for (const s of data?.ships || []) { + if (s.name && s.name !== 'UNKNOWN') names.add(s.name); + } + return Array.from(names).sort(); + }, [data?.ships]); + + const uniqueVesselTypes = useMemo(() => { + const types = new Set(); + for (const s of data?.ships || []) { + // Use 'type' field from AIS stream (tanker, cargo, passenger, yacht, etc.) + if (s.type && s.type !== 'unknown') types.add(s.type); + } + return Array.from(types).sort(); + }, [data?.ships]); + + // ── Modal configs ── + + const modalConfigs: Record = { + commercial: { + title: 'COMMERCIAL FLIGHTS', + icon: , + accentColor: '#00bcd4', + accentColorName: 'cyan', + fields: [ + { key: 'commercial_departure', label: 'DEPARTURE', options: uniqueOrigins }, + { key: 'commercial_arrival', label: 'ARRIVAL', options: uniqueDestinations }, + { key: 'commercial_airline', label: 'AIRLINE', options: uniqueAirlines, optionLabels: airlineLabels }, + ] + }, + private: { + title: 'PRIVATE / JETS', + icon: , + accentColor: '#FF8C00', + accentColorName: 'orange', + fields: [ + { key: 'private_callsign', label: 'CALLSIGN / REG', options: uniquePrivateCallsigns }, + { key: 'private_aircraft_type', label: 'AIRCRAFT TYPE', options: uniquePrivateAircraftTypes }, + ] + }, + military: { + title: 'MILITARY', + icon: , + accentColor: '#EAB308', + accentColorName: 'yellow', + fields: [ + { key: 'military_country', label: 'COUNTRY / REG', options: uniqueMilCountries }, + { key: 'military_aircraft_type', label: 'AIRCRAFT TYPE', options: uniqueMilAircraftTypes }, + ] + }, + tracked: { + title: 'TRACKED AIRCRAFT', + icon: , + accentColor: '#EC4899', + accentColorName: 'pink', + fields: [ + { key: 'tracked_category', label: 'CATEGORY', options: uniqueTrackedCategories }, + { key: 'tracked_owner', label: 'OPERATOR / ENTITY', options: uniqueTrackedOperators }, + ] + }, + ships: { + title: 'MARITIME VESSELS', + icon: , + accentColor: '#3B82F6', + accentColorName: 'blue', + fields: [ + { key: 'ship_name', label: 'VESSEL NAME', options: uniqueShipNames }, + { key: 'ship_type', label: 'VESSEL TYPE', options: uniqueVesselTypes }, + ] + } + }; + + const clearAll = () => setActiveFilters({}); + + const activeCount = Object.values(activeFilters).reduce((acc, arr) => acc + arr.length, 0); + + const getCountForCategory = (category: string) => { + const config = modalConfigs[category]; + if (!config) return 0; + return config.fields.reduce((acc, f) => acc + (activeFilters[f.key]?.length || 0), 0); + }; + + const handleModalApply = (categoryKey: string, modalFilters: Record) => { + const config = modalConfigs[categoryKey]; + const next = { ...activeFilters }; + for (const field of config.fields) { + delete next[field.key]; + } + for (const [key, values] of Object.entries(modalFilters)) { + if (values.length > 0) next[key] = values; + } + setActiveFilters(next); + }; + + const sections = [ + { key: 'commercial', title: 'COMMERCIAL FLIGHTS', icon: , color: 'cyan' }, + { key: 'private', title: 'PRIVATE / JETS', icon: , color: 'orange' }, + { key: 'military', title: 'MILITARY', icon: , color: 'yellow' }, + { key: 'tracked', title: 'TRACKED AIRCRAFT', icon: , color: 'pink' }, + { key: 'ships', title: 'MARITIME VESSELS', icon: , color: 'blue' }, + ]; + + const borderColors: Record = { + cyan: 'border-cyan-500/20 hover:border-cyan-500/40', + orange: 'border-orange-500/20 hover:border-orange-500/40', + yellow: 'border-yellow-500/20 hover:border-yellow-500/40', + pink: 'border-pink-500/20 hover:border-pink-500/40', + blue: 'border-blue-500/20 hover:border-blue-500/40', + }; + const textColors: Record = { + cyan: 'text-cyan-400', + orange: 'text-orange-400', + yellow: 'text-yellow-400', + pink: 'text-pink-400', + blue: 'text-blue-400', + }; + const bgColors: Record = { + cyan: 'bg-cyan-500/10', + orange: 'bg-orange-500/10', + yellow: 'bg-yellow-500/10', + pink: 'bg-pink-500/10', + blue: 'bg-blue-500/10', + }; + + return ( + <> + + {/* Header Toggle */} +
setIsMinimized(!isMinimized)} + > +
+ + DATA FILTERS + {activeCount > 0 && ( + + {activeCount} ACTIVE + + )} +
+ +
+ + + {!isMinimized && ( + + {activeCount > 0 && ( + + )} + + {sections.map(section => { + const count = getCountForCategory(section.key); + return ( +
setOpenModal(section.key)} + > +
+
+ {section.icon} + {section.title} + {count > 0 && ( + + {count} + + )} +
+ +
+
+ ); + })} +
+ )} +
+
+ + {/* Render active modal */} + + {openModal && modalConfigs[openModal] && ( + handleModalApply(openModal, filters)} + onClose={() => setOpenModal(null)} + /> + )} + + + ); +} diff --git a/frontend/src/components/FindLocateBar.tsx b/frontend/src/components/FindLocateBar.tsx new file mode 100644 index 0000000..cd43152 --- /dev/null +++ b/frontend/src/components/FindLocateBar.tsx @@ -0,0 +1,242 @@ +"use client"; + +import { useState, useMemo, useRef, useEffect } from "react"; +import { Search, Crosshair, Plane, Shield, Star, Ship, X, Database } from "lucide-react"; +import { motion, AnimatePresence } from "framer-motion"; +import { trackedOperators } from '../lib/trackedData'; + +interface FindLocateBarProps { + data: any; + onLocate: (lat: number, lng: number, entityId: string, entityType: string) => void; + onFilter?: (filterType: string, filterValue: string) => void; +} + +interface SearchResult { + id: string; + label: string; + sublabel: string; + category: string; + categoryColor: string; + lat: number; + lng: number; + entityType: string; +} + +export default function FindLocateBar({ data, onLocate, onFilter }: FindLocateBarProps) { + const [query, setQuery] = useState(""); + const [isOpen, setIsOpen] = useState(false); + const inputRef = useRef(null); + const containerRef = useRef(null); + + // Close dropdown when clicking outside + useEffect(() => { + const handler = (e: MouseEvent) => { + if (containerRef.current && !containerRef.current.contains(e.target as Node)) { + setIsOpen(false); + } + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, []); + + // Build searchable index from all data + const allEntities = useMemo(() => { + const results: SearchResult[] = []; + + // Commercial flights + for (const f of data?.commercial_flights || []) { + const uid = f.icao24 || f.registration || f.callsign || ''; + results.push({ + id: `flight-${uid}`, + label: f.callsign || uid, + sublabel: `${f.model || 'Unknown'} · ${f.airline_code || 'Commercial'}`, + category: "COMMERCIAL", + categoryColor: "text-cyan-400", + lat: f.lat, + lng: f.lng, + entityType: "flight", + }); + } + + // Private flights + for (const f of [...(data?.private_flights || []), ...(data?.private_jets || [])]) { + const uid = f.icao24 || f.registration || f.callsign || ''; + const type = f.type === 'private_jet' ? 'private_jet' : 'private_flight'; + results.push({ + id: `${type === 'private_jet' ? 'private-jet' : 'private-flight'}-${uid}`, + label: f.callsign || f.registration || uid, + sublabel: `${f.model || 'Unknown'} · Private`, + category: "PRIVATE", + categoryColor: "text-orange-400", + lat: f.lat, + lng: f.lng, + entityType: type, + }); + } + + // Military flights + for (const f of data?.military_flights || []) { + const uid = f.icao24 || f.registration || f.callsign || ''; + results.push({ + id: `mil-flight-${uid}`, + label: f.callsign || uid, + sublabel: `${f.model || 'Unknown'} · ${f.military_type || 'Military'}`, + category: "MILITARY", + categoryColor: "text-yellow-400", + lat: f.lat, + lng: f.lng, + entityType: "military_flight", + }); + } + + // Tracked flights + for (const f of data?.tracked_flights || []) { + const uid = f.icao24 || f.registration || f.callsign || ''; + const operator = f.alert_operator || 'Unknown Operator'; + const category = f.alert_category || 'Tracked'; + const type = f.alert_type || f.model || 'Unknown'; + results.push({ + id: `tracked-${uid}`, + label: operator, + sublabel: `${category} · ${type} (${f.registration || uid})`, + category: "TRACKED", + categoryColor: "text-pink-400", + lat: f.lat, + lng: f.lng, + entityType: "tracked_flight", + }); + } + + // Ships + for (const s of data?.ships || []) { + results.push({ + id: `ship-${s.mmsi || s.name || ''}`, + label: s.name || "UNKNOWN", + sublabel: `${s.type || 'Vessel'} · ${s.destination || 'Unknown dest'}`, + category: "MARITIME", + categoryColor: "text-blue-400", + lat: s.lat, + lng: s.lng, + entityType: "ship", + }); + } + + // Database Records - Tracked Operators + for (const op of trackedOperators) { + results.push({ + id: `tracked-db-${op}`, + label: op, + sublabel: `Database Record · Operator`, + category: "DATABASE", + categoryColor: "text-purple-400", + lat: 0, + lng: 0, + entityType: "database_operator", + }); + } + + return results; + }, [data]); + + // Filter results based on query + const filtered = useMemo(() => { + if (!query.trim()) return []; + const q = query.toLowerCase(); + return allEntities + .filter(e => { + const searchable = `${e.label} ${e.sublabel} ${e.id}`.toLowerCase(); + return searchable.includes(q); + }) + .slice(0, 12); + }, [query, allEntities]); + + const handleSelect = (result: SearchResult) => { + if (result.entityType === "database_operator") { + if (onFilter) onFilter("tracked_owner", result.label); + } else { + onLocate(result.lat, result.lng, result.id, result.entityType); + } + setQuery(""); + setIsOpen(false); + }; + + const categoryIcons: Record = { + COMMERCIAL: , + PRIVATE: , + MILITARY: , + TRACKED: , + MARITIME: , + DATABASE: , + }; + + return ( +
+
+ + { + setQuery(e.target.value); + setIsOpen(true); + }} + onFocus={() => setIsOpen(true)} + /> + {query && ( + + )} + +
+ + + {isOpen && filtered.length > 0 && ( + +
+ {filtered.map((r, idx) => ( + + ))} +
+
+ {filtered.length} RESULT{filtered.length !== 1 ? 'S' : ''} — CLICK TO LOCATE +
+
+ )} + {isOpen && query.trim() && filtered.length === 0 && ( + +
NO MATCHING ASSETS
+
+ )} +
+
+ ); +} diff --git a/frontend/src/components/LeafletViewer.tsx b/frontend/src/components/LeafletViewer.tsx new file mode 100644 index 0000000..81e81db --- /dev/null +++ b/frontend/src/components/LeafletViewer.tsx @@ -0,0 +1,304 @@ +"use client"; + +import React, { useEffect, useState, useRef } from "react"; +import { MapContainer, TileLayer, Marker, Popup, useMap, Tooltip, CircleMarker, useMapEvents } from "react-leaflet"; +import L from "leaflet"; +import "leaflet/dist/leaflet.css"; + +// Fix standard leaflet icon path issues in React +delete (L.Icon.Default.prototype as any)._getIconUrl; +L.Icon.Default.mergeOptions({ + iconRetinaUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon-2x.png', + iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png', + shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png', +}); + +// Create custom icons dynamically for the layers +const createDivIcon = (svg: string, size = 16, rotate = 0) => { + return L.divIcon({ + className: 'custom-div-icon', + html: `
${svg}
`, + iconSize: [size, size], + iconAnchor: [size / 2, size / 2] + }); +}; + +const svgPlaneCyan = ``; +const svgPlaneOrange = ``; +const svgPlaneRed = ``; +const svgShip = ``; +const svgThreat = ``; +const svgTriangleYellow = ``; +const svgTriangleRed = ``; + +// Helper component to center map when Find Locater is used +function MapCenterControl({ location }: { location: { lat: number, lng: number } | null }) { + const map = useMap(); + useEffect(() => { + if (location) { + map.flyTo([location.lat, location.lng], 8, { duration: 1.5 }); + } + }, [location, map]); + return null; +} + +// Eavesdrop mode controller +function ClickHandler({ isEavesdropping, onEavesdropClick }: any) { + const map = useMap(); + useEffect(() => { + if (!isEavesdropping) return; + const cb = (e: any) => onEavesdropClick({ lat: e.latlng.lat, lng: e.latlng.lng }); + map.on('click', cb); + return () => { map.off('click', cb); }; + }, [isEavesdropping, map, onEavesdropClick]); + return null; +} + +// Map state tracker for LOD +function MapStateTracker({ onStateChange }: { onStateChange: (zoom: number, bounds: L.LatLngBounds) => void }) { + const map = useMapEvents({ + moveend: () => onStateChange(map.getZoom(), map.getBounds()), + zoomend: () => onStateChange(map.getZoom(), map.getBounds()), + }); + useEffect(() => { + onStateChange(map.getZoom(), map.getBounds()); + }, [map, onStateChange]); + return null; +} + +export default function LeafletViewer({ data, activeLayers, activeFilters, effects, onEntityClick, selectedEntity, flyToLocation, isEavesdropping, onEavesdropClick, onCameraMove }: any) { + const [zoom, setZoom] = useState(3); + const [bounds, setBounds] = useState(null); + + const handleMapState = (z: number, b: L.LatLngBounds) => { + setZoom(z); + setBounds(b); + }; + + const isVisible = (lat: number, lng: number) => { + if (!bounds) return true; + return bounds.pad(0.2).contains([lat, lng]); + }; + + return ( +
+ + + + + + {/* Dark Mode Satellite Stamen / CartoDB Voyager basemap substitute */} + + + {/* --- COMMERCIAL FLIGHTS --- */} + {activeLayers.flights && data?.commercial_flights?.map((f: any, idx: number) => { + if (f.lat == null || f.lng == null) return null; + if (zoom >= 6 && !isVisible(f.lat, f.lng)) return null; + + if (zoom < 6) { + return ( + onEntityClick?.({ type: 'flight', id: idx, callsign: f.callsign || f.icao24 }) }} + /> + ); + } + + const icon = createDivIcon(svgPlaneCyan, 18, f.true_track || f.heading || 0); + return ( + onEntityClick?.({ type: 'flight', id: idx, callsign: f.callsign || f.icao24 }) }} + > + +
{f.callsign || f.icao24}
+
+
+ ); + })} + + {/* --- PRIVATE FLIGHTS --- */} + {activeLayers.private && data?.private_flights?.map((f: any, idx: number) => { + if (f.lat == null || f.lng == null) return null; + if (zoom >= 6 && !isVisible(f.lat, f.lng)) return null; + + if (zoom < 6) { + return ( + onEntityClick?.({ type: 'private_flight', id: idx, callsign: f.callsign || f.icao24 }) }} + /> + ); + } + + const icon = createDivIcon(svgPlaneOrange, 18, f.true_track || f.heading || 0); + return ( + onEntityClick?.({ type: 'private_flight', id: idx, callsign: f.callsign || f.icao24 }) }} + > + +
{f.callsign || f.icao24}
+
+
+ ); + })} + + {/* --- MILITARY FLIGHTS --- */} + {activeLayers.military && data?.military_flights?.map((f: any, idx: number) => { + if (f.lat == null || f.lng == null) return null; + if (zoom >= 6 && !isVisible(f.lat, f.lng)) return null; + + if (zoom < 6) { + return ( + onEntityClick?.({ type: 'military_flight', id: idx, callsign: f.callsign || f.icao24 }) }} + /> + ); + } + + const icon = createDivIcon(svgPlaneRed, 20, f.true_track || f.heading || 0); + return ( + onEntityClick?.({ type: 'military_flight', id: idx, callsign: f.callsign || f.icao24 }) }} + > + +
{f.callsign || f.icao24}
+
+
+ ); + })} + + {/* --- SHIPS --- */} + {(activeLayers.ships_important || activeLayers.ships_civilian || activeLayers.ships_passenger) && data?.ships?.map((s: any, idx: number) => { + if (s.lat == null || s.lng == null) return null; + if (zoom >= 6 && !isVisible(s.lat, s.lng)) return null; + + if (zoom < 6) { + return ( + onEntityClick?.({ type: 'ship', id: idx, name: s.name }) }} + /> + ); + } + + const icon = createDivIcon(svgShip, 12, s.heading || 0); + return ( + onEntityClick?.({ type: 'ship', id: idx, name: s.name }) }} + > + +
{s.name}
+
+
+ ); + })} + + {/* --- GDELT GLOBAL INCIDENTS --- */} + {activeLayers.global_incidents && data?.gdelt?.map((incident: any, idx: number) => { + const geom = incident.geometry; + if (!geom || geom.type !== 'Point' || !geom.coordinates) return null; + const lng = geom.coordinates[0]; + const lat = geom.coordinates[1]; + if (!isVisible(lat, lng)) return null; + + return ( + onEntityClick?.({ type: 'gdelt', id: idx }) }} + > + +
+ {incident.title} +
+
+
+ ); + })} + + {/* --- LIVEUAMAP INCIDENTS --- */} + {activeLayers.global_incidents && data?.liveuamap?.map((incident: any, idx: number) => { + if (incident.lat == null || incident.lng == null) return null; + if (!isVisible(incident.lat, incident.lng)) return null; + const isViolent = /bomb|missil|strike|attack|kill|destroy|fire|shoot|expl|raid/i.test(incident.title || ""); + const icon = createDivIcon(isViolent ? svgTriangleRed : svgTriangleYellow, 18); + return ( + onEntityClick?.({ type: 'liveuamap', id: incident.id, title: incident.title }) }} + > + +
+ [LIVEUA] {incident.title} +
+
+
+ ); + })} + + {/* --- RSS THREAT ALERTS --- */} + {activeLayers.global_incidents && data?.news?.filter((n: any) => n.coordinates)?.map((n: any, idx: number) => { + if (n.coordinates.lat == null || n.coordinates.lng == null) return null; + if (!isVisible(n.coordinates.lat, n.coordinates.lng)) return null; + const icon = createDivIcon(svgThreat, 24); + return ( + onEntityClick?.({ type: 'news', id: idx }) }} + > + +
+ !! LVL {n.threat_level} !!
+ {n.title.substring(0, 30)}... +
+
+
+ ); + })} + +
+
+ ); +} diff --git a/frontend/src/components/MapLegend.tsx b/frontend/src/components/MapLegend.tsx new file mode 100644 index 0000000..bcffc33 --- /dev/null +++ b/frontend/src/components/MapLegend.tsx @@ -0,0 +1,301 @@ +"use client"; + +import React, { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { X, ChevronDown, ChevronUp } from "lucide-react"; + +// ─── Inline SVG legend icons (small, crisp, no external deps) ─── +const plane = (fill: string, size = 16) => + ``; + +const airliner = (fill: string, size = 16) => + ``; + +const turboprop = (fill: string, size = 16) => + ``; + +const bizjet = (fill: string, size = 16) => + ``; + +const heli = (fill: string, size = 16) => + ``; + +const ship = (fill: string, size = 16) => + ``; + +const triangle = (fill: string, size = 16) => + ``; + +const circle = (fill: string, size = 16) => + ``; + +const dot = (fill: string, size = 16) => + ``; + +function IconImg({ svg }: { svg: string }) { + return ; +} + +// ─── Legend data ─── + +interface LegendItem { + svg: string; + label: string; +} + +interface LegendCategory { + name: string; + color: string; + items: LegendItem[]; +} + +const sat = (fill: string, size = 16) => + ``; + +const square = (fill: string, size = 16) => + ``; + +const clusterCircle = (fill: string, stroke: string, size = 16) => + `5`; + +const LEGEND: LegendCategory[] = [ + { + name: "COMMERCIAL AVIATION", + color: "text-cyan-400 border-cyan-500/30", + items: [ + { svg: airliner("cyan"), label: "Airliner (swept wings)" }, + { svg: turboprop("cyan"), label: "Turboprop (straight wings)" }, + { svg: heli("cyan"), label: "Helicopter (rotor disc)" }, + { svg: airliner("#555"), label: "Grounded / Parked (grey)" }, + ], + }, + { + name: "PRIVATE AVIATION", + color: "text-orange-400 border-orange-500/30", + items: [ + { svg: airliner("#FF8C00"), label: "Private Flight — Airliner" }, + { svg: turboprop("#FF8C00"), label: "Private Flight — Turboprop" }, + { svg: heli("#FF8C00"), label: "Private Flight — Helicopter" }, + ], + }, + { + name: "PRIVATE JETS", + color: "text-purple-400 border-purple-500/30", + items: [ + { svg: bizjet("#9B59B6"), label: "Private Jet — Bizjet" }, + { svg: airliner("#9B59B6"), label: "Private Jet — Airliner" }, + { svg: turboprop("#9B59B6"), label: "Private Jet — Turboprop" }, + ], + }, + { + name: "MILITARY AVIATION", + color: "text-yellow-400 border-yellow-500/30", + items: [ + { svg: airliner("yellow"), label: "Military — Standard" }, + { svg: plane("yellow"), label: "Fighter / Interceptor" }, + { svg: heli("yellow"), label: "Military — Helicopter" }, + { svg: ``, label: "UAV / Drone" }, + { svg: ``, label: "UAV Operational Range (dashed circle)" }, + ], + }, + { + name: "TRACKED AIRCRAFT (ALERT)", + color: "text-pink-400 border-pink-500/30", + items: [ + { svg: airliner("#FF1493"), label: "Alert — Low Priority (pink)" }, + { svg: airliner("#FF2020"), label: "Alert — High Priority (red)" }, + { svg: airliner("#1A3A8A"), label: "Alert — Government (navy)" }, + { svg: airliner("white"), label: "Alert — General (white)" }, + ], + }, + { + name: "SATELLITES", + color: "text-sky-400 border-sky-500/30", + items: [ + { svg: sat("#ff3333"), label: "Military Recon / SAR (red)" }, + { svg: sat("#00e5ff"), label: "Synthetic Aperture Radar (cyan)" }, + { svg: sat("#ffffff"), label: "Signals Intelligence / ELINT (white)" }, + { svg: sat("#4488ff"), label: "Navigation — GPS / GLONASS / BeiDou (blue)" }, + { svg: sat("#ff00ff"), label: "Early Warning — Missile Detection (magenta)" }, + { svg: sat("#44ff44"), label: "Commercial Imaging (green)" }, + { svg: sat("#ffdd00"), label: "Space Station — ISS / Tiangong (gold)" }, + { svg: sat("#aaaaaa"), label: "Unclassified / Other (grey)" }, + ], + }, + { + name: "MARITIME", + color: "text-blue-400 border-blue-500/30", + items: [ + { svg: ship("gray"), label: "Civilian / Unknown Vessel" }, + { svg: ship("yellow"), label: "Tanker" }, + { svg: ship("#ff2222"), label: "Military Vessel" }, + { svg: ship("#3b82f6"), label: "Cargo Ship" }, + { svg: ship("white"), label: "Cruise / Passenger" }, + { svg: ``, label: "Aircraft Carrier" }, + { svg: clusterCircle("#3b82f6", "#1d4ed8"), label: "Ship Cluster (count inside)" }, + ], + }, + { + name: "GEOPHYSICAL", + color: "text-orange-400 border-orange-500/30", + items: [ + { svg: circle("#ff6600"), label: "Earthquake (size = magnitude)" }, + ], + }, + { + name: "INCIDENTS & INTELLIGENCE", + color: "text-red-400 border-red-500/30", + items: [ + { svg: triangle("#ffaa00"), label: "GDELT / LiveUA event (yellow)" }, + { svg: triangle("#ff0000"), label: "Violent / Kinetic event (red)" }, + { svg: ``, label: "Threat Alert (news cluster)" }, + ], + }, + { + name: "NEWS & OSINT", + color: "text-cyan-400 border-cyan-500/30", + items: [ + { svg: `!! ALERTNews Headline`, label: "Geolocated news alert box" }, + ], + }, + { + name: "GPS JAMMING / INTERFERENCE", + color: "text-red-400 border-red-500/30", + items: [ + { svg: square("#ff0040"), label: "High severity (>75% aircraft degraded)" }, + { svg: ``, label: "Medium severity (50-75% degraded)" }, + { svg: ``, label: "Low severity (25-50% degraded)" }, + ], + }, + { + name: "SURVEILLANCE / CCTV", + color: "text-green-400 border-green-500/30", + items: [ + { svg: dot("#22c55e"), label: "Individual CCTV camera (green dot)" }, + { svg: clusterCircle("#22c55e", "#16a34a"), label: "Camera cluster (count inside)" }, + { svg: ``, label: "CCTV icon (detail view)" }, + ], + }, + { + name: "OVERLAYS", + color: "text-gray-400 border-gray-500/30", + items: [ + { svg: ``, label: "Day / Night terminator" }, + { svg: ``, label: "Ukraine frontline" }, + ], + }, +]; + +const MapLegend = React.memo(function MapLegend({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) { + const [collapsed, setCollapsed] = useState>(new Set()); + + const toggle = (name: string) => { + setCollapsed(prev => { + const next = new Set(prev); + if (next.has(name)) next.delete(name); + else next.add(name); + return next; + }); + }; + + return ( + + {isOpen && ( + <> + {/* Backdrop */} + + + {/* Legend Panel */} + + {/* Header */} +
+
+
+ + + + + +
+
+

MAP LEGEND

+ ICON REFERENCE KEY +
+
+ +
+ + {/* Legend Content */} +
+ {LEGEND.map((cat) => { + const isCollapsed = collapsed.has(cat.name); + return ( +
+ {/* Category Header */} + + + {/* Items */} + + {!isCollapsed && ( + +
+ {cat.items.map((item, idx) => ( +
+ + {item.label} +
+ ))} +
+
+ )} +
+
+ ); + })} +
+ + {/* Footer */} +
+
+ {LEGEND.reduce((sum, c) => sum + c.items.length, 0)} ICON DEFINITIONS ACROSS {LEGEND.length} CATEGORIES +
+
+
+ + )} +
+ ); +}); + +export default MapLegend; diff --git a/frontend/src/components/MaplibreViewer.tsx b/frontend/src/components/MaplibreViewer.tsx new file mode 100644 index 0000000..284d785 --- /dev/null +++ b/frontend/src/components/MaplibreViewer.tsx @@ -0,0 +1,2087 @@ +"use client"; + +import React, { useMemo, useState, useEffect, useCallback, useRef } from "react"; +import Map, { Source, Layer, MapRef, ViewState, Popup, Marker } from "react-map-gl/maplibre"; +import "maplibre-gl/dist/maplibre-gl.css"; +import { computeNightPolygon } from "@/utils/solarTerminator"; +import ScaleBar from "@/components/ScaleBar"; +import maplibregl from "maplibre-gl"; +import { AlertTriangle } from "lucide-react"; +import WikiImage from "@/components/WikiImage"; + +const svgPlaneCyan = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneYellow = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneOrange = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlanePurple = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgFighter = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeli = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliCyan = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliOrange = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliPurple = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgTanker = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgRecon = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlanePink = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneAlertRed = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneDarkBlue = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneWhiteAlert = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliPink = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliAlertRed = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliDarkBlue = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliWhiteAlert = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgPlaneBlack = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgHeliBlack = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgDrone = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgShipGray = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgShipRed = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgShipYellow = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgShipBlue = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgShipWhite = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgCarrier = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgCctv = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgWarning = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgThreat = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgTriangleYellow = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; +const svgTriangleRed = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; + +// --- Aircraft type-specific SVG paths (top-down silhouettes) --- +// Airliner: wide swept wings with engine pods, narrow fuselage +const AIRLINER_PATH = "M12 2C11.2 2 10.5 2.8 10.5 3.5V8.5L3 13V15L10.5 12.5V18L8 19.5V21L12 19.5L16 21V19.5L13.5 18V12.5L21 15V13L13.5 8.5V3.5C13.5 2.8 12.8 2 12 2Z M5.5 13.5L3.5 14.5 M18.5 13.5L20.5 14.5"; +// Turboprop: straight high wings, shorter body +const TURBOPROP_PATH = "M12 3C11.3 3 10.8 3.5 10.8 4V9L3 12V13.5L10.8 11.5V18.5L9 19.5V21L12 20L15 21V19.5L13.2 18.5V11.5L21 13.5V12L13.2 9V4C13.2 3.5 12.7 3 12 3Z"; +// Bizjet: sleek, small swept wings, T-tail +const BIZJET_PATH = "M12 1.5C11.4 1.5 11 2 11 2.8V9L5 12.5V14L11 12V18.5L8.5 20V21.5L12 20.5L15.5 21.5V20L13 18.5V12L19 14V12.5L13 9V2.8C13 2 12.6 1.5 12 1.5Z"; + +function makeAircraftSvg(type: 'airliner' | 'turboprop' | 'bizjet' | 'generic', fill: string, stroke = 'black', size = 20) { + const paths: Record = { airliner: AIRLINER_PATH, turboprop: TURBOPROP_PATH, bizjet: BIZJET_PATH, generic: "M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z" }; + const p = paths[type] || paths.generic; + // Airliner gets engine pod circles + const extras = type === 'airliner' ? `` : ''; + return `data:image/svg+xml;utf8,${encodeURIComponent(`${extras}`)}`; +} + +// Pre-built aircraft SVGs by type & color +const svgAirlinerCyan = makeAircraftSvg('airliner', 'cyan'); +const svgAirlinerOrange = makeAircraftSvg('airliner', '#FF8C00'); +const svgAirlinerPurple = makeAircraftSvg('airliner', '#9B59B6'); +const svgAirlinerYellow = makeAircraftSvg('airliner', 'yellow'); +const svgAirlinerPink = makeAircraftSvg('airliner', '#FF1493', 'black', 22); +const svgAirlinerRed = makeAircraftSvg('airliner', '#FF2020', 'black', 22); +const svgAirlinerDarkBlue = makeAircraftSvg('airliner', '#1A3A8A', '#4A80D0', 22); +const svgAirlinerWhite = makeAircraftSvg('airliner', 'white', '#ff0000', 22); + +const svgTurbopropCyan = makeAircraftSvg('turboprop', 'cyan'); +const svgTurbopropOrange = makeAircraftSvg('turboprop', '#FF8C00'); +const svgTurbopropPurple = makeAircraftSvg('turboprop', '#9B59B6'); +const svgTurbopropYellow = makeAircraftSvg('turboprop', 'yellow'); +const svgTurbopropPink = makeAircraftSvg('turboprop', '#FF1493', 'black', 22); +const svgTurbopropRed = makeAircraftSvg('turboprop', '#FF2020', 'black', 22); +const svgTurbopropDarkBlue = makeAircraftSvg('turboprop', '#1A3A8A', '#4A80D0', 22); +const svgTurbopropWhite = makeAircraftSvg('turboprop', 'white', '#ff0000', 22); + +const svgBizjetCyan = makeAircraftSvg('bizjet', 'cyan'); +const svgBizjetOrange = makeAircraftSvg('bizjet', '#FF8C00'); +const svgBizjetPurple = makeAircraftSvg('bizjet', '#9B59B6'); +const svgBizjetYellow = makeAircraftSvg('bizjet', 'yellow'); +const svgBizjetPink = makeAircraftSvg('bizjet', '#FF1493', 'black', 22); +const svgBizjetRed = makeAircraftSvg('bizjet', '#FF2020', 'black', 22); +const svgBizjetDarkBlue = makeAircraftSvg('bizjet', '#1A3A8A', '#4A80D0', 22); +const svgBizjetWhite = makeAircraftSvg('bizjet', 'white', '#ff0000', 22); + +// Grey variants for grounded/parked aircraft (altitude 0) +const svgAirlinerGrey = makeAircraftSvg('airliner', '#555', '#333'); +const svgTurbopropGrey = makeAircraftSvg('turboprop', '#555', '#333'); +const svgBizjetGrey = makeAircraftSvg('bizjet', '#555', '#333'); +const svgHeliGrey = `data:image/svg+xml;utf8,${encodeURIComponent(``)}`; + +// Grey icon map for grounded aircraft +const GROUNDED_ICON_MAP: Record = { heli: 'svgHeliGrey', turboprop: 'svgTurbopropGrey', bizjet: 'svgBizjetGrey', airliner: 'svgAirlinerGrey' }; + +// ICAO type code -> aircraft shape classification +const HELI_TYPES = new Set(['R22', 'R44', 'R66', 'B06', 'B05', 'B47G', 'B105', 'B212', 'B222', 'B230', 'B407', 'B412', 'B429', 'B430', 'B505', 'BK17', 'S55', 'S58', 'S61', 'S64', 'S70', 'S76', 'S92', 'A109', 'A119', 'A139', 'A169', 'A189', 'AW09', 'EC20', 'EC25', 'EC30', 'EC35', 'EC45', 'EC55', 'EC75', 'H125', 'H130', 'H135', 'H145', 'H155', 'H160', 'H175', 'H215', 'H225', 'AS32', 'AS35', 'AS50', 'AS55', 'AS65', 'MD52', 'MD60', 'MDHI', 'MD90', 'NOTR', 'HUEY', 'GAMA', 'CABR', 'EXE', 'R300', 'R480', 'LAMA', 'ALLI', 'PUMA', 'NH90', 'CH47', 'UH1', 'UH60', 'AH64', 'MI8', 'MI24', 'MI26', 'MI28', 'KA52', 'K32', 'LYNX', 'WILD', 'MRLX', 'A149', 'A119']); +const TURBOPROP_TYPES = new Set(['AT43', 'AT45', 'AT72', 'AT73', 'AT75', 'AT76', 'B190', 'B350', 'BE20', 'BE30', 'BE40', 'BE9L', 'BE99', 'C130', 'C160', 'C208', 'C212', 'C295', 'CN35', 'D228', 'D328', 'DHC2', 'DHC3', 'DHC4', 'DHC5', 'DHC6', 'DHC7', 'DHC8', 'DO28', 'DH8A', 'DH8B', 'DH8C', 'DH8D', 'E110', 'E120', 'F27', 'F406', 'F50', 'G159', 'G73T', 'J328', 'JS31', 'JS32', 'JS41', 'L188', 'MA60', 'M28', 'N262', 'P68', 'P180', 'PA31', 'PA42', 'PC12', 'PC21', 'PC24', 'S2', 'S340', 'SF34', 'SF50', 'SW4', 'TRIS', 'TBM7', 'TBM8', 'TBM9', 'C30J', 'C5M', 'AN12', 'AN24', 'AN26', 'AN30', 'AN32', 'IL18', 'L410', 'Y12', 'BALL', 'AEST', 'AC68', 'AC80', 'AC90', 'AC95', 'AC11', 'C172', 'C182', 'C206', 'C210', 'C310', 'C337', 'C402', 'C414', 'C421', 'C425', 'C441', 'M20P', 'M20T', 'PA28', 'PA32', 'PA34', 'PA44', 'PA46', 'PA60', 'P28A', 'P28B', 'P28R', 'P32R', 'P46T', 'SR20', 'SR22', 'DA40', 'DA42', 'DA62', 'RV10', 'BE33', 'BE35', 'BE36', 'BE55', 'BE58', 'DR40', 'TB20', 'AA5']); +const BIZJET_TYPES = new Set(['ASTR', 'C25A', 'C25B', 'C25C', 'C25M', 'C500', 'C501', 'C510', 'C525', 'C526', 'C550', 'C551', 'C560', 'C56X', 'C650', 'C680', 'C700', 'C750', 'CL30', 'CL35', 'CL60', 'CONI', 'CRJX', 'E35L', 'E45X', 'E50P', 'E55P', 'F2TH', 'F900', 'FA10', 'FA20', 'FA50', 'FA7X', 'FA8X', 'G100', 'G150', 'G200', 'G280', 'GA5C', 'GA6C', 'GALX', 'GL5T', 'GL7T', 'GLEX', 'GLF2', 'GLF3', 'GLF4', 'GLF5', 'GLF6', 'H25A', 'H25B', 'H25C', 'HA4T', 'HDJT', 'LJ23', 'LJ24', 'LJ25', 'LJ28', 'LJ31', 'LJ35', 'LJ40', 'LJ45', 'LJ55', 'LJ60', 'LJ70', 'LJ75', 'MU30', 'PC24', 'PRM1', 'SBR1', 'SBR2', 'WW24', 'BE40', 'BLCF']); + +function classifyAircraft(model: string, category?: string): 'heli' | 'turboprop' | 'bizjet' | 'airliner' { + const m = (model || '').toUpperCase(); + if (category === 'heli' || HELI_TYPES.has(m)) return 'heli'; + if (BIZJET_TYPES.has(m)) return 'bizjet'; + if (TURBOPROP_TYPES.has(m)) return 'turboprop'; + return 'airliner'; +} + +// --- Smooth position interpolation helpers --- +// Given heading (degrees) and speed (knots), compute new lat/lng after dt seconds +function interpolatePosition(lat: number, lng: number, headingDeg: number, speedKnots: number, dtSeconds: number, maxDist = 3704): [number, number] { + if (!speedKnots || speedKnots <= 0 || dtSeconds <= 0) return [lat, lng]; + // Cap interpolation to max 6 seconds to prevent runaway drift when data is stale + const clampedDt = Math.min(dtSeconds, 6); + // 1 knot = 1 nautical mile/hour = 1852 m/h + const speedMps = speedKnots * 0.5144; // meters per second + const dist = maxDist > 0 ? Math.min(speedMps * clampedDt, maxDist) : speedMps * clampedDt; + const R = 6371000; // Earth radius in meters + const headingRad = (headingDeg * Math.PI) / 180; + const latRad = (lat * Math.PI) / 180; + const lngRad = (lng * Math.PI) / 180; + const newLatRad = Math.asin( + Math.sin(latRad) * Math.cos(dist / R) + + Math.cos(latRad) * Math.sin(dist / R) * Math.cos(headingRad) + ); + const newLngRad = lngRad + Math.atan2( + Math.sin(headingRad) * Math.sin(dist / R) * Math.cos(latRad), + Math.cos(dist / R) - Math.sin(latRad) * Math.sin(newLatRad) + ); + return [(newLatRad * 180) / Math.PI, (newLngRad * 180) / Math.PI]; +} + +const darkStyle = { + version: 8, + glyphs: "https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf", + sources: { + 'carto-dark': { + type: 'raster', + tiles: [ + "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://b.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://c.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png", + "https://d.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png" + ], + tileSize: 256 + } + }, + layers: [ + { + id: 'carto-dark-layer', + type: 'raster', + source: 'carto-dark', + minzoom: 0, + maxzoom: 22 + } + ] +}; + +// Satellite icon SVG builder — module-level constant (no re-creation per render) +const makeSatSvg = (color: string) => { + const svg = ` + + + + + + + `; + return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg); +}; +const MISSION_COLORS: Record = { + 'military_recon': '#ff3333', 'military_sar': '#ff3333', + 'sar': '#00e5ff', 'sigint': '#ffffff', + 'navigation': '#4488ff', 'early_warning': '#ff00ff', + 'commercial_imaging': '#44ff44', 'space_station': '#ffdd00' +}; +const MISSION_ICON_MAP: Record = { + 'military_recon': 'sat-mil', 'military_sar': 'sat-mil', + 'sar': 'sat-sar', 'sigint': 'sat-sigint', + 'navigation': 'sat-nav', 'early_warning': 'sat-ew', + 'commercial_imaging': 'sat-com', 'space_station': 'sat-station' +}; + +const MaplibreViewer = ({ data, activeLayers, onEntityClick, flyToLocation, selectedEntity, onMouseCoords, onRightClick, regionDossier, regionDossierLoading, onViewStateChange, measureMode, onMeasureClick, measurePoints }: any) => { + const mapRef = useRef(null); + + const [viewState, setViewState] = useState({ + longitude: 0, + latitude: 20, + zoom: 2, + bearing: 0, + pitch: 0, + padding: { top: 0, bottom: 0, left: 0, right: 0 } + }); + + // Viewport bounds for culling off-screen features [west, south, east, north] + // Buffer extends bounds by ~20% so features near edges don't pop in/out + const [mapBounds, setMapBounds] = useState<[number, number, number, number]>([-180, -90, 180, 90]); + const boundsTimerRef = useRef | null>(null); + + const updateBounds = useCallback(() => { + const map = mapRef.current?.getMap(); + if (!map) return; + const b = map.getBounds(); + const latRange = b.getNorth() - b.getSouth(); + const lngRange = b.getEast() - b.getWest(); + const buf = 0.2; // 20% buffer + setMapBounds([ + b.getWest() - lngRange * buf, + b.getSouth() - latRange * buf, + b.getEast() + lngRange * buf, + b.getNorth() + latRange * buf + ]); + }, []); + + // Fast bounds check — used by all GeoJSON builders and Marker loops + const inView = useCallback((lat: number, lng: number) => + lng >= mapBounds[0] && lng <= mapBounds[2] && lat >= mapBounds[1] && lat <= mapBounds[3], + [mapBounds] + ); + + const [dynamicRoute, setDynamicRoute] = useState(null); + const prevCallsign = useRef(null); + const [shipClusters, setShipClusters] = useState([]); + const [eqClusters, setEqClusters] = useState([]); + + // --- Smooth interpolation: tick counter triggers GeoJSON recalc every second --- + const [interpTick, setInterpTick] = useState(0); + const dataTimestamp = useRef(Date.now()); + + // Track when flight/ship data actually changes (new fetch arrived) + useEffect(() => { + dataTimestamp.current = Date.now(); + }, [data?.commercial_flights, data?.ships]); + + // Tick every 5s between data refreshes to animate flight positions + useEffect(() => { + const timer = setInterval(() => setInterpTick(t => t + 1), 10000); + return () => clearInterval(timer); + }, []); + + // --- Solar Terminator: recompute the night polygon every 60 seconds --- + const [nightGeoJSON, setNightGeoJSON] = useState(() => computeNightPolygon()); + useEffect(() => { + const timer = setInterval(() => setNightGeoJSON(computeNightPolygon()), 60000); + return () => clearInterval(timer); + }, []); + + useEffect(() => { + let isMounted = true; + + let callsign = null; + if (selectedEntity && data) { + let entity = null; + if (selectedEntity.type === 'flight') entity = data?.commercial_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_flight') entity = data?.private_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'military_flight') entity = data?.military_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_jet') entity = data?.private_jets?.[selectedEntity.id as number]; + + if (entity && entity.callsign) { + callsign = entity.callsign; + } + } + + if (callsign && callsign !== prevCallsign.current) { + prevCallsign.current = callsign; + fetch(`http://localhost:8000/api/route/${callsign}`) + .then(res => res.json()) + .then(routeData => { + if (isMounted) setDynamicRoute(routeData); + }) + .catch(() => { + if (isMounted) setDynamicRoute(null); + }); + } else if (!callsign) { + prevCallsign.current = null; + if (isMounted) setDynamicRoute(null); + } + + return () => { isMounted = false; }; + }, [selectedEntity, data]); + + useEffect(() => { + if (flyToLocation && mapRef.current) { + mapRef.current.flyTo({ + center: [flyToLocation.lng, flyToLocation.lat], + zoom: 8, + duration: 1500 + }); + } + }, [flyToLocation]); + + const earthquakesGeoJSON = useMemo(() => { + if (!activeLayers.earthquakes || !data?.earthquakes) return null; + return { + type: 'FeatureCollection', + features: data.earthquakes.map((eq: any, i: number) => { + if (eq.lat == null || eq.lng == null) return null; + return { + type: 'Feature', + properties: { + id: i, + type: 'earthquake', + name: `[M${eq.mag}]\n${eq.place || 'Unknown Location'}`, + title: eq.title + }, + geometry: { type: 'Point', coordinates: [eq.lng, eq.lat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.earthquakes, data?.earthquakes]); + + // GPS Jamming zones — 1°×1° grid squares colored by severity + const jammingGeoJSON = useMemo(() => { + if (!activeLayers.gps_jamming || !data?.gps_jamming?.length) return null; + return { + type: 'FeatureCollection' as const, + features: data.gps_jamming.map((zone: any, i: number) => { + const halfDeg = 0.5; + const lat = zone.lat; + const lng = zone.lng; + return { + type: 'Feature' as const, + properties: { + id: i, + severity: zone.severity, + ratio: zone.ratio, + degraded: zone.degraded, + total: zone.total, + opacity: zone.severity === 'high' ? 0.45 : zone.severity === 'medium' ? 0.3 : 0.18 + }, + geometry: { + type: 'Polygon' as const, + coordinates: [[ + [lng - halfDeg, lat - halfDeg], + [lng + halfDeg, lat - halfDeg], + [lng + halfDeg, lat + halfDeg], + [lng - halfDeg, lat + halfDeg], + [lng - halfDeg, lat - halfDeg] + ]] + } + }; + }) + }; + }, [activeLayers.gps_jamming, data?.gps_jamming]); + + // CCTV cameras — clustered green dots + const cctvGeoJSON = useMemo(() => { + if (!activeLayers.cctv || !data?.cctv?.length) return null; + return { + type: 'FeatureCollection' as const, + features: data.cctv.filter((c: any) => c.lat != null && c.lon != null && inView(c.lat, c.lon)).map((c: any, i: number) => ({ + type: 'Feature' as const, + properties: { + id: c.id || i, + type: 'cctv', + name: c.direction_facing || 'Camera', + source_agency: c.source_agency || 'Unknown', + media_url: c.media_url || '', + media_type: c.media_type || 'image' + }, + geometry: { type: 'Point' as const, coordinates: [c.lon, c.lat] } + })) + }; + }, [activeLayers.cctv, data?.cctv, inView]); + + // Load Images into the Map Style once loaded + const onMapLoad = useCallback((e: any) => { + const map = e.target; + + const loadImg = (id: string, url: string) => { + if (!map.hasImage(id)) { + const img = new Image(); + img.crossOrigin = "anonymous"; + img.src = url; + img.onload = () => map.addImage(id, img); + } + }; + + // Legacy generic plane icons (still used as fallbacks) + loadImg('svgPlaneCyan', svgPlaneCyan); + loadImg('svgPlaneYellow', svgPlaneYellow); + loadImg('svgPlaneOrange', svgPlaneOrange); + loadImg('svgPlanePurple', svgPlanePurple); + loadImg('svgPlanePink', svgPlanePink); + loadImg('svgPlaneAlertRed', svgPlaneAlertRed); + loadImg('svgPlaneDarkBlue', svgPlaneDarkBlue); + loadImg('svgPlaneWhiteAlert', svgPlaneWhiteAlert); + loadImg('svgPlaneBlack', svgPlaneBlack); + // Heli icons + loadImg('svgHeli', svgHeli); + loadImg('svgHeliCyan', svgHeliCyan); + loadImg('svgHeliOrange', svgHeliOrange); + loadImg('svgHeliPurple', svgHeliPurple); + loadImg('svgHeliPink', svgHeliPink); + loadImg('svgHeliAlertRed', svgHeliAlertRed); + loadImg('svgHeliDarkBlue', svgHeliDarkBlue); + loadImg('svgHeliWhiteAlert', svgHeliWhiteAlert); + loadImg('svgHeliBlack', svgHeliBlack); + // Military special + loadImg('svgFighter', svgFighter); + loadImg('svgTanker', svgTanker); + loadImg('svgRecon', svgRecon); + // Airliner icons (swept wings + engine pods) + loadImg('svgAirlinerCyan', svgAirlinerCyan); + loadImg('svgAirlinerOrange', svgAirlinerOrange); + loadImg('svgAirlinerPurple', svgAirlinerPurple); + loadImg('svgAirlinerYellow', svgAirlinerYellow); + loadImg('svgAirlinerPink', svgAirlinerPink); + loadImg('svgAirlinerRed', svgAirlinerRed); + loadImg('svgAirlinerDarkBlue', svgAirlinerDarkBlue); + loadImg('svgAirlinerWhite', svgAirlinerWhite); + // Turboprop icons (straight wings) + loadImg('svgTurbopropCyan', svgTurbopropCyan); + loadImg('svgTurbopropOrange', svgTurbopropOrange); + loadImg('svgTurbopropPurple', svgTurbopropPurple); + loadImg('svgTurbopropYellow', svgTurbopropYellow); + loadImg('svgTurbopropPink', svgTurbopropPink); + loadImg('svgTurbopropRed', svgTurbopropRed); + loadImg('svgTurbopropDarkBlue', svgTurbopropDarkBlue); + loadImg('svgTurbopropWhite', svgTurbopropWhite); + // Bizjet icons (sleek, T-tail) + loadImg('svgBizjetCyan', svgBizjetCyan); + loadImg('svgBizjetOrange', svgBizjetOrange); + loadImg('svgBizjetPurple', svgBizjetPurple); + loadImg('svgBizjetYellow', svgBizjetYellow); + loadImg('svgBizjetPink', svgBizjetPink); + loadImg('svgBizjetRed', svgBizjetRed); + loadImg('svgBizjetDarkBlue', svgBizjetDarkBlue); + loadImg('svgBizjetWhite', svgBizjetWhite); + // Grey grounded icons + loadImg('svgAirlinerGrey', svgAirlinerGrey); + loadImg('svgTurbopropGrey', svgTurbopropGrey); + loadImg('svgBizjetGrey', svgBizjetGrey); + loadImg('svgHeliGrey', svgHeliGrey); + loadImg('svgDrone', svgDrone); + loadImg('svgShipGray', svgShipGray); + loadImg('svgShipRed', svgShipRed); + loadImg('svgShipYellow', svgShipYellow); + loadImg('svgShipBlue', svgShipBlue); + loadImg('svgShipWhite', svgShipWhite); + loadImg('svgCarrier', svgCarrier); + loadImg('svgCctv', svgCctv); + loadImg('svgWarning', svgWarning); + loadImg('icon-threat', svgThreat); + loadImg('icon-liveua-yellow', svgTriangleYellow); + loadImg('icon-liveua-red', svgTriangleRed); + + // Satellite mission-type icons + loadImg('sat-mil', makeSatSvg('#ff3333')); + loadImg('sat-sar', makeSatSvg('#00e5ff')); + loadImg('sat-sigint', makeSatSvg('#ffffff')); + loadImg('sat-nav', makeSatSvg('#4488ff')); + loadImg('sat-ew', makeSatSvg('#ff00ff')); + loadImg('sat-com', makeSatSvg('#44ff44')); + loadImg('sat-station', makeSatSvg('#ffdd00')); + loadImg('sat-gen', makeSatSvg('#aaaaaa')); + }, []); + + // Build a set of tracked icao24s to exclude from other flight layers + const trackedIcaoSet = useMemo(() => { + const s = new Set(); + if (data?.tracked_flights) { + for (const t of data.tracked_flights) { + if (t.icao24) s.add(t.icao24.toLowerCase()); + } + } + return s; + }, [data?.tracked_flights]); + + // Elapsed seconds since last data refresh (used for position interpolation) + // interpTick dependency forces recalculation every 1s tick + const dtSeconds = useMemo(() => { + void interpTick; // use the tick to trigger recalc + return (Date.now() - dataTimestamp.current) / 1000; + }, [interpTick]); + + // Helper: interpolate a flight's position if airborne and has speed+heading + const interpFlight = (f: any): [number, number] => { + // Fast path: skip trig for stationary/grounded/no-speed aircraft + if (!f.speed_knots || f.speed_knots <= 0 || dtSeconds <= 0) return [f.lng, f.lat]; + if (f.alt != null && f.alt <= 100) return [f.lng, f.lat]; + // Only interpolate if enough time has passed to matter (>1s) + if (dtSeconds < 1) return [f.lng, f.lat]; + const heading = f.true_track || f.heading || 0; + const [newLat, newLng] = interpolatePosition(f.lat, f.lng, heading, f.speed_knots, dtSeconds); + return [newLng, newLat]; + }; + + // Helper: interpolate a ship's position using SOG + heading + const interpShip = (s: any): [number, number] => { + if (typeof s.sog !== 'number' || !s.sog || s.sog <= 0 || dtSeconds <= 0) return [s.lng, s.lat]; + const heading = (typeof s.cog === 'number' ? s.cog : 0) || s.heading || 0; + const [newLat, newLng] = interpolatePosition(s.lat, s.lng, heading, s.sog, dtSeconds); + return [newLng, newLat]; + }; + + // Helper: interpolate a satellite's position — reuses interpolatePosition with no distance cap + const interpSat = (s: any): [number, number] => { + if (!s.speed_knots || s.speed_knots <= 0 || dtSeconds < 1) return [s.lng, s.lat]; + const [newLat, newLng] = interpolatePosition(s.lat, s.lng, s.heading || 0, s.speed_knots, dtSeconds, 0); + return [newLng, newLat]; + }; + + // Satellite GeoJSON with interpolated positions + const satellitesGeoJSON = useMemo(() => { + if (!activeLayers.satellites || !data?.satellites?.length) return null; + return { + type: 'FeatureCollection' as const, + features: data.satellites.filter((s: any) => s.lat != null && s.lng != null && inView(s.lat, s.lng)).map((s: any, i: number) => ({ + type: 'Feature' as const, + properties: { + id: s.id || i, + type: 'satellite', + name: s.name, + mission: s.mission || 'general', + sat_type: s.sat_type || 'Satellite', + country: s.country || '', + alt_km: s.alt_km || 0, + wiki: s.wiki || '', + color: MISSION_COLORS[s.mission] || '#aaaaaa', + iconId: MISSION_ICON_MAP[s.mission] || 'sat-gen' + }, + geometry: { type: 'Point' as const, coordinates: interpSat(s) } + })) + }; + }, [activeLayers.satellites, data?.satellites, dtSeconds, inView]); + + + // Create GeoJSON collections dynamically (this runs ultra fast in pure JS) + const commFlightsGeoJSON = useMemo(() => { + if (!activeLayers.flights || !data?.commercial_flights) return null; + const colorMap: Record = { heli: 'svgHeliCyan', turboprop: 'svgTurbopropCyan', bizjet: 'svgBizjetCyan', airliner: 'svgAirlinerCyan' }; + return { + type: 'FeatureCollection', + features: data.commercial_flights.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + if (!inView(f.lat, f.lng)) return null; + if (f.icao24 && trackedIcaoSet.has(f.icao24.toLowerCase())) return null; + const acType = classifyAircraft(f.model, f.aircraft_category); + const grounded = f.alt != null && f.alt <= 100; + const [iLng, iLat] = interpFlight(f); + return { + type: 'Feature', + properties: { id: i, type: 'flight', callsign: f.callsign || f.icao24, rotation: f.true_track || f.heading || 0, iconId: grounded ? GROUNDED_ICON_MAP[acType] : colorMap[acType] }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.flights, data?.commercial_flights, trackedIcaoSet, dtSeconds, inView]); + + const privFlightsGeoJSON = useMemo(() => { + if (!activeLayers.private || !data?.private_flights) return null; + const colorMap: Record = { heli: 'svgHeliOrange', turboprop: 'svgTurbopropOrange', bizjet: 'svgBizjetOrange', airliner: 'svgAirlinerOrange' }; + return { + type: 'FeatureCollection', + features: data.private_flights.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + if (!inView(f.lat, f.lng)) return null; + if (f.icao24 && trackedIcaoSet.has(f.icao24.toLowerCase())) return null; + const acType = classifyAircraft(f.model, f.aircraft_category); + const grounded = f.alt != null && f.alt <= 100; + const [iLng, iLat] = interpFlight(f); + return { + type: 'Feature', + properties: { id: i, type: 'private_flight', callsign: f.callsign || f.icao24, rotation: f.heading || 0, iconId: grounded ? GROUNDED_ICON_MAP[acType] : colorMap[acType] }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.private, data?.private_flights, trackedIcaoSet, dtSeconds, inView]); + + const privJetsGeoJSON = useMemo(() => { + if (!activeLayers.jets || !data?.private_jets) return null; + const colorMap: Record = { heli: 'svgHeliPurple', turboprop: 'svgTurbopropPurple', bizjet: 'svgBizjetPurple', airliner: 'svgAirlinerPurple' }; + return { + type: 'FeatureCollection', + features: data.private_jets.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + if (!inView(f.lat, f.lng)) return null; + if (f.icao24 && trackedIcaoSet.has(f.icao24.toLowerCase())) return null; + const acType = classifyAircraft(f.model, f.aircraft_category); + const grounded = f.alt != null && f.alt <= 100; + const [iLng, iLat] = interpFlight(f); + return { + type: 'Feature', + properties: { id: i, type: 'private_jet', callsign: f.callsign || f.icao24, rotation: f.heading || 0, iconId: grounded ? GROUNDED_ICON_MAP[acType] : colorMap[acType] }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.jets, data?.private_jets, trackedIcaoSet, dtSeconds, inView]); + + const milFlightsGeoJSON = useMemo(() => { + if (!activeLayers.military || !data?.military_flights) return null; + + // Special military types keep their unique icons + const milSpecialMap: any = { 'fighter': 'svgFighter', 'tanker': 'svgTanker', 'recon': 'svgRecon' }; + // Fallback by aircraft shape for cargo/default + const milColorMap: Record = { heli: 'svgHeli', turboprop: 'svgTurbopropYellow', bizjet: 'svgBizjetYellow', airliner: 'svgAirlinerYellow' }; + + return { + type: 'FeatureCollection', + features: data.military_flights.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + if (!inView(f.lat, f.lng)) return null; + if (f.icao24 && trackedIcaoSet.has(f.icao24.toLowerCase())) return null; + const milType = f.military_type || 'default'; + const grounded = f.alt != null && f.alt <= 100; + let iconId = milSpecialMap[milType]; + if (!iconId) { + const acType = classifyAircraft(f.model, f.aircraft_category); + iconId = grounded ? GROUNDED_ICON_MAP[acType] : milColorMap[acType]; + } else if (grounded) { + const acType = classifyAircraft(f.model, f.aircraft_category); + iconId = GROUNDED_ICON_MAP[acType]; + } + const [iLng, iLat] = interpFlight(f); + return { + type: 'Feature', + properties: { id: i, type: 'military_flight', callsign: f.callsign || f.icao24, rotation: f.heading || 0, iconId }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.military, data?.military_flights, trackedIcaoSet, dtSeconds, inView]); + + const shipsGeoJSON = useMemo(() => { + if (!(activeLayers.ships_important || activeLayers.ships_civilian || activeLayers.ships_passenger) || !data?.ships) return null; + + return { + type: 'FeatureCollection', + features: data.ships.map((s: any, i: number) => { + if (s.lat == null || s.lng == null) return null; + if (!inView(s.lat, s.lng)) return null; + + const isImportant = s.type === 'carrier' || s.type === 'military_vessel' || s.type === 'tanker' || s.type === 'cargo'; + const isPassenger = s.type === 'passenger'; + + // Carriers are now handled by a dedicated unclustered source + if (s.type === 'carrier') return null; + + if (isImportant && activeLayers?.ships_important === false) return null; + if (isPassenger && activeLayers?.ships_passenger === false) return null; + if (!isImportant && !isPassenger && activeLayers?.ships_civilian === false) return null; + + let iconId = 'svgShipBlue'; + if (s.type === 'carrier') { + iconId = 'svgCarrier'; + } else if (s.type === 'tanker' || s.type === 'cargo') { + iconId = 'svgShipRed'; + } else if (s.type === 'yacht' || s.type === 'passenger') { + iconId = 'svgShipWhite'; + } else if (s.type === 'military_vessel') { + iconId = 'svgShipYellow'; + } + + const [iLng, iLat] = interpShip(s); + return { + type: 'Feature', + properties: { id: i, type: 'ship', name: s.name, rotation: s.heading || 0, iconId }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.ships_important, activeLayers.ships_civilian, activeLayers.ships_passenger, data?.ships, inView]); + + // Extract ship cluster positions from the map source for HTML labels + useEffect(() => { + const map = mapRef.current?.getMap(); + if (!map || !shipsGeoJSON) { setShipClusters([]); return; } + + const update = () => { + try { + const features = map.querySourceFeatures('ships'); + const clusters = features + .filter((f: any) => f.properties?.cluster) + .map((f: any) => ({ + lng: (f.geometry as any).coordinates[0], + lat: (f.geometry as any).coordinates[1], + count: f.properties.point_count_abbreviated || f.properties.point_count, + id: f.properties.cluster_id + })); + const seen = new Set(); + const unique = clusters.filter((c: any) => { if (seen.has(c.id)) return false; seen.add(c.id); return true; }); + setShipClusters(unique); + } catch { setShipClusters([]); } + }; + + map.on('moveend', update); + map.on('sourcedata', update); + setTimeout(update, 500); + + return () => { map.off('moveend', update); map.off('sourcedata', update); }; + }, [shipsGeoJSON]); + + // Extract earthquake cluster positions from the map source for HTML labels + useEffect(() => { + const map = mapRef.current?.getMap(); + if (!map || !earthquakesGeoJSON) { setEqClusters([]); return; } + + const update = () => { + try { + const features = map.querySourceFeatures('earthquakes'); + const clusters = features + .filter((f: any) => f.properties?.cluster) + .map((f: any) => ({ + lng: (f.geometry as any).coordinates[0], + lat: (f.geometry as any).coordinates[1], + count: f.properties.point_count_abbreviated || f.properties.point_count, + id: f.properties.cluster_id + })); + const seen = new Set(); + const unique = clusters.filter((c: any) => { if (seen.has(c.id)) return false; seen.add(c.id); return true; }); + setEqClusters(unique); + } catch { setEqClusters([]); } + }; + + map.on('moveend', update); + map.on('sourcedata', update); + setTimeout(update, 500); + + return () => { map.off('moveend', update); map.off('sourcedata', update); }; + }, [earthquakesGeoJSON]); + + const carriersGeoJSON = useMemo(() => { + if (!activeLayers.ships_important || !data?.ships) return null; + return { + type: 'FeatureCollection', + features: data.ships.map((s: any, i: number) => { + if (s.type !== 'carrier' || s.lat == null || s.lng == null) return null; + const [iLng, iLat] = interpShip(s); + return { + type: 'Feature', + properties: { id: i, type: 'ship', name: s.name, rotation: s.heading || 0, iconId: 'svgCarrier' }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.ships_important, data?.ships]); + + const activeRouteGeoJSON = useMemo(() => { + if (!selectedEntity || !data) return null; + + let entity = null; + if (selectedEntity.type === 'flight') entity = data?.commercial_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_flight') entity = data?.private_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'military_flight') entity = data?.military_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_jet') entity = data?.private_jets?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'ship') entity = data?.ships?.[selectedEntity.id as number]; + + if (!entity) return null; + + const currentLoc = [entity.lng, entity.lat]; + let originLoc = entity.origin_loc; // [lng, lat] + let destLoc = entity.dest_loc; // [lng, lat] + + if (dynamicRoute && dynamicRoute.orig_loc && dynamicRoute.dest_loc) { + originLoc = dynamicRoute.orig_loc; + destLoc = dynamicRoute.dest_loc; + } + + const features = []; + if (originLoc) { + features.push({ + type: 'Feature', + properties: { type: 'route-origin' }, + geometry: { type: 'LineString', coordinates: [currentLoc, originLoc] } + }); + } + if (destLoc) { + features.push({ + type: 'Feature', + properties: { type: 'route-dest' }, + geometry: { type: 'LineString', coordinates: [currentLoc, destLoc] } + }); + } + + if (features.length === 0) return null; + return { type: 'FeatureCollection', features }; + }, [selectedEntity, data, dynamicRoute]); + + // Trail history GeoJSON: shows where an aircraft has been (from backend trail data) + const trailGeoJSON = useMemo(() => { + if (!selectedEntity || !data) return null; + + let entity = null; + if (selectedEntity.type === 'flight') entity = data?.commercial_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_flight') entity = data?.private_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'military_flight') entity = data?.military_flights?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'private_jet') entity = data?.private_jets?.[selectedEntity.id as number]; + else if (selectedEntity.type === 'tracked_flight') entity = data?.tracked_flights?.[selectedEntity.id as number]; + + if (!entity || !entity.trail || entity.trail.length < 2) return null; + + // trail points are [lat, lng, alt, timestamp] — convert to [lng, lat] for GeoJSON + const coords = entity.trail.map((p: number[]) => [p[1], p[0]]); + // Append current position as the final point + if (entity.lat != null && entity.lng != null) { + coords.push([entity.lng, entity.lat]); + } + + return { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: { type: 'trail' }, + geometry: { type: 'LineString', coordinates: coords } + }] + }; + }, [selectedEntity, data]); + + const spreadAlerts = useMemo(() => { + if (!data?.news) return []; + + // 1. Prepare items with screen-space coordinates (Mercator approx) + // We use a relative pixel projection based on zoom to detect visual collisions. + const pixelsPerDeg = 256 * Math.pow(2, viewState.zoom) / 360; + + // Use original array mapping to preserve correct indices for the popup/selection logic + // Estimate each box's rendered height based on its content. + // CSS: padding 5px top/bottom, title maxWidth 160px at 9px font (~18 chars/line), + // header "!! ALERT LVL X !!" = 14px, title lines * 13px each, footer 12px if present + const estimateBoxH = (n: any) => { + const titleLen = (n.title || '').length; + const titleLines = Math.max(1, Math.ceil(titleLen / 20)); // ~20 chars per line at 9px in 160px + const hasFooter = (n.cluster_count || 1) > 1; + return 10 + 14 + (titleLines * 13) + (hasFooter ? 14 : 0) + 10; // padding + header + title + footer + padding + }; + + let items = data.news + .map((n: any, idx: number) => ({ ...n, originalIdx: idx })) + .filter((n: any) => n.coords) + .map((n: any) => ({ + ...n, + x: n.coords[1] * pixelsPerDeg, + y: -n.coords[0] * pixelsPerDeg, + offsetX: 0, + offsetY: 0, + boxH: estimateBoxH(n), + })); + + // Box width is consistent (minWidth 120 + padding, titles up to 160px + 16px padding) + const BOX_W = 180; + const GAP = 6; // Minimum gap between boxes + const MAX_OFFSET = 350; + + // 2. Iterative Collision Resolution Loop + const maxIter = 40; + for (let iter = 0; iter < maxIter; iter++) { + let moved = false; + for (let i = 0; i < items.length; i++) { + for (let j = i + 1; j < items.length; j++) { + const a = items[i]; + const b = items[j]; + + const aX = a.x + a.offsetX; + const aY = a.y + a.offsetY; + const bX = b.x + b.offsetX; + const bY = b.y + b.offsetY; + + const dx = Math.abs(aX - bX); + const dy = Math.abs(aY - bY); + + // Per-pair min distances using each box's actual estimated height + const minDistX = BOX_W + GAP; + const minDistY = (a.boxH + b.boxH) / 2 + GAP; + + if (dx < minDistX && dy < minDistY) { + moved = true; + + const overlapX = minDistX - dx; + const overlapY = minDistY - dy; + + // Push each by half the overlap + 1px to guarantee separation + if (overlapY < overlapX) { + const push = (overlapY / 2) + 1; + if (aY <= bY) { a.offsetY -= push; b.offsetY += push; } + else { a.offsetY += push; b.offsetY -= push; } + } else { + const push = (overlapX / 2) + 1; + if (aX <= bX) { a.offsetX -= push; b.offsetX += push; } + else { a.offsetX += push; b.offsetX -= push; } + } + } + } + } + if (!moved) break; + } + + // Clamp offsets so boxes stay near their origin + for (const item of items) { + item.offsetX = Math.max(-MAX_OFFSET, Math.min(MAX_OFFSET, item.offsetX)); + item.offsetY = Math.max(-MAX_OFFSET, Math.min(MAX_OFFSET, item.offsetY)); + } + + return items.map((item: any) => ({ + ...item, + showLine: Math.abs(item.offsetX) > 5 || Math.abs(item.offsetY) > 5 + })); + }, [data?.news, Math.round(viewState.zoom)]); + + const trackedFlightsGeoJSON = useMemo(() => { + if (!activeLayers.tracked || !data?.tracked_flights) return null; + + // Tracked icon maps by aircraft shape and alert color + const trackedIconMap: Record> = { + heli: { pink: 'svgHeliPink', red: 'svgHeliAlertRed', darkblue: 'svgHeliDarkBlue', white: 'svgHeliWhiteAlert' }, + airliner: { pink: 'svgAirlinerPink', red: 'svgAirlinerRed', darkblue: 'svgAirlinerDarkBlue', white: 'svgAirlinerWhite' }, + turboprop: { pink: 'svgTurbopropPink', red: 'svgTurbopropRed', darkblue: 'svgTurbopropDarkBlue', white: 'svgTurbopropWhite' }, + bizjet: { pink: 'svgBizjetPink', red: 'svgBizjetRed', darkblue: 'svgBizjetDarkBlue', white: 'svgBizjetWhite' }, + }; + + return { + type: 'FeatureCollection', + features: data.tracked_flights.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + + const alertColor = f.alert_color || 'white'; + const acType = classifyAircraft(f.model, f.aircraft_category); + const grounded = f.alt != null && f.alt <= 100; + const iconId = grounded ? GROUNDED_ICON_MAP[acType] : (trackedIconMap[acType]?.[alertColor] || trackedIconMap.airliner[alertColor] || 'svgAirlinerWhite'); + + const displayName = f.alert_operator || f.operator || f.owner || f.name || f.callsign || f.icao24 || "UNKNOWN"; + + const [iLng, iLat] = interpFlight(f); + return { + type: 'Feature', + properties: { id: i, type: 'tracked_flight', callsign: String(displayName), rotation: f.heading || 0, iconId }, + geometry: { type: 'Point', coordinates: [iLng, iLat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.tracked, data?.tracked_flights, dtSeconds]); + + const uavGeoJSON = useMemo(() => { + if (!activeLayers.military || !data?.uavs) return null; + return { + type: 'FeatureCollection', + features: data.uavs.map((uav: any, i: number) => { + if (uav.lat == null || uav.lng == null) return null; + return { + type: 'Feature', + properties: { + id: uav.id || i, + type: 'uav', + callsign: uav.callsign, + rotation: uav.heading || 0, + iconId: 'svgDrone', + name: uav.aircraft_model || uav.callsign, + country: uav.country || '', + uav_type: uav.uav_type || '', + alt: uav.alt || 0, + range_km: uav.range_km || 0, + wiki: uav.wiki || '', + speed_knots: uav.speed_knots || 0 + }, + geometry: { type: 'Point', coordinates: [uav.lng, uav.lat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.military, data?.uavs]); + + // UAV operational range circle — only for the selected UAV + const uavRangeGeoJSON = useMemo(() => { + if (!activeLayers.military || !data?.uavs || selectedEntity?.type !== 'uav') return null; + const uav = data.uavs.find((u: any) => u.id === selectedEntity.id); + if (!uav?.center || !uav?.range_km) return null; + const R = 6371; + const rangeDeg = uav.range_km / R * (180 / Math.PI); + const centerLat = uav.center[0]; + const centerLng = uav.center[1]; + const coords: number[][] = []; + for (let i = 0; i <= 64; i++) { + const angle = (i / 64) * 2 * Math.PI; + const lat = centerLat + rangeDeg * Math.sin(angle); + const lng = centerLng + rangeDeg * Math.cos(angle) / Math.cos(centerLat * Math.PI / 180); + coords.push([lng, lat]); + } + return { + type: 'FeatureCollection' as const, + features: [{ + type: 'Feature' as const, + properties: { name: uav.callsign, range_km: uav.range_km }, + geometry: { type: 'Polygon' as const, coordinates: [coords] } + }] + }; + }, [activeLayers.military, data?.uavs, selectedEntity]); + + const gdeltGeoJSON = useMemo(() => { + if (!activeLayers.global_incidents || !data?.gdelt) return null; + return { + type: 'FeatureCollection', + features: data.gdelt.map((g: any, i: number) => { + if (!g.geometry || !g.geometry.coordinates) return null; + return { + type: 'Feature', + properties: { id: i, type: 'gdelt', title: g.title }, + geometry: g.geometry + }; + }).filter(Boolean) + }; + }, [activeLayers.global_incidents, data?.gdelt]); + + const liveuaGeoJSON = useMemo(() => { + if (!activeLayers.global_incidents || !data?.liveuamap) return null; + return { + type: 'FeatureCollection', + features: data.liveuamap.map((incident: any, i: number) => { + if (incident.lat == null || incident.lng == null) return null; + const isViolent = /bomb|missil|strike|attack|kill|destroy|fire|shoot|expl|raid/i.test(incident.title || ""); + return { + type: 'Feature', + properties: { id: incident.id, type: 'liveuamap', title: incident.title, iconId: isViolent ? 'icon-liveua-red' : 'icon-liveua-yellow' }, + geometry: { type: 'Point', coordinates: [incident.lng, incident.lat] } + }; + }).filter(Boolean) + }; + }, [activeLayers.global_incidents, data?.liveuamap]); + + const frontlineGeoJSON = useMemo(() => { + if (!activeLayers.ukraine_frontline || !data?.frontlines) return null; + return data.frontlines; // Frontlines is already a fully formed GeoJSON FeatureCollection + }, [activeLayers.ukraine_frontline, data?.frontlines]); + + + + const activeInteractiveLayerIds = [ + commFlightsGeoJSON && 'commercial-flights-layer', + privFlightsGeoJSON && 'private-flights-layer', + privJetsGeoJSON && 'private-jets-layer', + milFlightsGeoJSON && 'military-flights-layer', + shipsGeoJSON && 'ships-clusters-layer', + shipsGeoJSON && 'ships-layer', + carriersGeoJSON && 'carriers-layer', + trackedFlightsGeoJSON && 'tracked-flights-layer', + uavGeoJSON && 'uav-layer', + gdeltGeoJSON && 'gdelt-layer', + liveuaGeoJSON && 'liveuamap-layer', + frontlineGeoJSON && 'ukraine-frontline-layer', + earthquakesGeoJSON && 'earthquakes-layer', + satellitesGeoJSON && 'satellites-layer', + cctvGeoJSON && 'cctv-layer' + ].filter(Boolean) as string[]; + + + const handleMouseMove = useCallback((evt: any) => { + if (onMouseCoords) onMouseCoords({ lat: evt.lngLat.lat, lng: evt.lngLat.lng }); + }, [onMouseCoords]); + + const opacityFilter: any = selectedEntity + ? ['case', ['all', ['==', ['get', 'type'], selectedEntity.type], ['==', ['get', 'id'], selectedEntity.id]], 1.0, 0.0] + : 1.0; + + return ( +
+ { + setViewState(evt.viewState); + onViewStateChange?.({ zoom: evt.viewState.zoom, latitude: evt.viewState.latitude }); + // Debounce bounds update to avoid thrashing during drag + if (boundsTimerRef.current) clearTimeout(boundsTimerRef.current); + boundsTimerRef.current = setTimeout(updateBounds, 300); + }} + onMouseMove={handleMouseMove} + onContextMenu={(evt) => { + evt.preventDefault(); + onRightClick?.({ lat: evt.lngLat.lat, lng: evt.lngLat.lng }); + }} + mapStyle={darkStyle as any} + mapLib={maplibregl} + onLoad={onMapLoad} + onIdle={updateBounds} + interactiveLayerIds={activeInteractiveLayerIds} + onClick={(e) => { + // Measurement mode: place waypoints instead of selecting entities + if (measureMode && onMeasureClick) { + onMeasureClick({ lat: e.lngLat.lat, lng: e.lngLat.lng }); + return; + } + if (selectedEntity) { + onEntityClick?.(null); + } else if (e.features && e.features.length > 0) { + const feature = e.features[0]; + const props = feature.properties || {}; + onEntityClick?.({ + id: props.id, + type: props.type, + name: props.name, + media_url: props.media_url, + extra: props + }); + } else { + onEntityClick?.(null); + } + }} + > + {/* SOLAR TERMINATOR — night overlay */} + {activeLayers.day_night && nightGeoJSON && ( + + + + )} + + {commFlightsGeoJSON && ( + + + + )} + + {privFlightsGeoJSON && ( + + + + )} + + {privJetsGeoJSON && ( + + + + )} + + {milFlightsGeoJSON && ( + + + + )} + + {shipsGeoJSON && ( + + {/* Clustered circles */} + + + {/* Cluster count - rendered via HTML markers below */} + + + {/* Unclustered individual ships (Cargo, Tankers, etc.) */} + + + )} + + {carriersGeoJSON && ( + + + + )} + + + {activeRouteGeoJSON && ( + + + + )} + + {/* Flight trail history (where the aircraft has been) */} + {trailGeoJSON && ( + + + + )} + + {trackedFlightsGeoJSON && ( + + + + )} + + {uavGeoJSON && ( + + + + )} + + {/* UAV Operational Range Circles */} + {uavRangeGeoJSON && ( + + + + + )} + + {gdeltGeoJSON && ( + + + + )} + + {liveuaGeoJSON && ( + + + + )} + + {/* HTML labels for ship cluster counts (hidden when any entity popup is active) */} + {shipsGeoJSON && !selectedEntity && shipClusters.map((c: any) => ( + +
+ {c.count} +
+
+ ))} + + {/* HTML labels for tracked flights (pink names, grey when grounded) */} + {trackedFlightsGeoJSON && !selectedEntity && data?.tracked_flights?.map((f: any, i: number) => { + if (f.lat == null || f.lng == null) return null; + if (!inView(f.lat, f.lng)) return null; + const displayName = f.alert_operator || f.operator || f.owner || f.name || f.callsign || f.icao24 || "UNKNOWN"; + const grounded = f.alt != null && f.alt <= 100; + const [iLng, iLat] = interpFlight(f); + return ( + +
+ {String(displayName)} +
+
+ ); + })} + + {/* HTML labels for carriers (orange names) */} + {carriersGeoJSON && !selectedEntity && data?.ships?.map((s: any, i: number) => { + if (s.type !== 'carrier' || s.lat == null || s.lng == null) return null; + if (!inView(s.lat, s.lng)) return null; + const [iLng, iLat] = interpShip(s); + return ( + +
+ [[{s.name}]] +
+
+ ); + })} + + {/* HTML labels for earthquake cluster counts (hidden when any entity popup is active) */} + {earthquakesGeoJSON && !selectedEntity && eqClusters.map((c: any) => ( + +
+ {c.count} +
+
+ ))} + + {/* HTML labels for UAVs (orange names) */} + {uavGeoJSON && !selectedEntity && data?.uavs?.map((uav: any, i: number) => { + if (uav.lat == null || uav.lng == null) return null; + if (!inView(uav.lat, uav.lng)) return null; + const name = uav.aircraft_model ? `[UAV: ${uav.aircraft_model}]` : `[UAV: ${uav.callsign}]`; + return ( + +
+ {name} +
+
+ ); + })} + + {/* HTML labels for earthquakes (yellow) - only show when zoomed in (~2000 miles = zoom ~5) */} + {earthquakesGeoJSON && !selectedEntity && viewState.zoom >= 5 && data?.earthquakes?.map((eq: any, i: number) => { + if (eq.lat == null || eq.lng == null) return null; + if (!inView(eq.lat, eq.lng)) return null; + return ( + +
+ [M{eq.mag}] {eq.place || ''} +
+
+ ); + })} + + {/* Maplibre HTML Custom Markers for high-importance Threat Overlays (highest z-index) */} + {activeLayers.global_incidents && spreadAlerts.map((n: any) => { + const idx = n.originalIdx; + const count = n.cluster_count || 1; + const score = n.risk_score || 0; + + let riskColor = '#22c55e'; // Green (1-3) + if (score >= 9) riskColor = '#ef4444'; // Red (9-10) + else if (score >= 7) riskColor = '#f97316'; // Orange (7-8) + else if (score >= 4) riskColor = '#eab308'; // Yellow (4-6) + else if (score >= 1) riskColor = '#3b82f6'; // Blue (1-3) + + // Hide alerts when any entity is selected (focus mode) + // For news: only show the selected alert. For all others: hide all alerts. + let isVisible = viewState.zoom >= 1; + if (selectedEntity) { + if (selectedEntity.type === 'news') { + if (selectedEntity.id !== idx) isVisible = false; + } else { + isVisible = false; + } + } + + return ( + { + e.originalEvent.stopPropagation(); + onEntityClick?.({ id: idx, type: 'news' }); + }} + > +
+ {/* Connector Line for scattered markers (Speech Bubble Line) */} + {n.showLine && isVisible && ( + + + + + )} + +
+ {/* Bubble Tail / Triangle */} + {n.showLine && isVisible && ( +
0 ? `6px solid ${riskColor}` : 'none', + left: '50%', + [n.offsetY < 0 ? 'bottom' : 'top']: '-6px', + transform: 'translateX(-50%)' + }} + /> + )} + +
+
!! ALERT LVL {score} !!
+
+ {n.title} +
+ {count > 1 && ( +
+ [+{count - 1} ACTIVE THREATS IN AREA] +
+ )} +
+
+ + ); + })} + + {frontlineGeoJSON && ( + + + + )} + + {earthquakesGeoJSON && ( + + {/* Earthquake cluster circles */} + + {/* Individual (unclustered) earthquake icons */} + + + )} + + {/* GPS Jamming Zones — red translucent grid squares */} + {jammingGeoJSON && ( + + + + + + )} + + {/* CCTV Cameras — clustered green dots */} + {cctvGeoJSON && ( + + {/* Cluster circles — green, sized by count */} + + {/* Cluster count labels */} + + {/* Individual camera dots */} + + + )} + + {/* Satellite positions — mission-type icons */} + {satellitesGeoJSON && ( + + + + )} + + {/* Satellite click popup */} + {selectedEntity?.type === 'satellite' && (() => { + const sat = data?.satellites?.find((s: any) => s.id === selectedEntity.id); + if (!sat) return null; + const missionLabels: Record = { + military_recon: '🔴 MILITARY RECON', military_sar: '🔴 MILITARY SAR', + sar: '🔷 SAR IMAGING', sigint: '🟠 SIGINT / ELINT', + navigation: '🔵 NAVIGATION', early_warning: '🟣 EARLY WARNING', + commercial_imaging: '🟢 COMMERCIAL IMAGING', space_station: '🏠 SPACE STATION', + communication: '📡 COMMUNICATION' + }; + return ( + onEntityClick?.(null)} + anchor="bottom" offset={12} + > +
+
+ 🛰️ {sat.name} +
+
+ NORAD ID: {sat.id} +
+ {sat.sat_type && ( +
+ Type: {sat.sat_type} +
+ )} + {sat.country && ( +
+ Country: {sat.country} +
+ )} + {sat.mission && ( +
+ {missionLabels[sat.mission] || `⚪ ${sat.mission.toUpperCase()}`} +
+ )} +
+ Altitude: {sat.alt_km?.toLocaleString()} km +
+ {sat.wiki && ( +
+ +
+ )} +
+
+ ); + })()} + + {/* UAV click popup */} + {selectedEntity?.type === 'uav' && (() => { + const uav = data?.uavs?.find((u: any) => u.id === selectedEntity.id); + if (!uav) return null; + return ( + onEntityClick?.(null)} + anchor="bottom" offset={12} + > +
+
+ ✈️ {uav.callsign} +
+ {uav.uav_type && ( +
+ Type: {uav.uav_type} +
+ )} + {uav.country && ( +
+ Country: {uav.country} +
+ )} +
+ Altitude: {uav.alt?.toLocaleString()} m +
+ {uav.speed_knots > 0 && ( +
+ Speed: {uav.speed_knots} kn +
+ )} + {uav.range_km > 0 && ( +
+ Operational Range: {uav.range_km?.toLocaleString()} km +
+ )} + {uav.wiki && ( +
+ +
+ )} +
+
+ ); + })()} + { + selectedEntity?.type === 'gdelt' && data?.gdelt?.[selectedEntity.id as number] && ( + onEntityClick?.(null)} + anchor="bottom" + offset={15} + > +
+
+

+ NEWS ON THE GROUND +

+ +
+
+
+ LOCATION + {data.gdelt[selectedEntity.id as number].properties?.name || 'UNKNOWN REGION'} +
+
+ LATEST REPORTS: ({data.gdelt[selectedEntity.id as number].properties?.count || 1}) +
+ {(() => { + const urls: string[] = data.gdelt[selectedEntity.id as number].properties?._urls_list || []; + const headlines: string[] = data.gdelt[selectedEntity.id as number].properties?._headlines_list || []; + if (urls.length === 0) return No articles available.; + return urls.map((url: string, idx: number) => ( + e.stopPropagation()} + className="text-orange-400 text-[9px] underline hover:text-orange-300 block py-1 border-b border-gray-800/50 last:border-0 cursor-pointer" + style={{ pointerEvents: 'all' }} + > + {headlines[idx] || url} + + )); + })()} +
+
+
+
+
+ ) + } + + { + selectedEntity?.type === 'liveuamap' && data?.liveuamap?.find((l: any) => String(l.id) === String(selectedEntity.id)) && (() => { + const item = data.liveuamap.find((l: any) => String(l.id) === String(selectedEntity.id)); + return ( + onEntityClick?.(null)} + anchor="bottom" + offset={15} + > +
+
+

+ REGIONAL TACTICAL EVENT +

+ +
+
+
+ {item.title} +
+
+ TIME + {item.timestamp || 'UNKNOWN'} +
+ {item.link && ( + + )} +
+
+
+ ); + })() + } + + { + selectedEntity?.type === 'news' && data?.news?.[selectedEntity.id as number] && (() => { + const item = data.news[selectedEntity.id as number]; + let threatColor = "text-yellow-400"; + let borderColor = "border-yellow-800"; + let bgHeaderColor = "bg-yellow-950/40"; + let shadowColor = "rgba(255,255,0,0.3)"; + if (item.risk_score >= 8) { + threatColor = "text-red-400"; + borderColor = "border-red-800"; + bgHeaderColor = "bg-red-950/40"; + shadowColor = "rgba(255,0,0,0.3)"; + } else if (item.risk_score <= 4) { + threatColor = "text-green-400"; + borderColor = "border-green-800"; + bgHeaderColor = "bg-green-950/40"; + shadowColor = "rgba(0,255,0,0.3)"; + } + + if (!item || !item.coords) return null; + + return ( + onEntityClick?.(null)} + anchor="bottom" + offset={25} + > +
+
+

+ THREAT INTERCEPT +

+
+ LVL: {item.risk_score}/10 + +
+
+
+
+ {item.title} +
+
+ SOURCE + {item.source || 'UNKNOWN'} +
+ {item.machine_assessment && ( +
+
+ >_ SYS.ANALYSIS: + {item.machine_assessment} +
+ )} + {item.link && ( + + )} +
+
+
+ ); + })() + } + + {/* REGION DOSSIER — location pin on map (full intel shown in right panel) */} + {selectedEntity?.type === 'region_dossier' && selectedEntity.extra && ( + +
+ {/* Pulsing ring */} +
+ {/* Pin dot */} +
+ {/* Label */} +
+ {regionDossierLoading ? 'COMPILING...' : '▶ INTEL TARGET'} +
+
+ + )} + + {/* MEASUREMENT LINES */} + {measurePoints && measurePoints.length >= 2 && ( + [p.lng, p.lat]) + } + }] + } as any}> + + + )} + + {/* MEASUREMENT WAYPOINTS */} + {measurePoints && measurePoints.map((pt: any, idx: number) => ( + +
+
+
+ {idx + 1} +
+
+ + ))} + + +
+ ); +} + +import dynamic from "next/dynamic"; + +export default dynamic(() => Promise.resolve(MaplibreViewer), { + ssr: false +}); diff --git a/frontend/src/components/MarketsPanel.tsx b/frontend/src/components/MarketsPanel.tsx new file mode 100644 index 0000000..747eddb --- /dev/null +++ b/frontend/src/components/MarketsPanel.tsx @@ -0,0 +1,85 @@ +"use client"; + +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { ArrowUpRight, ArrowDownRight, TrendingUp, Droplet, ChevronDown, ChevronUp } from 'lucide-react'; + +const MarketsPanel = React.memo(function MarketsPanel({ data }: { data: any }) { + const [isMinimized, setIsMinimized] = useState(true); + + const stocks = data?.stocks || {}; + const oil = data?.oil || {}; + + return ( + + {/* Header Toggle */} +
setIsMinimized(!isMinimized)} + > + GLOBAL MARKETS + +
+ + + {!isMinimized && ( + +
+

+ DEFENSE SEC TICKERS +

+
+ {Object.entries(stocks).map(([ticker, info]: [string, any]) => ( +
+ [{ticker}] +
+ ${info.price.toFixed(2)} + + {info.up ? : } + {Math.abs(info.change_percent).toFixed(2)}% + +
+
+ ))} +
+
+ +
+

+ COMMODITY INDEX +

+
+ {Object.entries(oil).map(([name, info]: [string, any]) => ( +
+ {name} +
+ ${info.price.toFixed(2)} + + {info.up ? : } + {Math.abs(info.change_percent).toFixed(2)}% + +
+
+ ))} +
+
+
+ )} +
+
+ ); +}); + +export default MarketsPanel; diff --git a/frontend/src/components/NewsFeed.tsx b/frontend/src/components/NewsFeed.tsx new file mode 100644 index 0000000..01e847a --- /dev/null +++ b/frontend/src/components/NewsFeed.tsx @@ -0,0 +1,1023 @@ +"use client"; + +import { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { AlertTriangle, Clock, ChevronDown, ChevronUp } from 'lucide-react'; +import React, { useEffect, useRef } from 'react'; +import WikiImage from '@/components/WikiImage'; + +// Format time from pubish string "Tue, 24 Feb 2026 15:30:00 GMT" to "15:30" +function formatTime(pubDate: string) { + try { + const d = new Date(pubDate); + return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + } catch { + return "00:00"; + } +} + +// ICAO type designator → Wikipedia article title +const AIRCRAFT_WIKI: Record = { + // Boeing widebodies + B741: 'Boeing 747', B742: 'Boeing 747', B743: 'Boeing 747', B744: 'Boeing 747-400', B748: 'Boeing 747-8', + B752: 'Boeing 757', B753: 'Boeing 757', B762: 'Boeing 767', B763: 'Boeing 767', B764: 'Boeing 767', + B772: 'Boeing 777', B773: 'Boeing 777', B77L: 'Boeing 777', B77W: 'Boeing 777', B778: 'Boeing 777X', + B788: 'Boeing 787 Dreamliner', B789: 'Boeing 787 Dreamliner', B78X: 'Boeing 787 Dreamliner', + // Boeing narrowbodies + B712: 'Boeing 717', B731: 'Boeing 737', B732: 'Boeing 737', B733: 'Boeing 737', B734: 'Boeing 737', + B735: 'Boeing 737', B736: 'Boeing 737', B737: 'Boeing 737', B738: 'Boeing 737 Next Generation', + B739: 'Boeing 737 Next Generation', B37M: 'Boeing 737 MAX', B38M: 'Boeing 737 MAX', B39M: 'Boeing 737 MAX', + // Airbus widebodies + A306: 'Airbus A300', A310: 'Airbus A310', A332: 'Airbus A330', A333: 'Airbus A330', A338: 'Airbus A330neo', + A339: 'Airbus A330neo', A342: 'Airbus A340', A343: 'Airbus A340', A345: 'Airbus A340', A346: 'Airbus A340', + A359: 'Airbus A350', A35K: 'Airbus A350', A388: 'Airbus A380', + // Airbus narrowbodies + A318: 'Airbus A318', A319: 'Airbus A319', A320: 'Airbus A320', A321: 'Airbus A321', + A19N: 'Airbus A319neo', A20N: 'Airbus A320neo family', A21N: 'Airbus A321neo', + // Embraer + E135: 'Embraer ERJ 145 family', E145: 'Embraer ERJ 145 family', E170: 'Embraer E-Jet family', + E175: 'Embraer E-Jet family', E190: 'Embraer E-Jet family', E195: 'Embraer E-Jet family', + E290: 'Embraer E-Jet E2 family', E295: 'Embraer E-Jet E2 family', + // Bombardier / CRJ + CRJ1: 'Bombardier CRJ100/200', CRJ2: 'Bombardier CRJ100/200', CRJ7: 'Bombardier CRJ700 series', + CRJ9: 'Bombardier CRJ700 series', CRJX: 'Bombardier CRJ700 series', + // Turboprops + DH8A: 'De Havilland Canada Dash 8', DH8B: 'De Havilland Canada Dash 8', + DH8C: 'De Havilland Canada Dash 8', DH8D: 'De Havilland Canada Dash 8', + AT45: 'ATR 42', AT46: 'ATR 42', AT72: 'ATR 72', AT76: 'ATR 72', + // Bizjets + C56X: 'Cessna Citation Excel', C680: 'Cessna Citation Sovereign', C750: 'Cessna Citation X', + CL30: 'Bombardier Challenger 300', CL35: 'Bombardier Challenger 350', + CL60: 'Bombardier Challenger 600 series', GL5T: 'Bombardier Global 5000', + GLEX: 'Bombardier Global Express', GLF4: 'Gulfstream IV', GLF5: 'Gulfstream V', + GLF6: 'Gulfstream G650', G280: 'Gulfstream G280', GA5C: 'Gulfstream G500/G600', + GA6C: 'Gulfstream G500/G600', LJ35: 'Learjet 35', LJ45: 'Learjet 45', LJ60: 'Learjet 60', + F900: 'Dassault Falcon 900', FA7X: 'Dassault Falcon 7X', FA8X: 'Dassault Falcon 8X', + // Military common + C130: 'Lockheed C-130 Hercules', C17: 'Boeing C-17 Globemaster III', + KC35: 'Boeing KC-135 Stratotanker', KC46: 'Boeing KC-46 Pegasus', K35R: 'Boeing KC-135 Stratotanker', + E3CF: 'Boeing E-3 Sentry', E6B: 'Boeing E-6 Mercury', P8: 'Boeing P-8 Poseidon', + B52H: 'Boeing B-52 Stratofortress', F16: 'General Dynamics F-16 Fighting Falcon', + F15: 'McDonnell Douglas F-15 Eagle', F18H: 'Boeing F/A-18E/F Super Hornet', + F35: 'Lockheed Martin F-35 Lightning II', F22: 'Lockheed Martin F-22 Raptor', + A10: 'Fairchild Republic A-10 Thunderbolt II', V22: 'Bell Boeing V-22 Osprey', + C5M: 'Lockheed C-5 Galaxy', C2: 'Grumman C-2 Greyhound', + EUFI: 'Eurofighter Typhoon', RFAL: 'Dassault Rafale', TORN: 'Panavia Tornado', + // GA + C172: 'Cessna 172', C182: 'Cessna 182 Skylane', C206: 'Cessna 206', C208: 'Cessna 208 Caravan', + C210: 'Cessna 210 Centurion', PA28: 'Piper PA-28 Cherokee', PA32: 'Piper PA-32', + PA46: 'Piper PA-46 Malibu', BE36: 'Beechcraft Bonanza', BE9L: 'Beechcraft King Air', + BE20: 'Beechcraft Super King Air', B350: 'Beechcraft King Air 350', PC12: 'Pilatus PC-12', + PC24: 'Pilatus PC-24', TBM7: 'Daher TBM', TBM8: 'Daher TBM', TBM9: 'Daher TBM', + // Helicopters + R44: 'Robinson R44', R22: 'Robinson R22', R66: 'Robinson R66', + B06: 'Bell 206', B407: 'Bell 407', B412: 'Bell 412', + EC35: 'Airbus Helicopters H135', EC45: 'Airbus Helicopters H145', + S76: 'Sikorsky S-76', S92: 'Sikorsky S-92', + // Russian / other + SU95: 'Sukhoi Superjet 100', AN12: 'Antonov An-12', AN26: 'Antonov An-26', + IL76: 'Ilyushin Il-76', IL96: 'Ilyushin Il-96', + A400: 'Airbus A400M Atlas', C295: 'Airbus C-295', +}; + +// Module-level cache for Wikipedia thumbnails (persists across re-renders) +const _wikiThumbCache: Record = {}; + +function useAircraftImage(model: string | undefined): { imgUrl: string | null; wikiUrl: string | null; loading: boolean } { + const [, forceUpdate] = useState(0); + const wikiTitle = model ? AIRCRAFT_WIKI[model] : undefined; + const wikiUrl = wikiTitle ? `https://en.wikipedia.org/wiki/${wikiTitle.replace(/ /g, '_')}` : null; + + useEffect(() => { + if (!wikiTitle) return; + const key = wikiTitle; + if (_wikiThumbCache[key]) return; // Already fetched or in-flight + _wikiThumbCache[key] = { url: null, loading: true }; + fetch(`https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(wikiTitle)}`) + .then(r => r.json()) + .then(d => { + _wikiThumbCache[key] = { url: d.thumbnail?.source || null, loading: false }; + forceUpdate(n => n + 1); + }) + .catch(() => { + _wikiThumbCache[key] = { url: null, loading: false }; + forceUpdate(n => n + 1); + }); + }, [wikiTitle]); + + if (!wikiTitle) return { imgUrl: null, wikiUrl: null, loading: false }; + const cached = _wikiThumbCache[wikiTitle]; + return { imgUrl: cached?.url || null, wikiUrl, loading: cached?.loading || false }; +} + + +// Vessel type → Wikipedia article for generic ships (carriers have their own wiki field) +const VESSEL_TYPE_WIKI: Record = { + 'tanker': 'https://en.wikipedia.org/wiki/Oil_tanker', + 'cargo': 'https://en.wikipedia.org/wiki/Container_ship', + 'passenger': 'https://en.wikipedia.org/wiki/Cruise_ship', + 'yacht': 'https://en.wikipedia.org/wiki/Superyacht', + 'military_vessel': 'https://en.wikipedia.org/wiki/Warship', +}; + +function NewsFeedInner({ data, selectedEntity, regionDossier, regionDossierLoading }: { data: any, selectedEntity?: { type: string, id: string | number, name?: string, callsign?: string, media_url?: string, extra?: any } | null, regionDossier?: any, regionDossierLoading?: boolean }) { + const [isMinimized, setIsMinimized] = useState(false); + const [expandedIndexes, setExpandedIndexes] = useState([]); + const itemRefs = useRef<(HTMLDivElement | null)[]>([]); + + // Intentionally omitting map click triggers for expanding + // as we now show a contextual pop-up on the map directly. + + const toggleExpand = (idx: number) => { + if (expandedIndexes.includes(idx)) { + setExpandedIndexes(expandedIndexes.filter(i => i !== idx)); + } else { + setExpandedIndexes([...expandedIndexes, idx]); + } + } + + const news = data?.news || []; + + // Determine the selected flight's model for Wikipedia thumbnail lookup + // (must call hook unconditionally — React rules of hooks) + const selectedFlightModel = (() => { + if (!selectedEntity) return undefined; + const { type, id } = selectedEntity; + let flight: any = null; + if (type === 'flight') flight = data?.commercial_flights?.[id as number]; + else if (type === 'private_flight') flight = data?.private_flights?.[id as number]; + else if (type === 'private_jet') flight = data?.private_jets?.[id as number]; + else if (type === 'military_flight') flight = data?.military_flights?.[id as number]; + else if (type === 'tracked_flight') flight = data?.tracked_flights?.[id as number]; + return flight?.model; + })(); + const { imgUrl: aircraftImgUrl, wikiUrl: aircraftWikiUrl, loading: aircraftImgLoading } = useAircraftImage(selectedFlightModel); + + // Region Dossier (right-click intelligence) + if (selectedEntity?.type === 'region_dossier') { + const d = regionDossier; + return ( + +
+

REGION DOSSIER

+ + {selectedEntity.extra ? `${selectedEntity.extra.lat.toFixed(3)}, ${selectedEntity.extra.lng.toFixed(3)}` : ''} + +
+ {regionDossierLoading ? ( +
+ COMPILING INTELLIGENCE... +
+ ) : d && !d.error ? ( +
+ {/* COUNTRY */} +
COUNTRY LEVEL {d.country?.flag_emoji || ''}
+
COUNTRY{d.country?.name}
+ {d.country?.official_name && d.country.official_name !== d.country.name && ( +
OFFICIAL{d.country.official_name}
+ )} +
LEADER{d.country?.leader}
+
GOVERNMENT{d.country?.government_type}
+
POPULATION{d.country?.population?.toLocaleString()}
+
CAPITAL{d.country?.capital}
+
LANGUAGES{d.country?.languages?.join(', ')}
+ {d.country?.currencies?.length > 0 && ( +
CURRENCY{d.country.currencies.join(', ')}
+ )} +
REGION{d.country?.subregion || d.country?.region}
+ {d.country?.area_km2 > 0 && ( +
AREA{d.country.area_km2.toLocaleString()} km²
+ )} + + {/* LOCAL */} + {(d.local?.name || d.local?.state) && ( + <> +
LOCAL LEVEL
+ {d.local.name &&
LOCALITY{d.local.name}
} + {d.local.state &&
STATE/PROVINCE{d.local.state}
} + {d.local.description &&
TYPE{d.local.description}
} + {d.local.summary && ( +
+ >_ INTEL: + {d.local.summary.length > 500 ? d.local.summary.substring(0, 500) + '...' : d.local.summary} +
+ )} + + )} +
+ ) : d?.error ? ( +
{d.error}
+ ) : ( +
INTEL UNAVAILABLE
+ )} +
+ ); + } + + if (selectedEntity?.type === 'tracked_flight') { + const flight = data?.tracked_flights?.[selectedEntity.id as number]; + if (flight) { + const callsign = flight.callsign || "UNKNOWN"; + const alertColorMap: Record = { + 'pink': 'text-pink-400', 'red': 'text-red-400', + 'darkblue': 'text-blue-400', 'white': 'text-white' + }; + const alertBorderMap: Record = { + 'pink': 'border-pink-500/30', 'red': 'border-red-500/30', + 'darkblue': 'border-blue-500/30', 'white': 'border-gray-500/30' + }; + const alertBgMap: Record = { + 'pink': 'bg-pink-950/40', 'red': 'bg-red-950/40', + 'darkblue': 'bg-blue-950/40', 'white': 'bg-gray-900/40' + }; + const ac = flight.alert_color || 'white'; + const headerColor = alertColorMap[ac] || 'text-white'; + const borderColor = alertBorderMap[ac] || 'border-gray-500/30'; + const bgColor = alertBgMap[ac] || 'bg-gray-900/40'; + + return ( + +
+

+ ⚠ TRACKED AIRCRAFT — {flight.alert_category || "ALERT"} +

+ TRK: {callsign} +
+ +
+
+ OPERATOR + {flight.alert_operator && flight.alert_operator !== "UNKNOWN" ? ( + + {flight.alert_operator} + + ) : ( + UNKNOWN + )} +
+ {/* Owner/Operator Wikipedia photo */} + {flight.alert_operator && flight.alert_operator !== "UNKNOWN" && ( +
+ +
+ )} + {/* Aircraft model Wikipedia photo */} + {aircraftImgUrl && ( + + )} +
+ CATEGORY + {flight.alert_category || "N/A"} +
+
+ AIRCRAFT + {flight.alert_type || flight.model || "UNKNOWN"} +
+
+ REGISTRATION + {flight.registration || "N/A"} +
+ {flight.alert_tag1 && ( +
+ INTEL TAG + {flight.alert_tag1} +
+ )} + {flight.alert_tag2 && ( +
+ SECONDARY + {flight.alert_tag2} +
+ )} + {flight.alert_tag3 && ( +
+ DETAIL + {flight.alert_tag3} +
+ )} +
+ ALTITUDE + {(Math.round((flight.alt || 0) / 0.3048)).toLocaleString()} ft +
+
+ GROUND SPEED + {flight.speed_knots ? `${flight.speed_knots} kts` : 'N/A'} +
+
+ HEADING + {Math.round(flight.heading || 0)}° +
+ {flight.squawk && ( +
+ SQUAWK + {flight.squawk}{flight.squawk === '7700' ? ' ⚠ EMERGENCY' : flight.squawk === '7600' ? ' COMMS LOST' : ''} +
+ )} + {flight.alert_link && ( +
+ REFERENCE + + View Intel Source + +
+ )} + {flight.icao24 && ( +
+ FLIGHT RECORD + + View History Log + +
+ )} +
+
+ ) + } + } + + if (selectedEntity?.type === 'flight' || selectedEntity?.type === 'military_flight' || selectedEntity?.type === 'private_flight' || selectedEntity?.type === 'private_jet') { + const flightsList = selectedEntity.type === 'flight' ? data?.commercial_flights + : selectedEntity.type === 'private_flight' ? data?.private_flights + : selectedEntity.type === 'private_jet' ? data?.private_jets + : data?.military_flights; + const flight = flightsList?.[selectedEntity.id as number]; + + if (flight) { + const callsign = flight.callsign || "UNKNOWN"; + let airline = "UNKNOWN"; + + if (selectedEntity.type === 'military_flight') { + airline = "MILITARY ASSET"; + } else if (selectedEntity.type === 'private_jet') { + airline = "PRIVATE JET"; + } else if (selectedEntity.type === 'private_flight') { + airline = "PRIVATE / GA"; + } else if (flight.airline_code) { + // Use the airline code resolved from adsb.lol routeset API + const codeMap: Record = { + "UAL": "UNITED AIRLINES", "DAL": "DELTA AIR LINES", "SWA": "SOUTHWEST AIRLINES", + "AAL": "AMERICAN AIRLINES", "BAW": "BRITISH AIRWAYS", "AFR": "AIR FRANCE", + "JBU": "JETBLUE AIRWAYS", "NKS": "SPIRIT AIRLINES", "THY": "TURKISH AIRLINES", + "UAE": "EMIRATES", "QFA": "QANTAS", "ACA": "AIR CANADA", + "FFT": "FRONTIER AIRLINES", "WJA": "WESTJET", "RPA": "REPUBLIC AIRWAYS", + "SKW": "SKYWEST AIRLINES", "ENY": "ENVOY AIR", "ASA": "ALASKA AIRLINES", + "HAL": "HAWAIIAN AIRLINES", "DLH": "LUFTHANSA", "KLM": "KLM", + "EZY": "EASYJET", "RYR": "RYANAIR", "SIA": "SINGAPORE AIRLINES", + "CPA": "CATHAY PACIFIC", "ANA": "ALL NIPPON AIRWAYS", "JAL": "JAPAN AIRLINES", + "QTR": "QATAR AIRWAYS", "ETD": "ETIHAD AIRWAYS", "SAS": "SAS SCANDINAVIAN" + }; + airline = codeMap[flight.airline_code] || flight.airline_code; + } else if (callsign !== "UNKNOWN") { + airline = "COMMERCIAL FLIGHT"; + } + + return ( + +
+

+ {selectedEntity.type === 'military_flight' ? "MILITARY BOGEY INTERCEPT" : selectedEntity.type === 'private_flight' ? "PRIVATE TRANSPONDER" : selectedEntity.type === 'private_jet' ? "PRIVATE JET TRANSPONDER" : "COMMERCIAL TRANSPONDER"} +

+ TRK: {callsign} +
+ +
+
+ OPERATOR + {airline} +
+
+ REGISTRATION + {flight.registration || "N/A"} +
+
+ AIRCRAFT MODEL + {flight.model || "UNKNOWN"} +
+ {/* Aircraft photo + Wikipedia link */} + {(aircraftImgUrl || aircraftImgLoading || aircraftWikiUrl) && ( +
+ {aircraftImgLoading && ( +
+ )} + {aircraftImgUrl && ( + + {AIRCRAFT_WIKI[flight.model] + + )} + {aircraftWikiUrl && ( + + 📖 {AIRCRAFT_WIKI[flight.model] || flight.model} — Wikipedia → + + )} +
+ )} +
+ ALTITUDE + {(Math.round((flight.alt || 0) / 0.3048)).toLocaleString()} ft +
+
+ GROUND SPEED + {flight.speed_knots ? `${flight.speed_knots} kts` : 'N/A'} +
+
+ HEADING + {Math.round(flight.heading || 0)}° +
+ {flight.squawk && ( +
+ SQUAWK + {flight.squawk}{flight.squawk === '7700' ? ' ⚠ EMERGENCY' : flight.squawk === '7600' ? ' COMMS LOST' : ''} +
+ )} +
+ ROUTE + {flight.origin_name !== "UNKNOWN" ? `[${flight.origin_name}] → [${flight.dest_name}]` : "UNKNOWN"} +
+ {flight.icao24 && ( +
+ FLIGHT RECORD + + View History Log + +
+ )} +
+ + ) + } + } + + if (selectedEntity?.type === 'ship') { + const ship = data?.ships?.[selectedEntity.id as number]; + if (ship) { + const vesselTypeLabels: Record = { + 'tanker': 'TANKER', + 'cargo': 'CARGO VESSEL', + 'passenger': 'PASSENGER / CRUISE', + 'yacht': 'PRIVATE YACHT', + 'military_vessel': 'MILITARY VESSEL', + 'carrier': 'AIRCRAFT CARRIER', + }; + const typeLabel = vesselTypeLabels[ship.type] || ship.type?.toUpperCase() || 'VESSEL'; + + const headerColorMap: Record = { + 'tanker': 'text-red-400', + 'cargo': 'text-red-400', + 'passenger': 'text-white', + 'yacht': 'text-blue-400', + 'military_vessel': 'text-yellow-400', + 'carrier': 'text-orange-400', + }; + const headerColor = headerColorMap[ship.type] || 'text-gray-400'; + + const headerTitleMap: Record = { + 'tanker': 'AIS TANKER INTERCEPT', + 'cargo': 'AIS CARGO INTERCEPT', + 'passenger': 'AIS PASSENGER VESSEL', + 'yacht': 'AIS YACHT SIGNAL', + 'military_vessel': 'AIS MILITARY VESSEL', + 'carrier': 'CARRIER STRIKE GROUP', + }; + const headerTitle = headerTitleMap[ship.type] || 'AIS VESSEL SIGNAL'; + + return ( + +
+

+ {headerTitle} +

+ MMSI: {ship.mmsi || 'N/A'} +
+ +
+
+ VESSEL NAME + {ship.name || 'UNKNOWN'} +
+
+ VESSEL TYPE + {typeLabel} +
+
+ FLAG STATE + {ship.country || 'UNKNOWN'} +
+ {ship.callsign && ( +
+ CALLSIGN + {ship.callsign} +
+ )} + {ship.imo > 0 && ( +
+ IMO NUMBER + {ship.imo} +
+ )} +
+ DESTINATION + {ship.destination || 'UNKNOWN'} +
+
+ SPEED (SOG) + {ship.type === 'carrier' ? 'UNKNOWN' : `${ship.sog || 0} kts`} +
+
+ COURSE (COG) + {ship.type === 'carrier' ? 'UNKNOWN' : `${Math.round(ship.cog || 0)}°`} +
+ {ship.mmsi && ( +
+ VESSEL RECORD + + View on MarineTraffic + +
+ )} + {/* Ship/Carrier Wikipedia photo */} + {(ship.wiki || VESSEL_TYPE_WIKI[ship.type]) && ( +
+ +
+ )} +
+
+ ) + } + } + + if (selectedEntity?.type === 'gdelt') { + const gdeltItem = data?.gdelt?.[selectedEntity.id as number]; + if (gdeltItem && gdeltItem.properties) { + const props = gdeltItem.properties; + return ( + +
+

+ MILITARY INCIDENT CLUSTER +

+ ID: {selectedEntity.id} +
+ +
+
+ LOCATION + {props.name || 'UNKNOWN REGION'} +
+
+ ARTICLE COUNT + {props.count || 1} +
+
+ LATEST REPORTS: +
+
+
+ + ) + } + } + + if (selectedEntity?.type === 'liveuamap') { + const item = data?.liveuamap?.find((l: any) => String(l.id) === String(selectedEntity.id)); + if (item) { + return ( + +
+

+ REGIONAL TACTICAL EVENT +

+ ID: {item.id} +
+ +
+
+ REGION + {item.region || 'UNKNOWN'} +
+
+ DESCRIPTION + {item.title} +
+
+ REPORTED TIME + {item.timestamp || 'UNKNOWN'} +
+ {item.link && ( + + )} +
+
+ ) + } + } + + if (selectedEntity?.type === 'news') { + const item = data?.news?.[selectedEntity.id as number]; + if (item) { + return ( + +
+

+ THREAT INTERCEPT +

+ LVL: {item.risk_score}/10 +
+ +
+
+ SOURCE + {item.source || 'UNKNOWN'} +
+
+ HEADLINE + {item.title} +
+ {item.machine_assessment && ( +
+
+ >_ SYS.ANALYSIS: + {item.machine_assessment} +
+ )} + {item.link && ( + + )} +
+
+ ) + } + } + + if (selectedEntity?.type === 'airport') { + const apt = data?.airports?.find((a: any) => String(a.id) === String(selectedEntity.id)); + if (apt) { + return ( + +
+

+ AERONAUTICAL HUB +

+ IATA: {apt.iata} +
+ +
+
+ FACILITY NAME + {apt.name} +
+
+ COORDINATES + {apt.lat.toFixed(4)}, {apt.lng.toFixed(4)} +
+
+ STATUS + OPERATIONAL +
+
+
+ ) + } + } + + if (selectedEntity?.type === 'cctv') { + return ( + +
+

+ {selectedEntity.extra?.last_updated + ? new Date(selectedEntity.extra.last_updated + 'Z').toLocaleString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false, timeZoneName: 'short' }).toUpperCase() + ' — OPTIC INTERCEPT' + : 'OPTIC INTERCEPT'} +

+ ID: {selectedEntity.id} +
+
+ {(() => { + const url = selectedEntity.media_url || ''; + const mt = selectedEntity.extra?.media_type || ( + url.includes('.mp4') || url.includes('.webm') ? 'video' : + url.includes('.m3u8') || url.includes('hls') ? 'hls' : + url.includes('.mjpg') || url.includes('.mjpeg') || url.includes('mjpg') ? 'mjpeg' : + url.includes('embed') || url.includes('maps/embed') ? 'embed' : + url.includes('mapbox.com') ? 'satellite' : 'image' + ); + + if (mt === 'video') return ( +