diff --git a/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/action.ts b/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/action.ts
new file mode 100644
index 0000000..54473de
--- /dev/null
+++ b/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/action.ts
@@ -0,0 +1,126 @@
+import { getInjection } from "@/di/container";
+import db from "@/prisma/db";
+import { AuthenticationError, UnauthenticatedError } from "@/src/entities/errors/auth";
+import { InputParseError } from "@/src/entities/errors/common";
+
+
+export async function getAvailableYears() {
+ const instrumentationService = getInjection('IInstrumentationService');
+ return await instrumentationService.instrumentServerAction(
+ 'Available Years',
+ { recordResponse: true },
+ async () => {
+ try {
+
+ const years = await db.crimes.findMany({
+ select: {
+ year: true,
+ },
+ distinct: ["year"],
+ orderBy: {
+ year: "asc",
+ },
+ })
+
+ return years.map((year) => year.year);
+
+ } catch (err) {
+ if (err instanceof InputParseError) {
+ // return {
+ // error: err.message,
+ // };
+
+ throw new InputParseError(err.message);
+ }
+
+ if (err instanceof AuthenticationError) {
+ // return {
+ // error: 'User not found.',
+ // };
+
+ throw new AuthenticationError('There was an error with the credentials. Please try again or contact support.');
+ }
+
+ const crashReporterService = getInjection('ICrashReporterService');
+ crashReporterService.report(err);
+ // return {
+ // error:
+ // 'An error happened. The developers have been notified. Please try again later.',
+ // };
+ throw new Error('An error happened. The developers have been notified. Please try again later.');
+ }
+ }
+ );
+}
+
+// Fetch districts with their geographic data and crime rates for the specified year
+export async function fetchDistricts(year: number) {
+
+ const instrumentationService = getInjection('IInstrumentationService');
+ return await instrumentationService.instrumentServerAction(
+ 'Fetch Districts',
+ { recordResponse: true },
+ async () => {
+ try {
+
+ const districts = await db.districts.findMany({
+ include: {
+ geographics: true,
+ crimes: {
+ where: {
+ year: year,
+ },
+ },
+ cities: {
+ select: {
+ name: true,
+ },
+ },
+ },
+ })
+
+ // Transform the data for the map
+ const geoData = districts.map((district) => {
+ const crimeData = district.crimes[0] || null
+
+ return {
+ id: district.id,
+ name: district.name,
+ cityName: district.cities?.name || "Unknown City",
+ polygon: district.geographics?.polygon || null,
+ crimeRate: crimeData?.rate || "no_data",
+ crimeCount: crimeData?.number_of_crime || 0,
+ year: year,
+ }
+ })
+
+ return geoData
+
+ } catch (err) {
+ if (err instanceof InputParseError) {
+ // return {
+ // error: err.message,
+ // };
+
+ throw new InputParseError(err.message);
+ }
+
+ if (err instanceof AuthenticationError) {
+ // return {
+ // error: 'User not found.',
+ // };
+
+ throw new AuthenticationError('There was an error with the credentials. Please try again or contact support.');
+ }
+
+ const crashReporterService = getInjection('ICrashReporterService');
+ crashReporterService.report(err);
+ // return {
+ // error:
+ // 'An error happened. The developers have been notified. Please try again later.',
+ // };
+ throw new Error('An error happened. The developers have been notified. Please try again later.');
+ }
+ }
+ );
+}
\ No newline at end of file
diff --git a/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/page.tsx b/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/page.tsx
new file mode 100644
index 0000000..9978f09
--- /dev/null
+++ b/sigap-website/app/(pages)/(admin)/dashboard/crime-management/crime-overview/page.tsx
@@ -0,0 +1,289 @@
+"use client"
+
+
+import { AlertTriangle, BarChart3, Briefcase, FileText, MapPin, Shield, User, Users, Clock, Search } from "lucide-react"
+import { Badge } from "@/app/_components/ui/badge"
+import { BentoGrid, BentoGridItem } from "@/app/_components/ui/bento-grid"
+import { Progress } from "@/app/_components/ui/progress"
+import CrimeMap from "@/app/_components/map/crime-map"
+
+
+export default function CrimeManagement() {
+ return (
+
+
+
+
+
Crime Management Dashboard
+
Overview of current cases, incidents, and department status
+
+
+
+ System: Online
+
+
+ Alert Level: Normal
+
+
+
+
+
+ }
+ colSpan="2"
+ rowSpan="2"
+ >
+ {/* */}
+
+
+
+ }
+ >
+
+
+
+ Violent Crime
+ +12%
+
+
+
+
+
+ Property Crime
+ -8%
+
+
+
+
+
+ Cybercrime
+ +23%
+
+
+
+
+
+
+ }
+ >
+
+ {[1, 2, 3, 4, 5].map((i) => (
+
+ {i}
+
+ ))}
+
+ +12
+
+
+
+ Total on duty:
+ 18/24 officers
+
+
+
+ }
+ colSpan="2"
+ >
+
+ {[
+ { id: "CR-7823", type: "Homicide", location: "Downtown", priority: "Critical", time: "2h ago" },
+ { id: "CR-7825", type: "Armed Robbery", location: "North District", priority: "High", time: "4h ago" },
+ { id: "CR-7830", type: "Kidnapping", location: "West Side", priority: "Critical", time: "6h ago" },
+ ].map((case_) => (
+
+
+
+
+
Case #{case_.id}
+
+ {case_.priority}
+
+
+
+ {case_.type} • {case_.location} • {case_.time}
+
+
+
+ ))}
+
+
+
+ }
+ >
+
+ {[
+ { id: "EV-4523", type: "Weapon", case: "CR-7823", status: "Processing" },
+ { id: "EV-4525", type: "Digital Media", case: "CR-7825", status: "Secured" },
+ { id: "EV-4527", type: "DNA Sample", case: "CR-7830", status: "Lab Analysis" },
+ ].map((evidence) => (
+
+
+
+
+
+
{evidence.id}
+
+ {evidence.type} • Case #{evidence.case}
+
+
+
+ {evidence.status}
+
+
+ ))}
+
+
+
+ }
+ >
+
+ {[
+ { id: "POI-3421", name: "John Doe", case: "CR-7823", status: "Wanted" },
+ { id: "POI-3422", name: "Jane Smith", case: "CR-7825", status: "In Custody" },
+ { id: "POI-3423", name: "Robert Johnson", case: "CR-7830", status: "Under Surveillance" },
+ ].map((person) => (
+
+
+
+
+
+
{person.name}
+
+ {person.id} • Case #{person.case}
+
+
+
+ {person.status}
+
+
+ ))}
+
+
+
+ }
+ >
+
+
+
+ Case Clearance Rate
+ 68%
+
+
+
+
+
+ Response Time
+ 4.2 min avg
+
+
+
+
+
+ Evidence Processing
+ 72%
+
+
+
+
+
+
+ }>
+
+
+
14
+
+3 from yesterday
+
+
+ {["Assault", "Theft", "DUI", "Drugs", "Trespassing", "Vandalism"].map((crime) => (
+
+ {crime}
+
+ ))}
+
+
+
+
+ }>
+
+
+
Current Hour
+
+ 24
+ High
+
+
+
+ Average Wait
+ 1:42
+
+
+
Operators Available
+
+ 4/6
+ Understaffed
+
+
+
+
+
+ }
+ >
+
+
+
+
+
+
+ Recent searches: CR-7823, CR-7825, John Doe, Jane Smith
+
+
+
+
+
+
+ )
+}
diff --git a/sigap-website/app/(pages)/(admin)/dashboard/page.tsx b/sigap-website/app/(pages)/(admin)/dashboard/page.tsx
index a4a5b77..5464845 100644
--- a/sigap-website/app/(pages)/(admin)/dashboard/page.tsx
+++ b/sigap-website/app/(pages)/(admin)/dashboard/page.tsx
@@ -1,7 +1,20 @@
+import { BentoGrid, BentoGridItem } from "@/app/_components/ui/bento-grid";
import { DateTimePicker2 } from "@/app/_components/ui/date-picker";
import { createClient } from "@/app/_utils/supabase/server";
import { redirect } from "next/navigation";
+import {
+ BarChart3,
+ Calendar,
+ CreditCard,
+ Globe,
+ LineChart,
+ MessageSquare,
+ Settings,
+ ShoppingCart,
+ Users,
+} from "lucide-react";
+
export default async function DashboardPage() {
// const supabase = await createClient();
@@ -16,21 +29,138 @@ export default async function DashboardPage() {
// console.log("user", user);
return (
- <>
-
-
-
-
-
- {/* {JSON.stringify(user, null, 2)} */}
-
-
+
+ {/*
Dashboard Overview
*/}
+
+ }
+ colSpan="2"
+ rowSpan="2"
+ >
+
+
+ Chart Visualization
-
-
-
-
-
- >
- );
+
+
+
}
+ >
+
+ {[1, 2, 3].map((i) => (
+
+
+
+
Order #{i}0234
+
2 mins ago
+
+
$149.99
+
+ ))}
+
+
+
+
}>
+
+ {[1, 2, 3, 4, 5].map((i) => (
+
+ {i}
+
+ ))}
+
+ +3
+
+
+
+
+
}
+ colSpan="2"
+ >
+
+
+ World Map Visualization
+
+
+
+
}
+ >
+
+ {[1, 2].map((i) => (
+
+
+
+
+
+
Team Meeting
+
Tomorrow, 10:00 AM
+
+
+ ))}
+
+
+
+
}
+ >
+
+
24
+
-12% from last week
+
+
+
+
+
}
+ >
+
+ {["Visa", "Mastercard", "PayPal"].map((method) => (
+
+ {method}
+
+ ))}
+
+
+
+
}
+ >
+
+
+ API
+ Operational
+
+
+ Database
+ Operational
+
+
+ Storage
+ Degraded
+
+
+
+
+
+ )
}
diff --git a/sigap-website/app/_components/map/controls/map-legend.tsx b/sigap-website/app/_components/map/controls/map-legend.tsx
new file mode 100644
index 0000000..42536a0
--- /dev/null
+++ b/sigap-website/app/_components/map/controls/map-legend.tsx
@@ -0,0 +1,38 @@
+"use client"
+
+import { Card } from "@/app/_components/ui/card"
+import { CRIME_COLORS, CRIME_RATES } from "@/app/_utils/const/crime"
+
+type MapLegendProps = {
+ title?: string
+ position?: "top-left" | "top-right" | "bottom-left" | "bottom-right"
+}
+
+export default function MapLegend({ title = "Crime Rate Legend", position = "bottom-right" }: MapLegendProps) {
+ // Define position classes
+ const positionClasses = {
+ "top-left": "top-4 left-4",
+ "top-right": "top-4 right-4",
+ "bottom-left": "bottom-4 left-4",
+ "bottom-right": "bottom-4 right-4",
+ }
+
+ return (
+
+
+ {title}
+
+ {Object.entries(CRIME_RATES).map(([key, label]) => (
+
+ ))}
+
+
+
+ )
+}
diff --git a/sigap-website/app/_components/map/controls/year-selector.tsx b/sigap-website/app/_components/map/controls/year-selector.tsx
new file mode 100644
index 0000000..841d30b
--- /dev/null
+++ b/sigap-website/app/_components/map/controls/year-selector.tsx
@@ -0,0 +1,25 @@
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/app/_components/ui/select"
+
+type YearSelectorProps = {
+ years: number[]
+ selectedYear: string
+ onChange: (year: string) => void
+ className?: string
+}
+
+export default function YearSelector({ years, selectedYear, onChange, className = "" }: YearSelectorProps) {
+ return (
+
+ )
+}
diff --git a/sigap-website/app/_components/map/crime-map.tsx b/sigap-website/app/_components/map/crime-map.tsx
new file mode 100644
index 0000000..e86c12e
--- /dev/null
+++ b/sigap-website/app/_components/map/crime-map.tsx
@@ -0,0 +1,122 @@
+"use client"
+
+import { useEffect, useState } from "react"
+import { Card, CardContent, CardHeader, CardTitle } from "@/app/_components/ui/card"
+import { Skeleton } from "@/app/_components/ui/skeleton"
+import DistrictLayer, { type DistrictFeature } from "./layers/district-layer"
+import MapLegend from "./controls/map-legend"
+import YearSelector from "./controls/year-selector"
+import CrimeMarker, { type CrimeIncident } from "./markers/crime-marker"
+import { useToast } from "@/app/_hooks/use-toast"
+import MapView from "./map"
+import { useQuery } from "@tanstack/react-query"
+import { getAvailableYears } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/action"
+
+const years = [2020, 2021, 2022, 2023, 2024, 2025]
+
+export default function CrimeMap() {
+ const [loading, setLoading] = useState(false)
+ const [year, setYear] = useState
(new Date().getFullYear().toString())
+ const [availableYears, setAvailableYears] = useState(years)
+ const [districtData, setDistrictData] = useState([])
+ const [crimeIncidents, setCrimeIncidents] = useState([])
+ const [showIncidents, setShowIncidents] = useState(false)
+ const { toast } = useToast()
+
+ // fetch available years (example function)
+ // const { data: year } = useQuery({
+ // queryKey: ["available-years"],
+ // queryFn: getAvailableYears,
+ // })
+
+ // Fetch crime incidents (example function)
+ const fetchCrimeIncidents = async (districtId: string) => {
+ try {
+ // This would be replaced with an actual API call
+ // const response = await fetch(`/api/crime-incidents?districtId=${districtId}&year=${year}`)
+ // const data = await response.json()
+
+ // For demonstration, we'll create some sample data
+ const sampleIncidents: CrimeIncident[] = [
+ {
+ id: "1",
+ latitude: -8.1842 + (Math.random() - 0.5) * 0.1,
+ longitude: 113.7031 + (Math.random() - 0.5) * 0.1,
+ description: "Theft incident",
+ date: "2023-05-15",
+ category: "Theft",
+ },
+ {
+ id: "2",
+ latitude: -8.1842 + (Math.random() - 0.5) * 0.1,
+ longitude: 113.7031 + (Math.random() - 0.5) * 0.1,
+ description: "Vandalism",
+ date: "2023-06-22",
+ category: "Property Crime",
+ },
+ {
+ id: "3",
+ latitude: -8.1842 + (Math.random() - 0.5) * 0.1,
+ longitude: 113.7031 + (Math.random() - 0.5) * 0.1,
+ description: "Assault",
+ date: "2023-07-10",
+ category: "Violent Crime",
+ },
+ ]
+
+ setCrimeIncidents(sampleIncidents)
+ setShowIncidents(true)
+ } catch (error) {
+ console.error("Error fetching crime incidents:", error)
+ }
+ }
+
+ const handleDistrictClick = (feature: any) => {
+ const districtId = feature.properties.id
+ const districtName = feature.properties.name
+
+ toast({
+ title: `Selected: ${districtName}`,
+ description: "Loading crime incidents for this district...",
+ })
+
+ fetchCrimeIncidents(districtId)
+ }
+
+ const handleIncidentClick = (incident: CrimeIncident) => {
+ toast({
+ title: "Crime Incident",
+ description: `${incident.description} on ${incident.date}`,
+ })
+ }
+
+ return (
+
+ {/*
+ Crime Rate Map - Jember Regency
+
+ */}
+
+ {loading ? (
+
+ ) : (
+
+
+ {/* District Layer */}
+
+
+ {/* Crime Incident Markers */}
+ {showIncidents &&
+ crimeIncidents.map((incident) => (
+
+ ))}
+
+ {/* Map Legend */}
+ {/* */}
+
+
+ )}
+
+
+ )
+}
diff --git a/sigap-website/app/_components/map/layers/district-layer.tsx b/sigap-website/app/_components/map/layers/district-layer.tsx
new file mode 100644
index 0000000..2e655bc
--- /dev/null
+++ b/sigap-website/app/_components/map/layers/district-layer.tsx
@@ -0,0 +1,159 @@
+"use client"
+
+import { useEffect, useMemo } from "react"
+import { Layer, Source, useMap, Popup } from "react-map-gl/mapbox"
+import { useState } from "react"
+import { IGeoJSONPolygon } from "@/app/_utils/types/map"
+import { CRIME_COLORS, CRIME_RATES } from "@/app/_utils/const/crime"
+
+export type DistrictFeature = {
+ id: string
+ name: string
+ cityName: string
+ code: string
+ polygon: IGeoJSONPolygon
+ crimeRate: "low" | "medium" | "high" | "no_data"
+ crimeCount: number
+ year: number
+}
+
+type DistrictLayerProps = {
+ data: DistrictFeature[]
+ visible?: boolean
+ onClick?: (feature: any) => void
+}
+
+type hoverInfoType = {
+ feature: {
+ properties: {
+ crimeRate: "low" | "medium" | "high" | "no_data"
+ name: string
+ cityName: string
+ crimeCount: number
+ }
+ geometry: {
+ coordinates: number[][][]
+ }
+ }
+ x: number
+ y: number
+}
+
+export default function DistrictLayer({ data, visible = true, onClick }: DistrictLayerProps) {
+ const { current: map } = useMap()
+ const [hoverInfo, setHoverInfo] = useState(null)
+
+ // Convert data to GeoJSON
+ const geojson = useMemo(() => {
+ return {
+ type: "FeatureCollection",
+ features: data
+ .filter((district) => district.polygon) // Only include districts with polygon data
+ .map((district) => ({
+ type: "Feature",
+ properties: {
+ id: district.id,
+ name: district.name,
+ cityName: district.cityName,
+ crimeRate: district.crimeRate,
+ crimeCount: district.crimeCount,
+ color: CRIME_COLORS[district.crimeRate],
+ },
+ geometry: district.polygon,
+ })),
+ }
+ }, [data])
+
+ // Handle hover events
+ useEffect(() => {
+ if (!map) return
+
+ const onHover = (event: any) => {
+ const { features, point } = event
+ const hoveredFeature = features && features[0]
+
+ // Update hover state
+ setHoverInfo(
+ hoveredFeature
+ ? {
+ feature: hoveredFeature,
+ x: point.x,
+ y: point.y,
+ }
+ : null,
+ )
+ }
+
+ // Change cursor on hover
+ const onMouseEnter = () => {
+ if (map) map.getCanvas().style.cursor = "pointer"
+ }
+
+ const onMouseLeave = () => {
+ if (map) map.getCanvas().style.cursor = ""
+ setHoverInfo(null)
+ }
+
+ // Add event listeners
+ map.on("mousemove", "district-fills", onHover)
+ map.on("mouseenter", "district-fills", onMouseEnter)
+ map.on("mouseleave", "district-fills", onMouseLeave)
+ map.on("click", "district-fills", (e) => {
+ if (onClick && e.features && e.features[0]) {
+ onClick(e.features[0])
+ }
+ })
+
+ // Clean up
+ return () => {
+ map.off("mousemove", "district-fills", onHover)
+ map.off("mouseenter", "district-fills", onMouseEnter)
+ map.off("mouseleave", "district-fills", onMouseLeave)
+ map.off("click", "district-fills", onClick as any)
+ }
+ }, [map, onClick])
+
+ if (!visible) return null
+
+ return (
+ <>
+
+
+
+
+
+ {/* Popup on hover */}
+ {hoverInfo && (
+
+
+
{hoverInfo.feature.properties.name}
+
City: {hoverInfo.feature.properties.cityName}
+
Crime Rate: {CRIME_RATES[hoverInfo.feature.properties.crimeRate]}
+
Crime Count: {hoverInfo.feature.properties.crimeCount}
+
+
+ )}
+ >
+ )
+}
diff --git a/sigap-website/app/_components/map/map.tsx b/sigap-website/app/_components/map/map.tsx
new file mode 100644
index 0000000..5022380
--- /dev/null
+++ b/sigap-website/app/_components/map/map.tsx
@@ -0,0 +1,61 @@
+"use client";
+
+import { useState } from 'react';
+import Map, { Source, Layer, MapRef, ViewState, NavigationControl, ScaleControl, FullscreenControl } from 'react-map-gl/mapbox';
+import 'mapbox-gl/dist/mapbox-gl.css';
+import { useRef } from 'react';
+import { MAPBOX_STYLES, MapboxStyle } from '@/app/_utils/const/map';
+
+interface MapViewProps {
+ initialViewState?: Partial;
+ mapStyle?: MapboxStyle
+ onMapLoad?: (map: MapRef) => void
+ className?: string
+ children?: React.ReactNode;
+}
+
+const MapView: React.FC = ({
+ initialViewState = {
+ longitude: 113.6922, // Center of Jember Regency (approximately)
+ latitude: -8.1843,
+ zoom: 9
+ },
+ mapStyle = MAPBOX_STYLES.Standard,
+ children,
+ onMapLoad,
+ className = "h-[600px] w-full rounded-md",
+}) => {
+
+ const [viewState, setViewState] = useState>(initialViewState);
+
+ const mapRef = useRef(null);
+
+ const handleMapLoad = () => {
+ if (mapRef.current && onMapLoad) {
+ onMapLoad(mapRef.current)
+ }
+ }
+
+ return (
+
+
+
+ );
+};
+
+export default MapView;
\ No newline at end of file
diff --git a/sigap-website/app/_components/map/markers/crime-marker.tsx b/sigap-website/app/_components/map/markers/crime-marker.tsx
new file mode 100644
index 0000000..5303302
--- /dev/null
+++ b/sigap-website/app/_components/map/markers/crime-marker.tsx
@@ -0,0 +1,33 @@
+"use client"
+
+import { Marker } from "react-map-gl/mapbox"
+import { AlertTriangle } from "lucide-react"
+
+export type CrimeIncident = {
+ id: string
+ latitude: number
+ longitude: number
+ description: string
+ date: string
+ category?: string
+}
+
+type CrimeMarkerProps = {
+ incident: CrimeIncident
+ onClick?: (incident: CrimeIncident) => void
+}
+
+export default function CrimeMarker({ incident, onClick }: CrimeMarkerProps) {
+ return (
+ onClick && onClick(incident)}
+ >
+
+
+ )
+}
diff --git a/sigap-website/app/_components/map/pop-up.tsx b/sigap-website/app/_components/map/pop-up.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/sigap-website/app/_components/ui/bento-grid.tsx b/sigap-website/app/_components/ui/bento-grid.tsx
new file mode 100644
index 0000000..4870102
--- /dev/null
+++ b/sigap-website/app/_components/ui/bento-grid.tsx
@@ -0,0 +1,68 @@
+import { cn } from "@/app/_lib/utils"
+import type React from "react"
+import type { HTMLAttributes } from "react"
+
+
+interface BentoGridProps extends HTMLAttributes {
+ className?: string
+ children: React.ReactNode
+}
+
+export function BentoGrid({ className, children, ...props }: BentoGridProps) {
+ return (
+
+ {children}
+
+ )
+}
+
+interface BentoGridItemProps extends HTMLAttributes {
+ className?: string
+ title?: string
+ description?: string
+ header?: React.ReactNode
+ icon?: React.ReactNode
+ children?: React.ReactNode
+ colSpan?: "1" | "2" | "3"
+ rowSpan?: "1" | "2" | "3"
+}
+
+export function BentoGridItem({
+ className,
+ title,
+ description,
+ header,
+ icon,
+ children,
+ colSpan = "1",
+ rowSpan = "1",
+ ...props
+}: BentoGridItemProps) {
+ return (
+
+ {header &&
{header}
}
+
+ {icon && (
+
{icon}
+ )}
+ {(title || description) && (
+
+ {title &&
{title}
}
+ {description &&
{description}
}
+
+ )}
+
+ {children &&
{children}
}
+
+ )
+}
diff --git a/sigap-website/app/_components/ui/progress.tsx b/sigap-website/app/_components/ui/progress.tsx
new file mode 100644
index 0000000..8c7fbc4
--- /dev/null
+++ b/sigap-website/app/_components/ui/progress.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import * as React from "react"
+import * as ProgressPrimitive from "@radix-ui/react-progress"
+import { cn } from "@/app/_lib/utils"
+
+const Progress = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ indicatorClassName?: string
+ }
+>(({ className, value, indicatorClassName, ...props }, ref) => (
+
+
+
+))
+Progress.displayName = ProgressPrimitive.Root.displayName
+
+export { Progress }
diff --git a/sigap-website/app/_utils/clustering.ts b/sigap-website/app/_utils/clustering.ts
new file mode 100644
index 0000000..2708b5c
--- /dev/null
+++ b/sigap-website/app/_utils/clustering.ts
@@ -0,0 +1,121 @@
+// // utils/clustering.ts
+// import * as math from 'mathjs';
+
+// interface ClusteringData {
+// districtId: string;
+// populationDensity: number;
+// unemploymentRate: number;
+// crimeCount: number;
+// }
+
+// export function normalizeData(data: ClusteringData[]): ClusteringData[] {
+// // Ekstrak nilai untuk setiap dimensi
+// const densities = data.map(item => item.populationDensity);
+// const unemploymentRates = data.map(item => item.unemploymentRate);
+// const crimeCounts = data.map(item => item.crimeCount);
+
+// // Hitung min dan max untuk normalisasi
+// const minDensity = Math.min(...densities);
+// const maxDensity = Math.max(...densities);
+// const minUnemployment = Math.min(...unemploymentRates);
+// const maxUnemployment = Math.max(...unemploymentRates);
+// const minCrimeCount = Math.min(...crimeCounts);
+// const maxCrimeCount = Math.max(...crimeCounts);
+
+// // Normalisasi data antara 0 dan 1
+// return data.map(item => ({
+// ...item,
+// populationDensity: (item.populationDensity - minDensity) / (maxDensity - minDensity || 1),
+// unemploymentRate: (item.unemploymentRate - minUnemployment) / (maxUnemployment - minUnemployment || 1),
+// crimeCount: (item.crimeCount - minCrimeCount) / (maxCrimeCount - minCrimeCount || 1)
+// }));
+// }
+
+// export function kMeansClustering(data: ClusteringData[], k = 3, maxIterations = 100): { clusters: number[], centroids: number[][] } {
+// const normalizedData = normalizeData(data);
+
+// // Mengubah data ke format yang sesuai untuk algoritma k-means
+// const points = normalizedData.map(item => [
+// item.populationDensity,
+// item.unemploymentRate,
+// item.crimeCount
+// ]);
+
+// // Inisialisasi centroid secara acak
+// let centroids = Array(k).fill(0).map(() => {
+// return [
+// Math.random(),
+// Math.random(),
+// Math.random()
+// ];
+// });
+
+// let clusters: number[] = [];
+// let iterations = 0;
+// let oldCentroids: number[][] = [];
+
+// // Algoritma K-means
+// while (iterations < maxIterations) {
+// // Tetapkan setiap titik ke centroid terdekat
+// clusters = points.map(point => {
+// const distances = centroids.map(centroid =>
+// Math.sqrt(
+// Math.pow(point[0] - centroid[0], 2) +
+// Math.pow(point[1] - centroid[1], 2) +
+// Math.pow(point[2] - centroid[2], 2)
+// )
+// );
+// return distances.indexOf(Math.min(...distances));
+// });
+
+// // Simpan centroid lama untuk mengetahui konvergensi
+// oldCentroids = [...centroids];
+
+// // Hitung centroid baru berdasarkan pengelompokan saat ini
+// for (let i = 0; i < k; i++) {
+// const clusterPoints = points.filter((_, index) => clusters[index] === i);
+
+// if (clusterPoints.length > 0) {
+// centroids[i] = [
+// clusterPoints.reduce((sum, point) => sum + point[0], 0) / clusterPoints.length,
+// clusterPoints.reduce((sum, point) => sum + point[1], 0) / clusterPoints.length,
+// clusterPoints.reduce((sum, point) => sum + point[2], 0) / clusterPoints.length
+// ];
+// }
+// }
+
+// // Cek konvergensi
+// const centroidChange = centroids.reduce((acc, curr, i) => {
+// return acc + Math.sqrt(
+// Math.pow(curr[0] - oldCentroids[i][0], 2) +
+// Math.pow(curr[1] - oldCentroids[i][1], 2) +
+// Math.pow(curr[2] - oldCentroids[i][2], 2)
+// );
+// }, 0);
+
+// if (centroidChange < 0.001) {
+// break;
+// }
+
+// iterations++;
+// }
+
+// // Urutkan cluster berdasarkan tingkat bahaya (tingkat kejahatan)
+// // Semakin tinggi nilai pada centroid ketiga (crime count), semakin tinggi risikonya
+// const orderedClusters = [...Array(k).keys()].sort((a, b) =>
+// centroids[a][2] - centroids[b][2]
+// );
+
+// // Petakan cluster asli ke cluster terurut (low, medium, high)
+// const mappedClusters = clusters.map(cluster =>
+// orderedClusters.indexOf(cluster)
+// );
+
+// return { clusters: mappedClusters, centroids };
+// }
+
+// // Fungsi untuk mengubah hasil clustering ke format Prisma untuk disimpan
+// export function mapClustersToCrimeRates(clusters: number[]): ('low' | 'medium' | 'high')[] {
+// const rateMap = ['low', 'medium', 'high'] as const;
+// return clusters.map(cluster => rateMap[cluster]);
+// }
\ No newline at end of file
diff --git a/sigap-website/app/_utils/const/crime.ts b/sigap-website/app/_utils/const/crime.ts
new file mode 100644
index 0000000..d7df419
--- /dev/null
+++ b/sigap-website/app/_utils/const/crime.ts
@@ -0,0 +1,15 @@
+// Define the color scheme for crime rates
+export const CRIME_COLORS = {
+ low: "#4ade80", // green
+ medium: "#facc15", // yellow
+ high: "#ef4444", // red
+ no_data: "#94a3b8", // slate
+}
+
+// Define the crime rate labels
+export const CRIME_RATES = {
+ low: "Low",
+ medium: "Medium",
+ high: "High",
+ no_data: "No Data",
+}
diff --git a/sigap-website/app/_utils/const/map-style.ts b/sigap-website/app/_utils/const/map-style.ts
new file mode 100644
index 0000000..e69de29
diff --git a/sigap-website/app/_utils/const/map.ts b/sigap-website/app/_utils/const/map.ts
new file mode 100644
index 0000000..c016ca2
--- /dev/null
+++ b/sigap-website/app/_utils/const/map.ts
@@ -0,0 +1,15 @@
+// mapStyles.ts
+export const MAPBOX_STYLES = {
+ Standard: 'mapbox://styles/mapbox/standard',
+ StandardSatellite: 'mapbox://styles/mapbox/standard-satellite',
+ Streets: 'mapbox://styles/mapbox/streets-v12',
+ Outdoors: 'mapbox://styles/mapbox/outdoors-v12',
+ Light: 'mapbox://styles/mapbox/light-v11',
+ Dark: 'mapbox://styles/mapbox/dark-v11',
+ Satellite: 'mapbox://styles/mapbox/satellite-v9',
+ SatelliteStreets: 'mapbox://styles/mapbox/satellite-streets-v12',
+ NavigationDay: 'mapbox://styles/mapbox/navigation-day-v1',
+ NavigationNight: 'mapbox://styles/mapbox/navigation-night-v1',
+} as const;
+
+export type MapboxStyle = (typeof MAPBOX_STYLES)[keyof typeof MAPBOX_STYLES];
diff --git a/sigap-website/app/_utils/types/district.ts b/sigap-website/app/_utils/types/district.ts
new file mode 100644
index 0000000..a4f1ad5
--- /dev/null
+++ b/sigap-website/app/_utils/types/district.ts
@@ -0,0 +1,12 @@
+import { IGeoJSONPolygon } from "./map"
+
+export type IDistrictGeoData = {
+ id: string
+ name: string
+ cityName: string
+ code: string
+ polygon: IGeoJSONPolygon
+ crimeRate: "low" | "medium" | "high" | "empty"
+ crimeCount: number
+ year: number
+}
\ No newline at end of file
diff --git a/sigap-website/app/_utils/types/map.ts b/sigap-website/app/_utils/types/map.ts
new file mode 100644
index 0000000..3f494f7
--- /dev/null
+++ b/sigap-website/app/_utils/types/map.ts
@@ -0,0 +1,17 @@
+import { IDistrictGeoData } from "./crime-management";
+
+export interface IGeoJSONPolygon {
+ type: 'Polygon' | 'MultiPolygon';
+ coordinates: number[][][];
+}
+
+export interface IGeoJSONFeature {
+ type: 'Feature';
+ geometry: IGeoJSONPolygon;
+ properties: IDistrictGeoData;
+}
+
+export interface IGeoJSONFeatureCollection {
+ type: 'FeatureCollection';
+ features: IGeoJSONFeature[];
+}
\ No newline at end of file
diff --git a/sigap-website/package-lock.json b/sigap-website/package-lock.json
index 83ec49e..0756af3 100644
--- a/sigap-website/package-lock.json
+++ b/sigap-website/package-lock.json
@@ -17,6 +17,7 @@
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-popover": "^1.1.6",
+ "@radix-ui/react-progress": "^1.1.3",
"@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
@@ -32,6 +33,8 @@
"@tanstack/react-query": "^5.66.9",
"@tanstack/react-table": "^8.21.2",
"@tanstack/react-virtual": "^3.13.2",
+ "@turf/turf": "^7.2.0",
+ "@types/mapbox-gl": "^3.4.1",
"autoprefixer": "10.4.20",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
@@ -39,6 +42,7 @@
"embla-carousel-react": "^8.5.2",
"input-otp": "^1.4.2",
"lucide-react": "^0.468.0",
+ "mapbox-gl": "^3.11.0",
"motion": "^12.4.7",
"next": "latest",
"next-themes": "^0.4.4",
@@ -47,6 +51,7 @@
"react-day-picker": "^8.10.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
+ "react-map-gl": "^8.0.3",
"resend": "^4.1.2",
"sonner": "^2.0.1",
"vaul": "^1.1.2",
@@ -1621,6 +1626,75 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "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": "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/@mapbox/tiny-sdf": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz",
+ "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==",
+ "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": "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/@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/@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/@next/env": {
"version": "15.2.0",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.0.tgz",
@@ -3020,6 +3094,101 @@
}
}
},
+ "node_modules/@radix-ui/react-progress": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.3.tgz",
+ "integrity": "sha512-F56aZPGTPb4qJQ/vDjnAq63oTu/DRoIG/Asb5XKOWj8rpefNLtUllR969j5QDN2sRrTk9VXIqQDRj5VvAuquaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz",
+ "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz",
+ "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-radio-group": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.3.tgz",
@@ -4611,6 +4780,2045 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@turf/along": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/along/-/along-7.2.0.tgz",
+ "integrity": "sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bearing": "^7.2.0",
+ "@turf/destination": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/angle": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-7.2.0.tgz",
+ "integrity": "sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bearing": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/area": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.2.0.tgz",
+ "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/bbox": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz",
+ "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/bbox-clip": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.2.0.tgz",
+ "integrity": "sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/bbox-polygon": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-7.2.0.tgz",
+ "integrity": "sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/bearing": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-7.2.0.tgz",
+ "integrity": "sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/bezier-spline": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-7.2.0.tgz",
+ "integrity": "sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-clockwise": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-7.2.0.tgz",
+ "integrity": "sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-concave": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-concave/-/boolean-concave-7.2.0.tgz",
+ "integrity": "sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-contains": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-7.2.0.tgz",
+ "integrity": "sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-crosses": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-7.2.0.tgz",
+ "integrity": "sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/polygon-to-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-disjoint": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-7.2.0.tgz",
+ "integrity": "sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/polygon-to-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-equal": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-7.2.0.tgz",
+ "integrity": "sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clean-coords": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "geojson-equality-ts": "^1.0.2",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-intersects": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-7.2.0.tgz",
+ "integrity": "sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-disjoint": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-overlap": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-7.2.0.tgz",
+ "integrity": "sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/line-overlap": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "geojson-equality-ts": "^1.0.2",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-parallel": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-7.2.0.tgz",
+ "integrity": "sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clean-coords": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/line-segment": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-point-in-polygon": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.2.0.tgz",
+ "integrity": "sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "point-in-polygon-hao": "^1.1.0",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-point-on-line": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-7.2.0.tgz",
+ "integrity": "sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-touches": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-touches/-/boolean-touches-7.2.0.tgz",
+ "integrity": "sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-valid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-valid/-/boolean-valid-7.2.0.tgz",
+ "integrity": "sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-crosses": "^7.2.0",
+ "@turf/boolean-disjoint": "^7.2.0",
+ "@turf/boolean-overlap": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "geojson-polygon-self-intersections": "^1.2.1",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-within": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-7.2.0.tgz",
+ "integrity": "sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/buffer": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-7.2.0.tgz",
+ "integrity": "sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/center": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/jsts": "^2.7.1",
+ "@turf/meta": "^7.2.0",
+ "@turf/projection": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "d3-geo": "1.7.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/center": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/center/-/center-7.2.0.tgz",
+ "integrity": "sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/center-mean": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-7.2.0.tgz",
+ "integrity": "sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/center-median": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-7.2.0.tgz",
+ "integrity": "sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/center-mean": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/center-of-mass": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-7.2.0.tgz",
+ "integrity": "sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/centroid": "^7.2.0",
+ "@turf/convex": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/centroid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz",
+ "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/circle": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-7.2.0.tgz",
+ "integrity": "sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/destination": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/clean-coords": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.2.0.tgz",
+ "integrity": "sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/clone": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-7.2.0.tgz",
+ "integrity": "sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/clusters": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-7.2.0.tgz",
+ "integrity": "sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/clusters-dbscan": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-7.2.0.tgz",
+ "integrity": "sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "rbush": "^3.0.1",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/clusters-kmeans": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-7.2.0.tgz",
+ "integrity": "sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "skmeans": "0.9.7",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/collect": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-7.2.0.tgz",
+ "integrity": "sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "rbush": "^3.0.1",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/combine": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-7.2.0.tgz",
+ "integrity": "sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/concave": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-7.2.0.tgz",
+ "integrity": "sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/tin": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "topojson-client": "3.x",
+ "topojson-server": "3.x",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/convex": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-7.2.0.tgz",
+ "integrity": "sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "concaveman": "^1.2.1",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/destination": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-7.2.0.tgz",
+ "integrity": "sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/difference": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-7.2.0.tgz",
+ "integrity": "sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/dissolve": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-7.2.0.tgz",
+ "integrity": "sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/flatten": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/distance": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-7.2.0.tgz",
+ "integrity": "sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/distance-weight": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-7.2.0.tgz",
+ "integrity": "sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/centroid": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/ellipse": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-7.2.0.tgz",
+ "integrity": "sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/rhumb-destination": "^7.2.0",
+ "@turf/transform-rotate": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/envelope": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-7.2.0.tgz",
+ "integrity": "sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/bbox-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/explode": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-7.2.0.tgz",
+ "integrity": "sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/flatten": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-7.2.0.tgz",
+ "integrity": "sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/flip": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-7.2.0.tgz",
+ "integrity": "sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/geojson-rbush": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/geojson-rbush/-/geojson-rbush-7.2.0.tgz",
+ "integrity": "sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "rbush": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/great-circle": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-7.2.0.tgz",
+ "integrity": "sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/helpers": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz",
+ "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/hex-grid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-7.2.0.tgz",
+ "integrity": "sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/intersect": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/interpolate": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-7.2.0.tgz",
+ "integrity": "sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/hex-grid": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/point-grid": "^7.2.0",
+ "@turf/square-grid": "^7.2.0",
+ "@turf/triangle-grid": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/intersect": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-7.2.0.tgz",
+ "integrity": "sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/invariant": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.2.0.tgz",
+ "integrity": "sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/isobands": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-7.2.0.tgz",
+ "integrity": "sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/area": "^7.2.0",
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/explode": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "marchingsquares": "^1.3.3",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/isolines": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-7.2.0.tgz",
+ "integrity": "sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "marchingsquares": "^1.3.3",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/jsts": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@turf/jsts/-/jsts-2.7.2.tgz",
+ "integrity": "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==",
+ "license": "(EDL-1.0 OR EPL-1.0)",
+ "dependencies": {
+ "jsts": "2.7.1"
+ }
+ },
+ "node_modules/@turf/kinks": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-7.2.0.tgz",
+ "integrity": "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/length": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/length/-/length-7.2.0.tgz",
+ "integrity": "sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-arc": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-7.2.0.tgz",
+ "integrity": "sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/circle": "^7.2.0",
+ "@turf/destination": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-chunk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-7.2.0.tgz",
+ "integrity": "sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/length": "^7.2.0",
+ "@turf/line-slice-along": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-intersect": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-7.2.0.tgz",
+ "integrity": "sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "sweepline-intersections": "^1.5.0",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-offset": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-7.2.0.tgz",
+ "integrity": "sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-overlap": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-7.2.0.tgz",
+ "integrity": "sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/geojson-rbush": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-segment": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/nearest-point-on-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "fast-deep-equal": "^3.1.3",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-overlap/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==",
+ "license": "MIT"
+ },
+ "node_modules/@turf/line-segment": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-7.2.0.tgz",
+ "integrity": "sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-slice": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-7.2.0.tgz",
+ "integrity": "sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/nearest-point-on-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-slice-along": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-7.2.0.tgz",
+ "integrity": "sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bearing": "^7.2.0",
+ "@turf/destination": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-split": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-7.2.0.tgz",
+ "integrity": "sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/geojson-rbush": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/line-segment": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/nearest-point-on-line": "^7.2.0",
+ "@turf/square": "^7.2.0",
+ "@turf/truncate": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/line-to-polygon": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-7.2.0.tgz",
+ "integrity": "sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/mask": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-7.2.0.tgz",
+ "integrity": "sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/meta": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz",
+ "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/midpoint": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-7.2.0.tgz",
+ "integrity": "sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bearing": "^7.2.0",
+ "@turf/destination": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/moran-index": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-7.2.0.tgz",
+ "integrity": "sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance-weight": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/nearest-neighbor-analysis": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/nearest-neighbor-analysis/-/nearest-neighbor-analysis-7.2.0.tgz",
+ "integrity": "sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/area": "^7.2.0",
+ "@turf/bbox": "^7.2.0",
+ "@turf/bbox-polygon": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/nearest-point": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/nearest-point": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-7.2.0.tgz",
+ "integrity": "sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/nearest-point-on-line": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-7.2.0.tgz",
+ "integrity": "sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/nearest-point-to-line": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-7.2.0.tgz",
+ "integrity": "sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/point-to-line-distance": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/planepoint": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-7.2.0.tgz",
+ "integrity": "sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/point-grid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-7.2.0.tgz",
+ "integrity": "sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-within": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/point-on-feature": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-7.2.0.tgz",
+ "integrity": "sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/center": "^7.2.0",
+ "@turf/explode": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/nearest-point": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/point-to-line-distance": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-7.2.0.tgz",
+ "integrity": "sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bearing": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/nearest-point-on-line": "^7.2.0",
+ "@turf/projection": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@turf/rhumb-distance": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/point-to-polygon-distance": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/point-to-polygon-distance/-/point-to-polygon-distance-7.2.0.tgz",
+ "integrity": "sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/point-to-line-distance": "^7.2.0",
+ "@turf/polygon-to-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/points-within-polygon": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-7.2.0.tgz",
+ "integrity": "sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/polygon-smooth": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-7.2.0.tgz",
+ "integrity": "sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/polygon-tangents": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-7.2.0.tgz",
+ "integrity": "sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/boolean-within": "^7.2.0",
+ "@turf/explode": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/nearest-point": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/polygon-to-line": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-7.2.0.tgz",
+ "integrity": "sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/polygonize": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-7.2.0.tgz",
+ "integrity": "sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/envelope": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/projection": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-7.2.0.tgz",
+ "integrity": "sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/quadrat-analysis": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/quadrat-analysis/-/quadrat-analysis-7.2.0.tgz",
+ "integrity": "sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/area": "^7.2.0",
+ "@turf/bbox": "^7.2.0",
+ "@turf/bbox-polygon": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/point-grid": "^7.2.0",
+ "@turf/random": "^7.2.0",
+ "@turf/square-grid": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/random": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/random/-/random-7.2.0.tgz",
+ "integrity": "sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/rectangle-grid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-7.2.0.tgz",
+ "integrity": "sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-intersects": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/rewind": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-7.2.0.tgz",
+ "integrity": "sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-clockwise": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/rhumb-bearing": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-7.2.0.tgz",
+ "integrity": "sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/rhumb-destination": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-7.2.0.tgz",
+ "integrity": "sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/rhumb-distance": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-7.2.0.tgz",
+ "integrity": "sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/sample": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-7.2.0.tgz",
+ "integrity": "sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/sector": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-7.2.0.tgz",
+ "integrity": "sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/circle": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/line-arc": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/shortest-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-7.2.0.tgz",
+ "integrity": "sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/bbox-polygon": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/clean-coords": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/transform-scale": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/simplify": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-7.2.0.tgz",
+ "integrity": "sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clean-coords": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/square": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/square/-/square-7.2.0.tgz",
+ "integrity": "sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/square-grid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-7.2.0.tgz",
+ "integrity": "sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/rectangle-grid": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/standard-deviational-ellipse": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-7.2.0.tgz",
+ "integrity": "sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/center-mean": "^7.2.0",
+ "@turf/ellipse": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/points-within-polygon": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/tag": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-7.2.0.tgz",
+ "integrity": "sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/tesselate": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-7.2.0.tgz",
+ "integrity": "sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "earcut": "^2.2.4",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/tesselate/node_modules/earcut": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==",
+ "license": "ISC"
+ },
+ "node_modules/@turf/tin": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-7.2.0.tgz",
+ "integrity": "sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/transform-rotate": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-7.2.0.tgz",
+ "integrity": "sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/centroid": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@turf/rhumb-destination": "^7.2.0",
+ "@turf/rhumb-distance": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/transform-scale": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-7.2.0.tgz",
+ "integrity": "sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/center": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@turf/rhumb-destination": "^7.2.0",
+ "@turf/rhumb-distance": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/transform-translate": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-7.2.0.tgz",
+ "integrity": "sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/rhumb-destination": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/triangle-grid": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-7.2.0.tgz",
+ "integrity": "sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/distance": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/intersect": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/truncate": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-7.2.0.tgz",
+ "integrity": "sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/turf": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-7.2.0.tgz",
+ "integrity": "sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/along": "^7.2.0",
+ "@turf/angle": "^7.2.0",
+ "@turf/area": "^7.2.0",
+ "@turf/bbox": "^7.2.0",
+ "@turf/bbox-clip": "^7.2.0",
+ "@turf/bbox-polygon": "^7.2.0",
+ "@turf/bearing": "^7.2.0",
+ "@turf/bezier-spline": "^7.2.0",
+ "@turf/boolean-clockwise": "^7.2.0",
+ "@turf/boolean-concave": "^7.2.0",
+ "@turf/boolean-contains": "^7.2.0",
+ "@turf/boolean-crosses": "^7.2.0",
+ "@turf/boolean-disjoint": "^7.2.0",
+ "@turf/boolean-equal": "^7.2.0",
+ "@turf/boolean-intersects": "^7.2.0",
+ "@turf/boolean-overlap": "^7.2.0",
+ "@turf/boolean-parallel": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/boolean-point-on-line": "^7.2.0",
+ "@turf/boolean-touches": "^7.2.0",
+ "@turf/boolean-valid": "^7.2.0",
+ "@turf/boolean-within": "^7.2.0",
+ "@turf/buffer": "^7.2.0",
+ "@turf/center": "^7.2.0",
+ "@turf/center-mean": "^7.2.0",
+ "@turf/center-median": "^7.2.0",
+ "@turf/center-of-mass": "^7.2.0",
+ "@turf/centroid": "^7.2.0",
+ "@turf/circle": "^7.2.0",
+ "@turf/clean-coords": "^7.2.0",
+ "@turf/clone": "^7.2.0",
+ "@turf/clusters": "^7.2.0",
+ "@turf/clusters-dbscan": "^7.2.0",
+ "@turf/clusters-kmeans": "^7.2.0",
+ "@turf/collect": "^7.2.0",
+ "@turf/combine": "^7.2.0",
+ "@turf/concave": "^7.2.0",
+ "@turf/convex": "^7.2.0",
+ "@turf/destination": "^7.2.0",
+ "@turf/difference": "^7.2.0",
+ "@turf/dissolve": "^7.2.0",
+ "@turf/distance": "^7.2.0",
+ "@turf/distance-weight": "^7.2.0",
+ "@turf/ellipse": "^7.2.0",
+ "@turf/envelope": "^7.2.0",
+ "@turf/explode": "^7.2.0",
+ "@turf/flatten": "^7.2.0",
+ "@turf/flip": "^7.2.0",
+ "@turf/geojson-rbush": "^7.2.0",
+ "@turf/great-circle": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/hex-grid": "^7.2.0",
+ "@turf/interpolate": "^7.2.0",
+ "@turf/intersect": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@turf/isobands": "^7.2.0",
+ "@turf/isolines": "^7.2.0",
+ "@turf/kinks": "^7.2.0",
+ "@turf/length": "^7.2.0",
+ "@turf/line-arc": "^7.2.0",
+ "@turf/line-chunk": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/line-offset": "^7.2.0",
+ "@turf/line-overlap": "^7.2.0",
+ "@turf/line-segment": "^7.2.0",
+ "@turf/line-slice": "^7.2.0",
+ "@turf/line-slice-along": "^7.2.0",
+ "@turf/line-split": "^7.2.0",
+ "@turf/line-to-polygon": "^7.2.0",
+ "@turf/mask": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/midpoint": "^7.2.0",
+ "@turf/moran-index": "^7.2.0",
+ "@turf/nearest-neighbor-analysis": "^7.2.0",
+ "@turf/nearest-point": "^7.2.0",
+ "@turf/nearest-point-on-line": "^7.2.0",
+ "@turf/nearest-point-to-line": "^7.2.0",
+ "@turf/planepoint": "^7.2.0",
+ "@turf/point-grid": "^7.2.0",
+ "@turf/point-on-feature": "^7.2.0",
+ "@turf/point-to-line-distance": "^7.2.0",
+ "@turf/point-to-polygon-distance": "^7.2.0",
+ "@turf/points-within-polygon": "^7.2.0",
+ "@turf/polygon-smooth": "^7.2.0",
+ "@turf/polygon-tangents": "^7.2.0",
+ "@turf/polygon-to-line": "^7.2.0",
+ "@turf/polygonize": "^7.2.0",
+ "@turf/projection": "^7.2.0",
+ "@turf/quadrat-analysis": "^7.2.0",
+ "@turf/random": "^7.2.0",
+ "@turf/rectangle-grid": "^7.2.0",
+ "@turf/rewind": "^7.2.0",
+ "@turf/rhumb-bearing": "^7.2.0",
+ "@turf/rhumb-destination": "^7.2.0",
+ "@turf/rhumb-distance": "^7.2.0",
+ "@turf/sample": "^7.2.0",
+ "@turf/sector": "^7.2.0",
+ "@turf/shortest-path": "^7.2.0",
+ "@turf/simplify": "^7.2.0",
+ "@turf/square": "^7.2.0",
+ "@turf/square-grid": "^7.2.0",
+ "@turf/standard-deviational-ellipse": "^7.2.0",
+ "@turf/tag": "^7.2.0",
+ "@turf/tesselate": "^7.2.0",
+ "@turf/tin": "^7.2.0",
+ "@turf/transform-rotate": "^7.2.0",
+ "@turf/transform-scale": "^7.2.0",
+ "@turf/transform-translate": "^7.2.0",
+ "@turf/triangle-grid": "^7.2.0",
+ "@turf/truncate": "^7.2.0",
+ "@turf/union": "^7.2.0",
+ "@turf/unkink-polygon": "^7.2.0",
+ "@turf/voronoi": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/union": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/union/-/union-7.2.0.tgz",
+ "integrity": "sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/unkink-polygon": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-7.2.0.tgz",
+ "integrity": "sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/area": "^7.2.0",
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "rbush": "^3.0.1",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/voronoi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-7.2.0.tgz",
+ "integrity": "sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/d3-voronoi": "^1.1.12",
+ "@types/geojson": "^7946.0.10",
+ "d3-voronoi": "1.1.2",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
"node_modules/@types/connect": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
@@ -4630,6 +6838,12 @@
"@types/node": "*"
}
},
+ "node_modules/@types/d3-voronoi": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz",
+ "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==",
+ "license": "MIT"
+ },
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
@@ -4658,6 +6872,21 @@
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"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",
@@ -4665,6 +6894,32 @@
"license": "MIT",
"peer": true
},
+ "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/@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/mysql": {
"version": "2.15.26",
"resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz",
@@ -4683,6 +6938,12 @@
"undici-types": "~6.20.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/pg": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
@@ -4735,6 +6996,15 @@
"integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==",
"license": "MIT"
},
+ "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/@types/tedious": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz",
@@ -4867,6 +7137,41 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@vis.gl/react-mapbox": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@vis.gl/react-mapbox/-/react-mapbox-8.0.3.tgz",
+ "integrity": "sha512-/0YcgWOYNU+gPuX5PCZ8ZjbV28d3hYewhGa8MK8q70LbEqhOZycdDP/1taS8ro6vkCpmmuAJUzL24f93Y1Fh/Q==",
+ "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.0.3",
+ "resolved": "https://registry.npmjs.org/@vis.gl/react-maplibre/-/react-maplibre-8.0.3.tgz",
+ "integrity": "sha512-mc5RYZP0t6pVn/x5h2+e2lODd8H7YZElVOLiboXFCBRvOQOyZfFzEXqcEpQHaqOQgdpgozCieKOBr4Q7gql8mw==",
+ "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/@webassemblyjs/ast": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
@@ -5268,6 +7573,24 @@
"node": ">=10"
}
},
+ "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/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/autoprefixer": {
"version": "10.4.20",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
@@ -5342,6 +7665,15 @@
"node": "^4.5.0 || >= 5.9"
}
},
+ "node_modules/bignumber.js": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz",
+ "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -5462,6 +7794,25 @@
"node": ">=10.16.0"
}
},
+ "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/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -5536,6 +7887,12 @@
"url": "https://github.com/chalk/ansi-styles?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/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -5718,6 +8075,24 @@
"license": "MIT",
"peer": true
},
+ "node_modules/concaveman": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz",
+ "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==",
+ "license": "ISC",
+ "dependencies": {
+ "point-in-polygon": "^1.1.0",
+ "rbush": "^3.0.1",
+ "robust-predicates": "^2.0.4",
+ "tinyqueue": "^2.0.3"
+ }
+ },
+ "node_modules/concaveman/node_modules/tinyqueue": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
+ "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==",
+ "license": "ISC"
+ },
"node_modules/config-chain": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
@@ -5779,6 +8154,12 @@
"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/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -5799,6 +8180,27 @@
"devOptional": true,
"license": "MIT"
},
+ "node_modules/d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/d3-geo": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz",
+ "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-array": "1"
+ }
+ },
+ "node_modules/d3-voronoi": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz",
+ "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==",
+ "license": "BSD-3-Clause"
+ },
"node_modules/date-fns": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
@@ -5976,6 +8378,12 @@
"url": "https://dotenvx.com"
}
},
+ "node_modules/earcut": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz",
+ "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==",
+ "license": "ISC"
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -6483,6 +8891,18 @@
"node": ">=0.8.x"
}
},
+ "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": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
@@ -6727,6 +9147,45 @@
"node": ">=6.9.0"
}
},
+ "node_modules/geojson-equality-ts": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz",
+ "integrity": "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "^7946.0.14"
+ }
+ },
+ "node_modules/geojson-polygon-self-intersections": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz",
+ "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==",
+ "license": "MIT",
+ "dependencies": {
+ "rbush": "^2.0.1"
+ }
+ },
+ "node_modules/geojson-polygon-self-intersections/node_modules/quickselect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
+ "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==",
+ "license": "ISC"
+ },
+ "node_modules/geojson-polygon-self-intersections/node_modules/rbush": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
+ "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
+ "license": "MIT",
+ "dependencies": {
+ "quickselect": "^1.0.1"
+ }
+ },
+ "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-nonce": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
@@ -6736,6 +9195,21 @@
"node": ">=6"
}
},
+ "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.3",
+ "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
+ "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==",
+ "license": "MIT"
+ },
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -6792,6 +9266,12 @@
"license": "ISC",
"peer": true
},
+ "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-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6874,7 +9354,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -7000,6 +9479,15 @@
"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",
@@ -7049,6 +9537,18 @@
"node": ">=0.12.0"
}
},
+ "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-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
@@ -7077,6 +9577,15 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"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/jackspeak": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
@@ -7226,6 +9735,12 @@
"license": "MIT",
"peer": true
},
+ "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/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -7238,6 +9753,21 @@
"node": ">=6"
}
},
+ "node_modules/jsts": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/jsts/-/jsts-2.7.1.tgz",
+ "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==",
+ "license": "(EDL-1.0 OR EPL-1.0)",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "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",
@@ -7386,6 +9916,52 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/mapbox-gl": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.11.0.tgz",
+ "integrity": "sha512-0bJoYMgwn/z0RSJH7j/kYq3xlTX8Vt4dBkWAKJFneB49PAiq+rAAZRAeUhMxCr8PoGLRaDBagF3fTsA/WK6Q4A==",
+ "license": "SEE LICENSE IN LICENSE.txt",
+ "workspaces": [
+ "src/style-spec",
+ "test/build/typings"
+ ],
+ "dependencies": {
+ "@mapbox/jsonlint-lines-primitives": "^2.0.2",
+ "@mapbox/mapbox-gl-supported": "^3.0.0",
+ "@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",
+ "@types/geojson": "^7946.0.16",
+ "@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",
+ "cheap-ruler": "^4.0.0",
+ "csscolorparser": "~1.0.3",
+ "earcut": "^3.0.0",
+ "geojson-vt": "^4.0.2",
+ "gl-matrix": "^3.4.3",
+ "grid-index": "^1.1.0",
+ "kdbush": "^4.0.2",
+ "murmurhash-js": "^1.0.0",
+ "pbf": "^3.2.1",
+ "potpack": "^2.0.0",
+ "quickselect": "^3.0.0",
+ "serialize-to-js": "^3.1.2",
+ "supercluster": "^8.0.1",
+ "tinyqueue": "^3.0.0",
+ "vt-pbf": "^3.1.3"
+ }
+ },
+ "node_modules/marchingsquares": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/marchingsquares/-/marchingsquares-1.3.3.tgz",
+ "integrity": "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==",
+ "license": "AGPL-3.0"
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -7463,6 +10039,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "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/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
@@ -7525,6 +10110,12 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"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/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -7936,6 +10527,19 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "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/peberminta": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz",
@@ -8014,6 +10618,37 @@
"node": ">= 6"
}
},
+ "node_modules/point-in-polygon": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz",
+ "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==",
+ "license": "MIT"
+ },
+ "node_modules/point-in-polygon-hao": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz",
+ "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==",
+ "license": "MIT",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
+ "node_modules/point-in-polygon-hao/node_modules/robust-predicates": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
+ "license": "Unlicense"
+ },
+ "node_modules/polyclip-ts": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/polyclip-ts/-/polyclip-ts-0.16.8.tgz",
+ "integrity": "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.1.0",
+ "splaytree-ts": "^1.0.2"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
@@ -8201,6 +10836,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/potpack": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz",
+ "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==",
+ "license": "ISC"
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8272,6 +10913,12 @@
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"license": "ISC"
},
+ "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/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -8310,6 +10957,12 @@
],
"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/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -8320,6 +10973,21 @@
"safe-buffer": "^5.1.0"
}
},
+ "node_modules/rbush": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+ "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+ "license": "MIT",
+ "dependencies": {
+ "quickselect": "^2.0.0"
+ }
+ },
+ "node_modules/rbush/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/react": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
@@ -9167,6 +11835,30 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT"
},
+ "node_modules/react-map-gl": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-8.0.3.tgz",
+ "integrity": "sha512-RZ93PKfJtXGIfx+hT5drLeiEwrbQnMAhI8YWq02OwfFIEIEQU/KnlJlFCvFCS+ezj9VExl7gQHJu5b1TC+U3EA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vis.gl/react-mapbox": "8.0.3",
+ "@vis.gl/react-maplibre": "8.0.3"
+ },
+ "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/react-promise-suspense": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz",
@@ -9349,6 +12041,15 @@
"node": ">=4"
}
},
+ "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/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -9381,6 +12082,12 @@
"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/rollup": {
"version": "4.34.9",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz",
@@ -9443,6 +12150,12 @@
"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/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -9570,6 +12283,30 @@
"randombytes": "^2.1.0"
}
},
+ "node_modules/serialize-to-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.2.tgz",
+ "integrity": "sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "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.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
@@ -9659,6 +12396,12 @@
"is-arrayish": "^0.3.1"
}
},
+ "node_modules/skmeans": {
+ "version": "0.9.7",
+ "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz",
+ "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==",
+ "license": "MIT"
+ },
"node_modules/socket.io": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
@@ -9789,6 +12532,41 @@
"react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
}
},
+ "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": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -9819,6 +12597,49 @@
"source-map": "^0.6.0"
}
},
+ "node_modules/splaytree-ts": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/splaytree-ts/-/splaytree-ts-1.0.2.tgz",
+ "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==",
+ "license": "BDS-3-Clause"
+ },
+ "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/stacktrace-parser": {
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz",
@@ -10005,6 +12826,15 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "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",
@@ -10029,6 +12859,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sweepline-intersections": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz",
+ "integrity": "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tinyqueue": "^2.0.0"
+ }
+ },
+ "node_modules/sweepline-intersections/node_modules/tinyqueue": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
+ "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==",
+ "license": "ISC"
+ },
"node_modules/tailwind-merge": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
@@ -10182,6 +13027,12 @@
"node": ">=0.8"
}
},
+ "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",
@@ -10194,6 +13045,44 @@
"node": ">=8.0"
}
},
+ "node_modules/topojson-client": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
+ "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
+ "license": "ISC",
+ "dependencies": {
+ "commander": "2"
+ },
+ "bin": {
+ "topo2geo": "bin/topo2geo",
+ "topomerge": "bin/topomerge",
+ "topoquantize": "bin/topoquantize"
+ }
+ },
+ "node_modules/topojson-client/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/topojson-server": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz",
+ "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==",
+ "license": "ISC",
+ "dependencies": {
+ "commander": "2"
+ },
+ "bin": {
+ "geo2topo": "bin/geo2topo"
+ }
+ },
+ "node_modules/topojson-server/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -10314,12 +13203,42 @@
"node": ">=14.17"
}
},
+ "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/undici-types": {
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"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/unplugin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz",
@@ -10466,6 +13385,17 @@
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
}
},
+ "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/watchpack": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
diff --git a/sigap-website/package.json b/sigap-website/package.json
index 412663f..48da17f 100644
--- a/sigap-website/package.json
+++ b/sigap-website/package.json
@@ -22,6 +22,7 @@
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-popover": "^1.1.6",
+ "@radix-ui/react-progress": "^1.1.3",
"@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
@@ -37,6 +38,8 @@
"@tanstack/react-query": "^5.66.9",
"@tanstack/react-table": "^8.21.2",
"@tanstack/react-virtual": "^3.13.2",
+ "@turf/turf": "^7.2.0",
+ "@types/mapbox-gl": "^3.4.1",
"autoprefixer": "10.4.20",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
@@ -44,6 +47,7 @@
"embla-carousel-react": "^8.5.2",
"input-otp": "^1.4.2",
"lucide-react": "^0.468.0",
+ "mapbox-gl": "^3.11.0",
"motion": "^12.4.7",
"next": "latest",
"next-themes": "^0.4.4",
@@ -52,6 +56,7 @@
"react-day-picker": "^8.10.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
+ "react-map-gl": "^8.0.3",
"resend": "^4.1.2",
"sonner": "^2.0.1",
"vaul": "^1.1.2",
@@ -73,4 +78,4 @@
"ts-node": "^10.9.2",
"typescript": "^5.7.2"
}
-}
\ No newline at end of file
+}
diff --git a/sigap-website/prisma/data/nav.ts b/sigap-website/prisma/data/nav.ts
index 2aafaa4..1c17f23 100644
--- a/sigap-website/prisma/data/nav.ts
+++ b/sigap-website/prisma/data/nav.ts
@@ -116,15 +116,15 @@ export const navData = {
},
{
title: "Cases",
- url: "/dashboard/crime-management/crime-cases",
- slug: "crime-cases",
+ url: "/dashboard/crime-management/crime-incident",
+ slug: "crime-incident",
icon: IconAlertTriangle,
orderSeq: 3,
isActive: true,
subSubItems: [
{
title: "New Case",
- url: "/dashboard/crime-management/crime-cases/case-new",
+ url: "/dashboard/crime-management/crime-incident/case-new",
slug: "new-case",
icon: IconAlertTriangle,
orderSeq: 1,
@@ -132,7 +132,7 @@ export const navData = {
},
{
title: "Active Cases",
- url: "/dashboard/crime-management/crime-cases/case-active",
+ url: "/dashboard/crime-management/crime-incident/case-active",
slug: "active-cases",
icon: IconAlertTriangle,
orderSeq: 2,
@@ -140,7 +140,7 @@ export const navData = {
},
{
title: "Resolved Cases",
- url: "/dashboard/crime-management/crime-cases/case-closed",
+ url: "/dashboard/crime-management/crime-incident/case-closed",
slug: "resolved-cases",
icon: IconAlertTriangle,
orderSeq: 3,
diff --git a/sigap-website/prisma/schema.prisma b/sigap-website/prisma/schema.prisma
index 494e0ec..797e37f 100644
--- a/sigap-website/prisma/schema.prisma
+++ b/sigap-website/prisma/schema.prisma
@@ -11,10 +11,9 @@ datasource db {
}
model cities {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ id String @id
geographic_id String? @db.Uuid
name String @db.VarChar(100)
- code String @db.VarChar(10)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
geographics geographics? @relation(fields: [geographic_id], references: [id])
@@ -38,7 +37,7 @@ model contact_messages {
updated_at DateTime @db.Timestamptz(6)
}
-model crime_cases {
+model crime_incidents {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
crime_id String? @db.Uuid
crime_category_id String? @db.Uuid
@@ -57,27 +56,27 @@ model crime_cases {
}
model crime_categories {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- name String @db.VarChar(255)
- description String
- created_at DateTime @default(now()) @db.Timestamptz(6)
- updated_at DateTime @default(now()) @db.Timestamptz(6)
- crime_cases crime_cases[]
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ name String @db.VarChar(255)
+ description String
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crime_incidents crime_incidents[]
}
model crimes {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- district_id String? @db.Uuid
- city_id String? @db.Uuid
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ district_id String?
+ city_id String?
year Int
number_of_crime Int
- rate crime_rates @default(low)
+ rate crime_rates @default(low)
heat_map Json?
- created_at DateTime @default(now()) @db.Timestamptz(6)
- updated_at DateTime @default(now()) @db.Timestamptz(6)
- crime_cases crime_cases[]
- cities cities? @relation(fields: [city_id], references: [id])
- districts districts? @relation(fields: [district_id], references: [id])
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crime_incidents crime_incidents[]
+ cities cities? @relation(fields: [city_id], references: [id])
+ districts districts? @relation(fields: [district_id], references: [id])
@@unique([city_id, year])
@@unique([district_id, year])
@@ -85,9 +84,9 @@ model crimes {
model demographics {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- district_id String? @db.Uuid
- city_id String? @db.Uuid
- province_id String? @db.Uuid
+ district_id String? @unique
+ city_id String?
+ province_id String?
year Int
population Int
population_density Float
@@ -102,10 +101,9 @@ model demographics {
}
model districts {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- city_id String @db.Uuid
+ id String @id
+ city_id String
name String @db.VarChar(100)
- code String @db.VarChar(10)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
crimes crimes[]
@@ -118,11 +116,12 @@ model districts {
model geographics {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- district_id String? @unique @db.Uuid
+ district_id String? @unique
latitude Float?
longitude Float?
land_area Float?
polygon Json?
+ geometry Json?
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
cities cities[]
diff --git a/sigap-website/prisma/seed.ts b/sigap-website/prisma/seed.ts
index 44b3aea..3cc13c1 100644
--- a/sigap-website/prisma/seed.ts
+++ b/sigap-website/prisma/seed.ts
@@ -198,4 +198,78 @@ main()
console.error(e);
await prisma.$disconnect();
process.exit(1);
- });
\ No newline at end of file
+ });
+
+// import { PrismaClient } from '@prisma/client';
+// import fs from 'fs';
+// import * as turf from '@turf/turf';
+
+// const prisma = new PrismaClient();
+
+// async function main() {
+// const geojson = JSON.parse(fs.readFileSync('prisma/data/geojson/jember/districts.geojson', 'utf-8'));
+
+// // 1. Insert Kota/Kabupaten: Jember
+// const city = await prisma.cities.upsert(
+// {
+// where: { id: '3574' },
+// update: {},
+// create: {
+// id: '3574',
+// name: 'Jember',
+// }
+// }
+// )
+
+// console.log(`City Jember inserted with ID: ${city.id}`);
+
+// // 2. Loop Semua District di GeoJSON
+// for (const feature of geojson.features) {
+// const properties = feature.properties;
+// const geometry = feature.geometry;
+
+// // Cleanup code
+// const districtCode = properties.kode_kec.replace(/\./g, '');
+
+// // Insert District
+// const district = await prisma.districts.create({
+// data: {
+// id: districtCode,
+// name: properties.kecamatan,
+// city_id: city.id,
+// }
+// });
+
+// console.log(`Inserted district: ${district.name}`);
+
+// // 3. Hitung Centroid dan Area
+// const centroid = turf.centroid(feature);
+
+// const [longitude, latitude] = centroid.geometry.coordinates;
+// const area = turf.area(feature) / 1_000_000; // dari m² ke km²
+
+// // 4. Insert Geographics
+// await prisma.geographics.create({
+// data: {
+// district_id: district.id,
+// latitude,
+// longitude,
+// land_area: area,
+// geometry: feature.geometry,
+// }
+// });
+
+// console.log(`Inserted geographics for district: ${district.name}`);
+// }
+
+// console.log("All data imported successfully!");
+// }
+
+// main()
+// .catch((e) => {
+// console.error(e);
+// process.exit(1);
+// })
+// .finally(async () => {
+// await prisma.$disconnect();
+// });