pub const HISTOGRAM_BINS: usize = 100; pub const H3_PRECOMPUTE_MAX: u8 = 12; pub const H3_REQUEST_MIN: u8 = 4; pub const H3_REQUEST_MAX: u8 = 12; pub const SERVER_ADDRESS: &str = "0.0.0.0:8001"; pub const GRID_CELL_SIZE: f32 = 0.01; pub const MAX_POIS_PER_REQUEST: usize = 10000; pub const MAX_CELLS_PER_REQUEST: usize = 5000; pub const DEFAULT_PROPERTIES_LIMIT: usize = 100; pub const MAX_PROPERTIES_LIMIT: usize = 500; pub const MAX_PRICE_HISTORY_POINTS: usize = 5000; pub const POSTCODE_SEARCH_OFFSET: f64 = 0.02; pub const AI_FILTERS_MAX_TOKENS: usize = 2000; pub const AI_FILTERS_TEMPERATURE: f32 = 0.0; /// Timeout for outbound HTTP service calls (seconds). pub const SERVICE_CALL_TIMEOUT: u64 = 120; /// Inner London free zone bounds (south, west, north, east) — roughly zones 1–2. /// Users without a license can only query data within these bounds. pub const FREE_ZONE_BOUNDS: (f64, f64, f64, f64) = (51.42, -0.34, 51.60, 0.14); /// Homepage demo center (lat, lng) and tolerance for the license bypass. /// Hexagon requests centered within this tolerance skip the license check, /// so the ScrollStory animation works for anonymous visitors. /// ~0.05° ≈ 5.5 km — covers central London only. pub const DEMO_CENTER: (f64, f64) = (51.51, -0.12); pub const DEMO_CENTER_TOLERANCE: f64 = 0.05;