BRITANNIA SHIELD: HOW MANY SYSTEMS DO WE NEED?

By Nicholas Drummond

A follow-up to “Britannia Shield: what it needs to be” that provides a more structured analysis of vulnerable UK bases and critical national infrastructure, and provides a detailed proposal and costs for what is needed to protect them.

The question Britannia Shield has to answer

The Britannia Shield pledge commits Britain to a national air and missile defence umbrella. It sets the ambition but not the size. The hard question — how many fire units, of what type, and at what cost — has gone unanswered. This piece answers it from first principles.

The method is deliberately simple. First, define what the shield has to protect: the fixed national target set an adversary would strike with drones, cruise missiles and tactical ballistic missiles. Second, overlay the engagement envelopes of candidate systems and solve for the minimum number of batteries needed to cover that set. Third, cost it.

A companion interactive map carries the full target set and lets every assumption be varied — coverage ambition, engagement range, which layers are shown — with the battery counts recomputing live. The numbers in this piece are drawn from it.

What the shield must defend

Britain’s fixed target set has changed surprisingly little since the Cold War. The declassified Soviet list held 106 probable targets; the modern equivalent is around 100, falling into eight categories.

CategoryCountExamples
RAF / air bases20Lossiemouth, Marham, Coningsby, Lakenheath
Army garrison centres10Catterick, Aldershot, Tidworth–Bulford
Radar / ASACS stations10Fylingdales, Boulmer, Benbecula, Saxa Vord
Military control centres8MOD Main Building, Northwood, High Wycombe
Naval bases6Clyde (Faslane), Portsmouth, Devonport
Naval control / comms6Northwood, Forest Moor
Centres of government14Westminster, Edinburgh, Cardiff, GCHQ
Key towns & cities24London, Birmingham, Manchester, Glasgow
Total98

Two things have shifted since the 1980s. The USAF footprint has shrunk to two main operating bases, Lakenheath and Mildenhall. And the threat axis is no longer the overland bomber alone: one-way attack drones and submarine- or ship-launched cruise missiles can now reach the east coast and Scotland from the sea, from directions the old plan weighted lightly.

Three threats, three problems

A credible shield has to beat three different weapons, each of which stresses a different part of the defence.

  1. One-way attack drones (Shahed-class) — cheap, slow, low-flying, launched in mass. The problem is magazine depth and cost-per-kill, not sophistication.
  2. Cruise missiles — subsonic to supersonic, terrain-following, launched from ships, submarines, aircraft or the ground. The problem is sensor line-of-sight: you cannot engage what the radar cannot see over the horizon.
  3. Tactical and short-range ballistic missiles — steep, fast, high terminal velocity. The problem is the handful of seconds available to intercept, which demands a dedicated high-tier interceptor.

No single system answers all three. That is the whole case for layering — and the reason the question is not “which system?” but “how many of each?”

Why the answer is layered

To defend the same target set, Britain needs roughly five times as many short-range Sky Sabre batteries as long-range THAAD. Range, not numbers, is the cost driver — but because the three systems counter different threats, the counts do not substitute for one another.

Two patterns matter. Sky Sabre’s requirement climbs steeply with ambition, because 45 km point defence cannot blanket a country. THAAD’s stays almost flat — six batteries cover the whole national set — because its count is set by geography, not by how many sites you choose to value. The conclusion writes itself: a few wide-area batteries for the ballistic problem, a medium tier for cruise, and point defence concentrated on the crown jewels.

Layer 1 — Wide-area ballistic defence (THAAD)

Six THAAD-class batteries give Britain nationwide cover against short- and medium-range ballistic missiles. The count is driven by geography rather than ambition: broadly one battery each for the south, the Midlands and north, central Scotland and the south-west, plus the far-flung outliers — the Western Isles and Shetland radar heads, and Northern Ireland — that no single mainland site can reach.

Britain operates no upper-tier BMD today. The realistic options are a THAAD foreign military sale, or a sea-based Aegis / SM-3 solution better matched to the maritime threat axis. Either is a major new capability line, not an upgrade.

The caveat matters: a 200 km ring is the interceptor’s kinematic reach, not a guaranteed footprint. The area actually defended against a given ballistic trajectory is smaller and geometry-dependent, and THAAD has little value against low, slow drones. It buys the top of the threat stack and nothing beneath it.

Layer 2 — The medium tier (Patriot PAC-3 MSE)

Ten Patriot PAC-3 MSE batteries cover the national set against cruise missiles and shorter-range ballistic threats. This is the workhorse layer, doing the bulk of the area defence between the high tier above and point defence below.

Britain operates no Patriot. This would be a second new capability line — or could be met by an equivalent such as the Franco-Italian SAMP/T. The ~120 km figure is the envelope against air-breathing targets; against ballistic threats the footprint is considerably smaller, which is precisely why the high tier is still needed above it.

Layer 3 — Point defence of critical sites (Sky Sabre / CAMM-ER)

Thirty-two Sky Sabre / CAMM-ER launch units point-defend the 16 Tier-1 sites at two per site: the deterrent at Faslane and Coulport, the carriers at Portsmouth and the fleet at Devonport, the F-35 force at Marham, the QRA bases, Fylingdales, GCHQ and the government core in London. Point defence is counted per site, not by the coverage-minimising logic of the map — a battery sitting 40 km from a crown jewel gives poor terminal defence against a sea-skimming cruise missile or a low drone, so each site needs its own organic launchers.

This is the one GBAD system Britain already fields — and it fields almost none of it. The in-service holding is a handful of batteries; the August 2025 contract adds just six more Land Ceptor launchers. Extending point defence to all 60 military sites would need roughly 120 launch units. The distance between what we hold and what the target set demands is the starkest number in this analysis.

The 32 UK point-defence launch units are augmented by 24 deployable units for the field army, 12 for overseas bases and 4 spare — 72 launch units in total. The unit of account matters: these are launchers, which group into roughly 18 batteries, each with its own Giraffe radar and command post, not 72 complete batteries. CAMM reaches 25 km and CAMM-ER around 45 km; against low cruise missiles and drones, radar line-of-sight caps the real engagement range well inside those figures unless elevated or airborne sensors are added.

Layer 4 — the counter-drone bottom (SHORAD / C-UAS)

Beneath each Sky Sabre site sits a short-range air defence and counter-UAS layer: 2 to 4 units per location by size and importance. That is around 72 units across the UK point-defence sites — but the field army needs at least as many again to replace Stormer HVM and give deployed forces a credible counter-drone capability, so the realistic total is closer to 200 units.

This is the layer the war in Ukraine has made unavoidable. CAMM is far too expensive to expend on a £20,000 Shahed; the bottom layer is guns, VSHORAD missiles such as Starstreak and LMM, and — increasingly — directed energy, whose job is cheap, close-in kills in volume. A shield that cannot do this economically will be bankrupted by drones long before it is defeated by missiles.

The force — and the bill

The recommended force, and the hardware cost to acquire it:

TierSystemUnitsPer unitSystem cost
UpperTHAAD-class6 batteries£1.5bn£9.0bn
MediumPatriot PAC-3 MSE10 batteries£0.9bn£9.0bn
Point defenceSky Sabre / CAMM-ER72 launch units (~18 batteries)£280m / battery£5.0bn
Close-inSHORAD / C-UAS~200 units£20m£4.0bn
Hardware total~£27bn

The figures are open-source and indicative (cost estimates; converted at roughly £1 = $1.27). Two points on method. The upper and medium tiers are costed in sterling at the platform price — a THAAD battery is about $1.5–2.0bn (around £1.2–1.6bn), a Patriot PAC-3 battery about $1.0–1.2bn (around £0.8–0.95bn); an all-in foreign military sale with UK integration and infrastructure would run 20–30% higher. And the point-defence line costs launchers grouped into batteries, not 72 separate batteries: 72 launchers at roughly four per battery is about 18 batteries at £280m each.

Three things this ~£27bn does not include, each of them large. First, interceptor magazines — the missiles themselves — which for a credible war stock add £8–15bn: THAAD rounds are $12–15m each, PAC-3 MSE about $4–5m, and a 72-launcher CAMM force wants a stock in the low thousands. Second, radars, command-and-control integration, through-life support and crews. Third, resilience — these are planning counts with no overlap, no reload positions and no attrition reserve, and a laydown that could actually fight needs 1.5 to 2 times the numbers.

Put those together and the realistic programme is not £27bn but somewhere in the £45–60bn range, spread across a decade. That would rival the nuclear deterrent in scale and ambition — which is the point: a national shield is an enterprise on that order, not a budget line.

The number is large, but it is knowable

Britannia Shield is not a budget line. It is a multi-billion-pound, decade-long national endeavour on the scale of the nuclear deterrent. But the number is finite and knowable: six upper-tier and ten medium-tier batteries, 72 Sky Sabre launch units and around 200 SHORAD vehicles — roughly £27bn of hardware, and £45–60bn as a programme done properly.

If the money has to be phased — and it will — the priority order falls out of the analysis. Buy the upper tier and the Tier-1 point and SHORAD layers first: they protect the deterrent, the carriers and the machinery of government, and they cannot be improvised once a crisis has begun. The medium tier can follow. One caveat on sequencing: the 32-unit homeland point-defence figure assumes Patriot and THAAD exist to carry the area layer; until they do, Sky Sabre is the only GBAD we have, so the interim buy should be larger, drawn down as the upper tiers arrive.

The alternative is to keep pretending that a handful of Sky Sabre batteries amounts to a national shield. The target set is 98 points. We currently defend almost none of them. That, far more than the price tag, is the number that should concentrate minds.

<iframe title="UK layered air defence laydown" loading="lazy" style="width:100%;height:680px;border:0;border-radius:10px;display:block" srcdoc=" UK Air Defence Laydown /* —- Minimal Leaflet 1.9.4 core CSS (inlined; SVG markers, popups, controls — no raster tiles) —- */ .leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container, .leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0;} .leaflet-container{overflow:hidden;-webkit-tap-highlight-color:transparent;outline-offset:1px;} .leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;} .leaflet-marker-icon,.leaflet-marker-shadow{display:block;} .leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important;} .leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img, .leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer, .leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0;} .leaflet-overlay-pane svg{-moz-user-select:none;} .leaflet-pane{z-index:400;} .leaflet-overlay-pane{z-index:400;} .leaflet-shadow-pane{z-index:500;} .leaflet-marker-pane{z-index:600;} .leaflet-tooltip-pane{z-index:650;} .leaflet-popup-pane{z-index:700;} .leaflet-map-pane canvas{z-index:100;} .leaflet-map-pane svg{z-index:200;} .leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto;float:left;clear:both;} .leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none;} .leaflet-top{top:0;}.leaflet-right{right:0;}.leaflet-bottom{bottom:0;}.leaflet-left{left:0;} .leaflet-right .leaflet-control{float:right;margin-right:10px;} .leaflet-top .leaflet-control{margin-top:10px;} .leaflet-bottom .leaflet-control{margin-bottom:10px;} .leaflet-left .leaflet-control{margin-left:10px;} .leaflet-zoom-animated{transform-origin:0 0;} svg.leaflet-zoom-animated{will-change:transform;} .leaflet-zoom-anim .leaflet-zoom-animated{transition:transform .25s cubic-bezier(0,0,.25,1);} .leaflet-control-zoom{border-radius:7px;box-shadow:0 1px 5px rgba(0,0,0,.3);overflow:hidden;} .leaflet-control-zoom a{width:30px;height:30px;line-height:30px;display:block;text-align:center; text-decoration:none;color:#333;background:#fff;font:bold 18px/30px "Lucida Console",Monaco,monospace;} .leaflet-control-zoom a:hover{background:#f4f4f4;} .leaflet-control-zoom a.leaflet-disabled{color:#bbb;cursor:default;} .leaflet-bar a+a{border-top:1px solid #ddd;} .leaflet-popup{position:absolute;text-align:center;margin-bottom:20px;} .leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px;background:var(–panel);color:var(–ink);box-shadow:0 3px 14px rgba(0,0,0,.4);} .leaflet-popup-content{margin:13px 16px;line-height:1.35;min-height:1px;} .leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none;} .leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;transform:rotate(45deg);background:var(–panel);box-shadow:0 3px 14px rgba(0,0,0,.4);} .leaflet-popup-close-button{position:absolute;top:0;right:0;width:24px;height:24px;font:16px/24px Tahoma,sans-serif;color:var(–ink-soft);text-align:center;background:transparent;text-decoration:none;} .leaflet-popup-close-button:hover{color:var(–ink);} .leaflet-container a{color:var(–accent-2);} .leaflet-control-attribution{background:rgba(127,127,127,.12);margin:0;padding:0 6px;color:var(–ink-soft);font-size:10.5px;border-radius:5px 0 0 0;} .leaflet-control-attribution a{color:var(–accent-2);} .leaflet-interactive{cursor:pointer;} .leaflet-grab{cursor:grab;} .leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-interactive{cursor:grabbing;} .leaflet-fade-anim .leaflet-popup{opacity:0;transition:opacity .2s linear;} .leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1;} .leaflet-tooltip{position:absolute;padding:1px 5px;background:var(–panel);border:1px solid var(–panel-edge);border-radius:4px;color:var(–ink);white-space:nowrap;font:700 10px var(–sans);box-shadow:0 1px 3px rgba(0,0,0,.3);pointer-events:none;} .leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{display:none;} /* —- Page design —- */ /* Layout: full-bleed map; floating title + headline-count card (left), stacked control panels (right), list drawer */ :root { –bg: #eceae4; –panel: #f7f6f2; –panel-2: #efeee8; –panel-edge: #d6d2c6; –ink: #1f2427; –ink-soft: #5c6469; –ink-faint: #8b9196; –accent: #7a1f1f; –accent-2: #27476b; –shadow: 0 2px 10px rgba(20,24,28,.16), 0 1px 3px rgba(20,24,28,.10); –mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace; –sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; /* category hues */ –c-raf: #2f6f4f; –c-army: #8a6d1f; –c-radar: #b07d12; –c-mctrl: #a8541b; –c-nbase: #27476b; –c-nctrl: #4f86b8; –c-gov: #7a1f1f; –c-city: #3a3f43; /* defence system hues (layer-semantic) */ –s-camm: #0d9488; /* teal — short-range point defence */ –s-patriot: #d97a1a; /* amber — medium area defence */ –s-thaad: #9333a8; /* violet — wide-area BMD */ –s-shorad: #c01f3f; /* crimson — SHORAD / C-UAS inner bubble */ –land: #dcd8cd; –land-edge: #c3bfb2; –sea: #cfd6da; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { –bg: #14181b; –panel: #1c2226; –panel-2: #222a2f; –panel-edge: #2e373d; –ink: #e7e9ea; –ink-soft: #9aa3a8; –ink-faint: #6f787d; –accent: #d98a8a; –accent-2: #8fb4dc; –shadow: 0 2px 12px rgba(0,0,0,.5), 0 1px 3px rgba(0,0,0,.4); –c-raf:#5bbf8d; –c-army:#d8b24a; –c-radar:#e0a63a; –c-mctrl:#e08a52; –c-nbase:#6f9fd0; –c-nctrl:#8fb4dc; –c-gov:#e39a9a; –c-city:#c3cace; –s-camm:#2dd4bf; –s-patriot:#f0a94e; –s-thaad:#c77de0; –s-shorad:#f0607f; –land:#232a2f; –land-edge:#3a444b; –sea:#161b1f; color-scheme: dark; } } :root[data-theme="dark"] { –bg: #14181b; –panel: #1c2226; –panel-2: #222a2f; –panel-edge: #2e373d; –ink: #e7e9ea; –ink-soft: #9aa3a8; –ink-faint: #6f787d; –accent: #d98a8a; –accent-2: #8fb4dc; –shadow: 0 2px 12px rgba(0,0,0,.5), 0 1px 3px rgba(0,0,0,.4); –c-raf:#5bbf8d; –c-army:#d8b24a; –c-radar:#e0a63a; –c-mctrl:#e08a52; –c-nbase:#6f9fd0; –c-nctrl:#8fb4dc; –c-gov:#e39a9a; –c-city:#c3cace; –s-camm:#2dd4bf; –s-patriot:#f0a94e; –s-thaad:#c77de0; –s-shorad:#f0607f; –land:#232a2f; –land-edge:#3a444b; –sea:#161b1f; color-scheme: dark; } html, body { height: 100%; } body { margin: 0; background: var(–bg); color: var(–ink); font-family: var(–sans); overflow: hidden; } #app { position: relative; height: 100%; width: 100%; } #map { position: absolute; inset: 0; background: var(–sea); } .leaflet-container { font-family: var(–sans); background: var(–sea); } .card { background: var(–panel); border: 1px solid var(–panel-edge); border-radius: 10px; box-shadow: var(–shadow); } /* —- Left column: title + headline results —- */ #leftcol { position: absolute; z-index: 1000; top: env(safe-area-inset-top,0px); left: 0; margin: 12px; margin-left: max(12px, env(safe-area-inset-left,0px)); width: 274px; max-width: calc(100vw – 24px); display: flex; flex-direction: column; gap: 10px; max-height: calc(100% – 24px – env(safe-area-inset-top,0px) – env(safe-area-inset-bottom,0px)); } #titleplate { padding: 12px 14px; } #titleplate h1 { margin: 0; font-size: 15px; font-weight: 700; letter-spacing: -0.01em; text-wrap: balance; } #titleplate .sub { margin: 4px 0 0; font-size: 11.5px; line-height: 1.45; color: var(–ink-soft); } #results { padding: 11px 13px 12px; } #results .rhd { font-size: 10px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(–ink-faint); display: flex; justify-content: space-between; align-items: baseline; } #results .rhd .setname { color: var(–accent-2); font-weight: 700; } #results .rsub { font-size: 10.5px; color: var(–ink-soft); margin: 2px 0 9px; } .syscount { display: flex; align-items: center; gap: 9px; padding: 5px 0; } .syscount + .syscount { border-top: 1px dashed var(–panel-edge); } .syscount .sw { width: 11px; height: 11px; border-radius: 3px; flex: 0 0 auto; } .syscount .snm { font-size: 11.5px; font-weight: 600; flex: 1 1 auto; min-width: 0; line-height: 1.15; } .syscount .snm small { display:block; font-weight: 400; color: var(–ink-faint); font-size: 10px; } .syscount .num { font-family: var(–mono); font-size: 21px; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1; } .syscount .unit { font-size: 10px; color: var(–ink-faint); margin-left: 1px; } /* —- Right column: control panels —- */ #rightcol { position: absolute; z-index: 1000; top: env(safe-area-inset-top,0px); right: 0; margin: 12px; margin-right: max(12px, env(safe-area-inset-right,0px)); width: 236px; max-width: calc(100vw – 24px); display: flex; flex-direction: column; gap: 10px; max-height: calc(100% – 24px – env(safe-area-inset-top,0px) – env(safe-area-inset-bottom,0px)); overflow-y: auto; -webkit-overflow-scrolling: touch; } .sect { overflow: hidden; } .sect .shead { display: flex; align-items: center; justify-content: space-between; padding: 9px 12px; cursor: pointer; user-select: none; font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(–ink-soft); } .sect .shead .chev { transition: transform .2s ease; font-size: 9px; color: var(–ink-faint); } .sect.collapsed .chev { transform: rotate(-90deg); } .sect.collapsed .sbody { display: none; } .sbody { padding: 4px 10px 11px; border-top: 1px solid var(–panel-edge); } /* system rows */ .sysrow { padding: 9px 2px 10px; } .sysrow + .sysrow { border-top: 1px solid var(–panel-edge); } .sysrow .top { display: flex; align-items: center; gap: 8px; } .sw-toggle { position: relative; width: 30px; height: 17px; flex: 0 0 auto; } .sw-toggle input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; } .sw-toggle .track { position:absolute; inset:0; border-radius: 9px; background: var(–panel-edge); transition: background .15s; } .sw-toggle .knob { position:absolute; top:2px; left:2px; width:13px; height:13px; border-radius:50%; background:#fff; transition: transform .15s; box-shadow:0 1px 2px rgba(0,0,0,.3); } .sw-toggle input:checked ~ .track { background: var(–sysclr); } .sw-toggle input:checked ~ .knob { transform: translateX(13px); } .sysrow .nm { flex: 1 1 auto; min-width: 0; font-size: 12px; font-weight: 600; line-height: 1.15; } .sysrow .nm small { display:block; font-weight:400; color: var(–ink-faint); font-size: 10px; } .sysrow .dot { width: 10px; height: 10px; border-radius: 3px; flex:0 0 auto; } .sysrow .ctl { display: flex; align-items: center; gap: 6px; margin: 8px 0 0 38px; font-size: 11px; color: var(–ink-soft); } .sysrow .ctl input[type=number] { width: 48px; font-family: var(–mono); font-size: 11.5px; text-align: right; padding: 3px 5px; border: 1px solid var(–panel-edge); border-radius: 5px; background: var(–bg); color: var(–ink); } .sysrow .ctl .km { color: var(–ink-faint); } .sysrow .ctl .req { margin-left: auto; font-family: var(–mono); font-size: 11px; color: var(–ink-soft); } .sysrow .ctl .req b { color: var(–ink); font-size: 13px; } /* radio priority set */ .optrow { display: flex; align-items: center; gap: 8px; padding: 6px 6px; border-radius: 7px; cursor: pointer; font-size: 12px; } .optrow:hover { background: rgba(127,127,127,.09); } .optrow input { accent-color: var(–accent-2); margin: 0; } .optrow .cnt { margin-left: auto; font-family: var(–mono); font-size: 10.5px; color: var(–ink-faint); } /* legend rows */ .legrow { display:flex; align-items:center; gap:9px; padding:5px 6px; border-radius:7px; cursor:pointer; font-size:11.5px; transition:background .12s, opacity .12s; } .legrow:hover { background: rgba(127,127,127,.09); } .legrow.off { opacity: .38; } .legrow .dot { width:12px; height:12px; border-radius:50%; flex:0 0 auto; border:2px solid #fff3; box-shadow:0 0 0 1px rgba(0,0,0,.25); } .legrow .lab { flex:1 1 auto; min-width:0; } .legrow .n { font-family: var(–mono); font-size:10.5px; color: var(–ink-faint); font-variant-numeric: tabular-nums; } .pfoot { display:flex; gap:6px; padding: 6px 2px 0; } .pfoot button { flex:1; font-size:10.5px; font-family:var(–sans); color:var(–ink-soft); background:transparent; border:1px solid var(–panel-edge); border-radius:6px; padding:5px; cursor:pointer; } .pfoot button:hover { color: var(–ink); border-color: var(–ink-soft); } .note { font-size: 10.5px; line-height: 1.5; color: var(–ink-soft); padding: 2px 2px 0; } .note b { color: var(–ink); font-weight: 600; } /* buttons bottom-left */ #botbtns { position:absolute; z-index:1000; left:0; bottom:0; margin:12px; margin-left:max(12px,env(safe-area-inset-left,0px)); margin-bottom:max(12px,env(safe-area-inset-bottom,0px)); display:flex; gap:8px; } #botbtns button { background: var(–accent); color:#fff; border:none; border-radius:8px; box-shadow:var(–shadow); font-family:var(–sans); font-size:12px; font-weight:600; padding:9px 13px; cursor:pointer; } #botbtns button.ghost { background: var(–panel); color: var(–ink); border:1px solid var(–panel-edge); } /* list drawer */ #drawer { position:absolute; z-index:1100; top:0; right:0; height:100%; width:min(380px,100vw); background:var(–panel); border-left:1px solid var(–panel-edge); box-shadow:-6px 0 24px rgba(0,0,0,.18); transform:translateX(100%); transition:transform .26s cubic-bezier(.4,0,.2,1); display:flex; flex-direction:column; } #drawer.open { transform: translateX(0); } .dhead { display:flex; align-items:center; justify-content:space-between; padding:14px 16px; padding-top:max(14px,env(safe-area-inset-top,0px)); border-bottom:1px solid var(–panel-edge); flex:0 0 auto; } .dhead h2 { margin:0; font-size:14px; font-weight:700; } .dhead button { background:transparent; border:none; color:var(–ink-soft); font-size:20px; line-height:1; cursor:pointer; padding:2px 6px; } .dscroll { overflow-y:auto; flex:1 1 auto; padding:8px 0 16px; -webkit-overflow-scrolling:touch; } .dsearch { padding:8px 14px 4px; } .dsearch input { width:100%; box-sizing:border-box; font-family:var(–sans); font-size:13px; padding:8px 10px; border-radius:7px; border:1px solid var(–panel-edge); background:var(–bg); color:var(–ink); } .catblock > h3 { display:flex; align-items:center; gap:8px; margin:0; padding:10px 16px 6px; font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(–ink-soft); } .catblock > h3 .dot { width:10px; height:10px; border-radius:50%; flex:0 0 auto; } .catblock > h3 .n { font-family:var(–mono); margin-left:auto; font-variant-numeric:tabular-nums; } .item { display:flex; align-items:baseline; gap:8px; padding:5px 16px; font-size:12.5px; line-height:1.35; cursor:pointer; flex-wrap:wrap; } .item:hover { background: rgba(127,127,127,.09); } .item .nm { font-weight:600; } .item .t1 { font-size:9px; font-weight:700; letter-spacing:.04em; color:var(–accent); border:1px solid var(–accent); border-radius:3px; padding:0 3px; text-transform:uppercase; } .item .loc { color:var(–ink-soft); font-size:11.5px; } .item .note { color:var(–ink-faint); font-size:11px; font-style:italic; width:100%; } /* marker popups */ .leaflet-popup-content .pnm { font-weight:700; display:block; } .leaflet-popup-content .pcat { font-size:11px; color:var(–ink-soft); display:block; margin-top:2px; } .leaflet-popup-content .pnote { font-size:11.5px; margin-top:5px; } .batt-pop b { font-weight: 700; } @media (max-width: 620px) { #leftcol { width: 210px; } #rightcol { width: 200px; } #titleplate .sub { display: none; } #results .rsub { display: none; } }

UK layered air defence laydown

Range rings and a recommended laydown against drones, cruise and ballistic missiles — point defence counted at two launch units per site, overlaid on the updated Cold War target list.

Force requiredTier-1 critical
to cover 98 defended points
Air defence systems▾
Coverage target▾
Target categories▾
Assumptions &amp; caveats▾

Rings are drawn at each system’s nominal maximum kinematic range, a planning proxy, not a guaranteed kill envelope.

CAMM / CAMM-ER (Sky Sabre) — point/local defence vs drones, aircraft and cruise missiles, counted at 2 launch units per site (72 total: 32 UK + 24 army + 12 overseas + 4 spare). Inner ring 25 km (CAMM), outer 45 km (CAMM-ER). Not a ballistic interceptor.

Patriot PAC-3 MSE — ~120 km vs air-breathing threats; its footprint against ballistic missiles is considerably smaller and trajectory-dependent.

THAAD — ~200 km area BMD vs short/medium-range ballistic missiles; limited value against low, slow drones.

SHORAD / C-UAS — the bottom layer beneath each Sky Sabre site: 2–4 units (guns, VSHORAD missiles, directed energy) sized by the site’s importance; ~200 in total including the field-army Stormer replacement. The counter-drone close-in kill.

Against low-flying cruise missiles and drones, radar line-of-sight caps engagement well inside the kinematic ring unless elevated/airborne sensors are added. Counts are a first-order greedy set-cover minimum, siting batteries on land; real laydowns need overlap, reloads, attrition and 24/7 rotation, so treat these as a floor.

Defended points

/* Leaflet 1.9.4 (inlined, self-contained) */ /* @preserve * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n<o;n++)for(e in i=arguments[n])t[e]=i[e];return t}var R=Object.create||function(t){return N.prototype=t,new N};function N(){}function a(t,e){var i,n=Array.prototype.slice;return t.bind?t.bind.apply(t,n.call(arguments,1)):(i=n.call(arguments,2),function(){return t.apply(e,i.length?i.concat(n.call(arguments)):arguments)})}var D=0;function h(t){return"_leaflet_id"in t||(t._leaflet_id=++D),t._leaflet_id}function j(t,e,i){var n,o,s=function(){n=!1,o&&(r.apply(i,o),o=!1)},r=function(){n?o=arguments:(t.apply(i,arguments),setTimeout(s,e),n=!0)};return r}function H(t,e,i){var n=e[1],e=e[0],o=n-e;return t===n&&i?t:((t-e)%o+o)%o+e}function u(){return!1}function i(t,e){return!1===e?t:(e=Math.pow(10,void 0===e?6:e),Math.round(t*e)/e)}function W(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function F(t){return W(t).split(/\s+/)}function c(t,e){for(var i in Object.prototype.hasOwnProperty.call(t,"options")||(t.options=t.options?R(t.options):{}),e)t.options[i]=e[i];return t.options}function U(t,e,i){var n,o=[];for(n in t)o.push(encodeURIComponent(i?n.toUpperCase():n)+"="+encodeURIComponent(t[n]));return(e&&-1!==e.indexOf("?")?"&":"?")+o.join("&")}var V=/\{ *([\w_ -]+) *\}/g;function q(t,i){return t.replace(V,function(t,e){e=i[e];if(void 0===e)throw new Error("No value provided for variable "+t);return e="function"==typeof e?e(i):e})}var d=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function G(t,e){for(var i=0;i<t.length;i++)if(t[i]===e)return i;return-1}var K="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function Y(t){return window["webkit"+t]||window["moz"+t]||window["ms"+t]}var X=0;function J(t){var e=+new Date,i=Math.max(0,16-(e-X));return X=e+i,window.setTimeout(t,i)}var $=window.requestAnimationFrame||Y("RequestAnimationFrame")||J,Q=window.cancelAnimationFrame||Y("CancelAnimationFrame")||Y("CancelRequestAnimationFrame")||function(t){window.clearTimeout(t)};function x(t,e,i){if(!i||$!==J)return $.call(window,a(t,e));t.call(e)}function r(t){t&&Q.call(window,t)}var tt={__proto__:null,extend:l,create:R,bind:a,get lastId(){return D},stamp:h,throttle:j,wrapNum:H,falseFn:u,formatNum:i,trim:W,splitWords:F,setOptions:c,getParamString:U,template:q,isArray:d,indexOf:G,emptyImageUrl:K,requestFn:$,cancelFn:Q,requestAnimFrame:x,cancelAnimFrame:r};function et(){}et.extend=function(t){function e(){c(this),this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()}var i,n=e.__super__=this.prototype,o=R(n);for(i in(o.constructor=e).prototype=o,this)Object.prototype.hasOwnProperty.call(this,i)&&"prototype"!==i&&"__super__"!==i&&(e[i]=this[i]);if(t.statics&&l(e,t.statics),t.includes){var s=t.includes;if("undefined"!=typeof L&&L&&L.Mixin){s=d(s)?s:[s];for(var r=0;r<s.length;r++)s[r]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",(new Error).stack)}l.apply(null,[o].concat(t.includes))}return l(o,t),delete o.statics,delete o.includes,o.options&&(o.options=n.options?R(n.options):{},l(o.options,t.options)),o._initHooks=[],o.callInitHooks=function(){if(!this._initHooksCalled){n.callInitHooks&&n.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;t<e;t++)o._initHooks[t].call(this)}},e},et.include=function(t){var e=this.prototype.options;return l(this.prototype,t),t.options&&(this.prototype.options=e,this.mergeOptions(t.options)),this},et.mergeOptions=function(t){return l(this.prototype.options,t),this},et.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i),this};var e={on:function(t,e,i){if("object"==typeof t)for(var n in t)this._on(n,t[n],e);else for(var o=0,s=(t=F(t)).length;o<s;o++)this._on(t[o],e,i);return this},off:function(t,e,i){if(arguments.length)if("object"==typeof t)for(var n in t)this._off(n,t[n],e);else{t=F(t);for(var o=1===arguments.length,s=0,r=t.length;s<r;s++)o?this._off(t[s]):this._off(t[s],e,i)}else delete this._events;return this},_on:function(t,e,i,n){"function"!=typeof e?console.warn("wrong listener type: "+typeof e):!1===this._listens(t,e,i)&&(e={fn:e,ctx:i=i===this?void 0:i},n&&(e.once=!0),this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e))},_off:function(t,e,i){var n,o,s;if(this._events&&(n=this._events[t]))if(1===arguments.length){if(this._firingCount)for(o=0,s=n.length;o<s;o++)n[o].fn=u;delete this._events[t]}else"function"!=typeof e?console.warn("wrong listener type: "+typeof e):!1!==(e=this._listens(t,e,i))&&(i=n[e],this._firingCount&&(i.fn=u,this._events[t]=n=n.slice()),n.splice(e,1))},fire:function(t,e,i){if(this.listens(t,i)){var n=l({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var o=this._events[t];if(o){this._firingCount=this._firingCount+1||1;for(var s=0,r=o.length;s<r;s++){var a=o[s],h=a.fn;a.once&&this.off(t,h,a.ctx),h.call(a.ctx||this,n)}this._firingCount–}}i&&this._propagateEvent(n)}return this},listens:function(t,e,i,n){"string"!=typeof t&&console.warn('"string" type argument expected');var o=e,s=("function"!=typeof e&&(n=!!e,i=o=void 0),this._events&&this._events[t]);if(s&&s.length&&!1!==this._listens(t,o,i))return!0;if(n)for(var r in this._eventParents)if(this._eventParents[r].listens(t,e,i,n))return!0;return!1},_listens:function(t,e,i){if(this._events){var n=this._events[t]||[];if(!e)return!!n.length;i===this&&(i=void 0);for(var o=0,s=n.length;o<s;o++)if(n[o].fn===e&&n[o].ctx===i)return o}return!1},once:function(t,e,i){if("object"==typeof t)for(var n in t)this._on(n,t[n],e,!0);else for(var o=0,s=(t=F(t)).length;o<s;o++)this._on(t[o],e,i,!0);return this},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[h(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[h(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,l({layer:t.target,propagatedFrom:t.target},t),!0)}},it=(e.addEventListener=e.on,e.removeEventListener=e.clearAllEventListeners=e.off,e.addOneTimeEventListener=e.once,e.fireEvent=e.fire,e.hasEventListeners=e.listens,et.extend(e));function p(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e}var nt=Math.trunc||function(t){return 0<t?Math.floor(t):Math.ceil(t)};function m(t,e,i){return t instanceof p?t:d(t)?new p(t[0],t[1]):null==t?t:"object"==typeof t&&"x"in t&&"y"in t?new p(t.x,t.y):new p(t,e,i)}function f(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;n<o;n++)this.extend(i[n])}function _(t,e){return!t||t instanceof f?t:new f(t,e)}function s(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;n<o;n++)this.extend(i[n])}function g(t,e){return t instanceof s?t:new s(t,e)}function v(t,e,i){if(isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=+t,this.lng=+e,void 0!==i&&(this.alt=+i)}function w(t,e,i){return t instanceof v?t:d(t)&&"object"!=typeof t[0]?3===t.length?new v(t[0],t[1],t[2]):2===t.length?new v(t[0],t[1]):null:null==t?t:"object"==typeof t&&"lat"in t?new v(t.lat,"lng"in t?t.lng:t.lon,t.alt):void 0===e?null:new v(t,e,i)}p.prototype={clone:function(){return new p(this.x,this.y)},add:function(t){return this.clone()._add(m(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(m(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new p(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new p(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=nt(this.x),this.y=nt(this.y),this},distanceTo:function(t){var e=(t=m(t)).x-this.x,t=t.y-this.y;return Math.sqrt(e*e+t*t)},equals:function(t){return(t=m(t)).x===this.x&&t.y===this.y},contains:function(t){return t=m(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)=this.min.x&&i.x=this.min.y&&i.y=e.x&&n.x=e.y&&n.ye.x&&n.xe.y&&n.y=n.lat&&i.lat=n.lng&&i.lng=e.lat&&n.lat=e.lng&&n.lnge.lat&&n.late.lng&&n.lng<i.lng;return o&&t},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t,e){return!!t&&(t=g(t),this._southWest.equals(t.getSouthWest(),e)&&this._northEast.equals(t.getNorthEast(),e))},isValid:function(){return!(!this._southWest||!this._northEast)}};var ot={latLngToPoint:function(t,e){t=this.projection.project(t),e=this.scale(e);return this.transformation._transform(t,e)},pointToLatLng:function(t,e){e=this.scale(e),t=this.transformation.untransform(t,e);return this.projection.unproject(t)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){var e;return this.infinite?null:(e=this.projection.bounds,t=this.scale(t),new f(this.transformation.transform(e.min,t),this.transformation.transform(e.max,t)))},infinite:!(v.prototype={equals:function(t,e){return!!t&&(t=w(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===e?1e-9:e))},toString:function(t){return"LatLng("+i(this.lat,t)+", "+i(this.lng,t)+")"},distanceTo:function(t){return st.distance(this,w(t))},wrap:function(){return st.wrapLatLng(this)},toBounds:function(t){var t=180*t/40075017,e=t/Math.cos(Math.PI/180*this.lat);return g([this.lat-t,this.lng-e],[this.lat+t,this.lng+e])},clone:function(){return new v(this.lat,this.lng,this.alt)}}),wrapLatLng:function(t){var e=this.wrapLng?H(t.lng,this.wrapLng,!0):t.lng;return new v(this.wrapLat?H(t.lat,this.wrapLat,!0):t.lat,e,t.alt)},wrapLatLngBounds:function(t){var e=t.getCenter(),i=this.wrapLatLng(e),n=e.lat-i.lat,e=e.lng-i.lng;return 0==n&&0==e?t:(i=t.getSouthWest(),t=t.getNorthEast(),new s(new v(i.lat-n,i.lng-e),new v(t.lat-n,t.lng-e)))}},st=l({},ot,{wrapLng:[-180,180],R:6371e3,distance:function(t,e){var i=Math.PI/180,n=t.lat*i,o=e.lat*i,s=Math.sin((e.lat-t.lat)*i/2),e=Math.sin((e.lng-t.lng)*i/2),t=s*s+Math.cos(n)*Math.cos(o)*e*e,i=2*Math.atan2(Math.sqrt(t),Math.sqrt(1-t));return this.R*i}}),rt=6378137,rt={R:rt,MAX_LATITUDE:85.0511287798,project:function(t){var e=Math.PI/180,i=this.MAX_LATITUDE,i=Math.max(Math.min(i,t.lat),-i),i=Math.sin(i*e);return new p(this.R*t.lng*e,this.R*Math.log((1+i)/(1-i))/2)},unproject:function(t){var e=180/Math.PI;return new v((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*e,t.x*e/this.R)},bounds:new f([-(rt=rt*Math.PI),-rt],[rt,rt])};function at(t,e,i,n){d(t)?(this._a=t[0],this._b=t[1],this._c=t[2],this._d=t[3]):(this._a=t,this._b=e,this._c=i,this._d=n)}function ht(t,e,i,n){return new at(t,e,i,n)}at.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return t.x=(e=e||1)*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return new p((t.x/(e=e||1)-this._b)/this._a,(t.y/e-this._d)/this._c)}};var lt=l({},st,{code:"EPSG:3857",projection:rt,transformation:ht(lt=.5/(Math.PI*rt.R),.5,-lt,.5)}),ut=l({},lt,{code:"EPSG:900913"});function ct(t){return document.createElementNS("http://www.w3.org/2000/svg&quot;,t)}function dt(t,e){for(var i,n,o,s,r="",a=0,h=t.length;a<h;a++){for(i=0,n=(o=t[a]).length;i<n;i++)r+=(i?"L":"M")+(s=o[i]).x+" "+s.y;r+=e?b.svg?"z":"x":""}return r||"M0 0"}var _t=document.documentElement.style,pt="ActiveXObject"in window,mt=pt&&!document.addEventListener,n="msLaunchUri"in navigator&&!("documentMode"in document),ft=y("webkit"),gt=y("android"),vt=y("android 2")||y("android 3"),yt=parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),yt=gt&&y("Google")&&yt<537&&!("AudioNode"in window),xt=!!window.opera,wt=!n&&y("chrome"),bt=y("gecko")&&!ft&&!xt&&!pt,Pt=!wt&&y("safari"),Lt=y("phantom"),o="OTransition"in _t,Tt=0===navigator.platform.indexOf("Win"),Mt=pt&&"transition"in _t,zt="WebKitCSSMatrix"in window&&"m11"in new window.WebKitCSSMatrix&&!vt,_t="MozPerspective"in _t,Ct=!window.L_DISABLE_3D&&(Mt||zt||_t)&&!o&&!Lt,Zt="undefined"!=typeof orientation||y("mobile"),St=Zt&&ft,Et=Zt&&zt,kt=!window.PointerEvent&&window.MSPointerEvent,Ot=!(!window.PointerEvent&&!kt),At="ontouchstart"in window||!!window.TouchEvent,Bt=!window.L_NO_TOUCH&&(At||Ot),It=Zt&&xt,Rt=Zt&&bt,Nt=1<(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI),Dt=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassiveEventSupport",u,e),window.removeEventListener("testPassiveEventSupport",u,e)}catch(t){}return t}(),jt=!!document.createElement("canvas").getContext,Ht=!(!document.createElementNS||!ct("svg").createSVGRect),Wt=!!Ht&&((Wt=document.createElement("div")).innerHTML="","http://www.w3.org/2000/svg"===(Wt.firstChild&&Wt.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='’,t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Wt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Ft=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Ft,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Ft,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=F(e),o=0,s=n.length;o<s;o++)t.classList.add(n[o]);else ve(t,e)||ye(t,((i=xe(t))?i+" ":"")+e)}function z(t,e){void 0!==t.classList?t.classList.remove(e):ye(t,W((" "+xe(t)+" ").replace(" "+e+" "," ")))}function ye(t,e){void 0===t.className.baseVal?t.className=e:t.className.baseVal=e}function xe(t){return void 0===(t=t.correspondingElement?t.correspondingElement:t).className.baseVal?t.className:t.className.baseVal}function C(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(t){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}}function we(t){for(var e=document.documentElement.style,i=0;i<t.length;i++)if(t[i]in e)return t[i];return!1}function be(t,e,i){e=e||new p(0,0);t.style[ue]=(b.ie3d?"translate("+e.x+"px,"+e.y+"px)":"translate3d("+e.x+"px,"+e.y+"px,0)")+(i?" scale("+i+")":"")}function Z(t,e){t._leaflet_pos=e,b.any3d?be(t,e):(t.style.left=e.x+"px",t.style.top=e.y+"px")}function Pe(t){return t._leaflet_pos||new p(0,0)}function Le(){S(window,"dragstart",O)}function Te(){k(window,"dragstart",O)}function Me(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(ze(),le=(he=t).style.outlineStyle,t.style.outlineStyle="none",S(window,"keydown",ze))}function ze(){he&&(he.style.outlineStyle=le,le=he=void 0,k(window,"keydown",ze))}function Ce(t){for(;!((t=t.parentNode).offsetWidth&&t.offsetHeight||t===document.body););return t}function Ze(t){var e=t.getBoundingClientRect();return{x:e.width/t.offsetWidth||1,y:e.height/t.offsetHeight||1,boundingClientRect:e}}ae="onselectstart"in document?(re=function(){S(window,"selectstart",O)},function(){k(window,"selectstart",O)}):(se=we(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]),re=function(){var t;se&&(t=document.documentElement.style,oe=t[se],t[se]="none")},function(){se&&(document.documentElement.style[se]=oe,oe=void 0)});pt={__proto__:null,TRANSFORM:ue,TRANSITION:ce,TRANSITION_END:de,get:_e,getStyle:pe,create:P,remove:T,empty:me,toFront:fe,toBack:ge,hasClass:ve,addClass:M,removeClass:z,setClass:ye,getClass:xe,setOpacity:C,testProp:we,setTransform:be,setPosition:Z,getPosition:Pe,get disableTextSelection(){return re},get enableTextSelection(){return ae},disableImageDrag:Le,enableImageDrag:Te,preventOutline:Me,restoreOutline:ze,getSizedParentNode:Ce,getScale:Ze};function S(t,e,i,n){if(e&&"object"==typeof e)for(var o in e)ke(t,o,e[o],i);else for(var s=0,r=(e=F(e)).length;s<r;s++)ke(t,e[s],i,n);return this}var E="_leaflet_events";function k(t,e,i,n){if(1===arguments.length)Se(t),delete t[E];else if(e&&"object"==typeof e)for(var o in e)Oe(t,o,e[o],i);else if(e=F(e),2===arguments.length)Se(t,function(t){return-1!==G(e,t)});else for(var s=0,r=e.length;s<r;s++)Oe(t,e[s],i,n);return this}function Se(t,e){for(var i in t[E]){var n=i.split(/\d/)[0];e&&!e(n)||Oe(t,n,null,null,i)}}var Ee={mouseenter:"mouseover",mouseleave:"mouseout",wheel:!("onwheel"in window)&&"mousewheel"};function ke(e,t,i,n){var o,s,r=t+h(i)+(n?"_"+h(n):"");e[E]&&e[E][r]||(s=o=function(t){return i.call(n||e,t||window.event)},!b.touchNative&&b.pointer&&0===t.indexOf("touch")?o=Jt(e,t,o):b.touch&&"dblclick"===t?o=ne(e,o):"addEventListener"in e?"touchstart"===t||"touchmove"===t||"wheel"===t||"mousewheel"===t?e.addEventListener(Ee[t]||t,o,!!b.passiveEvents&&{passive:!1}):"mouseenter"===t||"mouseleave"===t?e.addEventListener(Ee[t],o=function(t){t=t||window.event,We(e,t)&&s(t)},!1):e.addEventListener(t,s,!1):e.attachEvent("on"+t,o),e[E]=e[E]||{},e[E][r]=o)}function Oe(t,e,i,n,o){o=o||e+h(i)+(n?"_"+h(n):"");var s,r,i=t[E]&&t[E][o];i&&(!b.touchNative&&b.pointer&&0===e.indexOf("touch")?(n=t,r=i,Gt[s=e]?n.removeEventListener(Gt[s],r,!1):console.warn("wrong event specified:",s)):b.touch&&"dblclick"===e?(n=i,(r=t).removeEventListener("dblclick",n.dblclick),r.removeEventListener("click",n.simDblclick)):"removeEventListener"in t?t.removeEventListener(Ee[e]||e,i,!1):t.detachEvent("on"+e,i),t[E][o]=null)}function Ae(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,this}function Be(t){return ke(t,"wheel",Ae),this}function Ie(t){return S(t,"mousedown touchstart dblclick contextmenu",Ae),t._leaflet_disable_click=!0,this}function O(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Re(t){return O(t),Ae(t),this}function Ne(t){if(t.composedPath)return t.composedPath();for(var e=[],i=t.target;i;)e.push(i),i=i.parentNode;return e}function De(t,e){var i,n;return e?(n=(i=Ze(e)).boundingClientRect,new p((t.clientX-n.left)/i.x-e.clientLeft,(t.clientY-n.top)/i.y-e.clientTop)):new p(t.clientX,t.clientY)}var je=b.linux&&b.chrome?window.devicePixelRatio:b.mac?3*window.devicePixelRatio:0<window.devicePixelRatio?2*window.devicePixelRatio:1;function He(t){return b.edge?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/je:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}function We(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(t){return!1}return i!==t}var mt={__proto__:null,on:S,off:k,stopPropagation:Ae,disableScrollPropagation:Be,disableClickPropagation:Ie,preventDefault:O,stop:Re,getPropagationPath:Ne,getMousePosition:De,getWheelDelta:He,isExternalTarget:We,addListener:S,removeListener:k},Fe=it.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=Pe(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=x(this._animate,this),this._step()},_step:function(t){var e=+new Date-this._startTime,i=1e3*this._duration;e<i?this._runFrame(this._easeOut(e/i),t):(this._runFrame(1),this._complete())},_runFrame:function(t,e){t=this._startPos.add(this._offset.multiplyBy(t));e&&t._round(),Z(this._el,t),this.fire("step")},_complete:function(){r(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),A=it.extend({options:{crs:lt,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,e){e=c(this,e),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this._initContainer(t),this._initLayout(),this._onResize=a(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),void 0!==e.zoom&&(this._zoom=this._limitZoom(e.zoom)),e.center&&void 0!==e.zoom&&this.setView(w(e.center),e.zoom,{reset:!0}),this.callInitHooks(),this._zoomAnimated=ce&&b.any3d&&!b.mobileOpera&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),S(this._proxy,de,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,i){if((e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(w(t),e,this.options.maxBounds),i=i||{},this._stop(),this._loaded&&!i.reset&&!0!==i)&&(void 0!==i.animate&&(i.zoom=l({animate:i.animate},i.zoom),i.pan=l({animate:i.animate,duration:i.duration},i.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,i.zoom):this._tryAnimatedPan(t,i.pan)))return clearTimeout(this._sizeTimer),this;return this._resetView(t,e,i.pan&&i.pan.noMoveStart),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=t,this)},zoomIn:function(t,e){return t=t||(b.any3d?this.options.zoomDelta:1),this.setZoom(this._zoom+t,e)},zoomOut:function(t,e){return t=t||(b.any3d?this.options.zoomDelta:1),this.setZoom(this._zoom-t,e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),o=this.getSize().divideBy(2),t=(t instanceof p?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),n=this.containerPointToLatLng(o.add(t));return this.setView(n,e,{zoom:i})},_getBoundsCenterZoom:function(t,e){e=e||{},t=t.getBounds?t.getBounds():g(t);var i=m(e.paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.getBoundsZoom(t,!1,i.add(n));return(o="number"==typeof e.maxZoom?Math.min(e.maxZoom,o):o)===1/0?{center:t.getCenter(),zoom:o}:(e=n.subtract(i).divideBy(2),n=this.project(t.getSouthWest(),o),i=this.project(t.getNorthEast(),o),{center:this.unproject(n.add(i).divideBy(2).add(e),o),zoom:o})},fitBounds:function(t,e){if((t=g(t)).isValid())return t=this._getBoundsCenterZoom(t,e),this.setView(t.center,t.zoom,e);throw new Error("Bounds are not valid.")},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t,e){var i;return e=e||{},(t=m(t).round()).x||t.y?(!0===e.animate||this.getSize().contains(t)?(this._panAnim||(this._panAnim=new Fe,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),!1!==e.animate?(M(this._mapPane,"leaflet-pan-anim"),i=this._getMapPanePos().subtract(t).round(),this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)):(this._rawPanBy(t),this.fire("move").fire("moveend"))):this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this):this.fire("moveend")},flyTo:function(n,o,t){if(!1===(t=t||{}).animate||!b.any3d)return this.setView(n,o,t);this._stop();var s=this.project(this.getCenter()),r=this.project(n),e=this.getSize(),a=this._zoom,h=(n=w(n),o=void 0===o?a:o,Math.max(e.x,e.y)),i=h*this.getZoomScale(a,o),l=r.distanceTo(s)||1,u=1.42,c=u*u;function d(t){t=(i*i-h*h+(t?-1:1)*c*c*l*l)/(2*(t?i:h)*c*l),t=Math.sqrt(t*t+1)-t;return t<1e-9?-18:Math.log(t)}function _(t){return(Math.exp(t)-Math.exp(-t))/2}function p(t){return(Math.exp(t)+Math.exp(-t))/2}var m=d(0);function f(t){return h*(p(m)*(_(t=m+u*t)/p(t))-_(m))/c}var g=Date.now(),v=(d(1)-m)/u,y=t.duration?1e3*t.duration:1e3*v*.8;return this._moveStart(!0,t.noMoveStart),function t(){var e=(Date.now()-g)/y,i=(1-Math.pow(1-e,1.5))*v;e<=1?(this._flyToFrame=x(t,this),this._move(this.unproject(s.add(r.subtract(s).multiplyBy(f(i)/l)),a),this.getScaleZoom(h/(e=i,h*(p(m)/p(m+u*e))),a),{flyTo:!0})):this._move(n,o)._moveEnd(!0)}.call(this),this},flyToBounds:function(t,e){t=this._getBoundsCenterZoom(t,e);return this.flyTo(t.center,t.zoom,e)},setMaxBounds:function(t){return t=g(t),this.listens("moveend",this._panInsideMaxBounds)&&this.off("moveend",this._panInsideMaxBounds),t.isValid()?(this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds)):(this.options.maxBounds=null,this)},setMinZoom:function(t){var e=this.options.minZoom;return this.options.minZoom=t,this._loaded&&e!==t&&(this.fire("zoomlevelschange"),this.getZoom()this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!We(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;s<i.length;s++)i[s].listens(e,!0)&&o.push(i[s]);n=o.concat(n)}if(n.length){"contextmenu"===e&&O(t);var r,a=n[0],h={originalEvent:t};for("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type&&(r=a.getLatLng&&(!a._radius||a._radius<=10),h.containerPoint=r?this.latLngToContainerPoint(a.getLatLng()):this.mouseEventToContainerPoint(t),h.layerPoint=this.containerPointToLayerPoint(h.containerPoint),h.latlng=r?a.getLatLng():this.layerPointToLatLng(h.layerPoint)),s=0;s<n.length;s++)if(n[s].fire(e,h,!0),h.originalEvent._stopped||!1===n[s].options.bubblingMouseEvents&&-1!==G(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,e=this._handlers.length;t<e;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,{target:this}):this.on("load",t,e),this},_getMapPanePos:function(){return Pe(this._mapPane)||new p(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,e){return(t&&void 0!==e?this._getNewPixelOrigin(t,e):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,e,i){i=this._getNewPixelOrigin(i,e);return this.project(t,e)._subtract(i)},_latLngBoundsToNewLayerBounds:function(t,e,i){i=this._getNewPixelOrigin(i,e);return _([this.project(t.getSouthWest(),e)._subtract(i),this.project(t.getNorthWest(),e)._subtract(i),this.project(t.getSouthEast(),e)._subtract(i),this.project(t.getNorthEast(),e)._subtract(i)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){var n,o;return!i||(n=this.project(t,e),o=this.getSize().divideBy(2),o=new f(n.subtract(o),n.add(o)),o=this._getBoundsOffset(o,i,e),Math.abs(o.x)<=1&&Math.abs(o.y)<=1)?t:this.unproject(n.add(o),e)},_limitOffset:function(t,e){var i;return e?(i=new f((i=this.getPixelBounds()).min.add(t),i.max.add(t)),t.add(this._getBoundsOffset(i,e))):t},_getBoundsOffset:function(t,e,i){e=_(this.project(e.getNorthEast(),i),this.project(e.getSouthWest(),i)),i=e.min.subtract(t.min),e=e.max.subtract(t.max);return new p(this._rebound(i.x,-e.x),this._rebound(i.y,-e.y))},_rebound:function(t,e){return 0<t+e?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom(),n=b.any3d?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(e,Math.min(i,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){z(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){t=this._getCenterOffset(t)._trunc();return!(!0!==(e&&e.animate)&&!this.getSize().contains(t))&&(this.panBy(t,e),!0)},_createAnimProxy:function(){var t=this._proxy=P("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",function(t){var e=ue,i=this._proxy.style[e];be(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),i===this._proxy.style[e]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){T(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var t=this.getCenter(),e=this.getZoom();be(this._proxy,this.project(t,e),this.getZoomScale(e,1))},_catchTransitionEnd:function(t){this._animatingZoom&&0this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,i.noMoveStart||!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0<t.screenX&&0<t.screenY&&this._map.getContainer().focus()}}),Ve=(A.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var i=this._controlCorners={},n="leaflet-",o=this._controlContainer=P("div",n+"control-container",this._container);function t(t,e){i[t+e]=P("div",n+t+" "+n+e,o)}t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)T(this._controlCorners[t]);T(this._controlContainer),delete this._controlCorners,delete this._controlContainer}}),B.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,e,i,n){return i<n?-1:n<i?1:0}},initialize:function(t,e,i){for(var n in c(this,i),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1,this._preventClick=!1,t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),(this._map=t).on("zoomend",this._checkDisabledLayers,this);for(var e=0;e<this._layers.length;e++)this._layers[e].layer.on("add remove",this._onLayerChange,this);return this._container},addTo:function(t){return B.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off("add remove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._map?this._update():this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._map?this._update():this},removeLayer:function(t){t.off("add remove",this._onLayerChange,this);t=this._getLayer(h(t));return t&&this._layers.splice(this._layers.indexOf(t),1),this._map?this._update():this},expand:function(){M(this._container,"leaflet-control-layers-expanded"),this._section.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._section.clientHeight?(M(this._section,"leaflet-control-layers-scrollbar"),this._section.style.height=t+"px"):z(this._section,"leaflet-control-layers-scrollbar"),this._checkDisabledLayers(),this},collapse:function(){return z(this._container,"leaflet-control-layers-expanded"),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=P("div",t),i=this.options.collapsed,n=(e.setAttribute("aria-haspopup",!0),Ie(e),Be(e),this._section=P("section",t+"-list")),o=(i&&(this._map.on("click",this.collapse,this),S(e,{mouseenter:this._expandSafely,mouseleave:this.collapse},this)),this._layersLink=P("a",t+"-toggle",e));o.href="#",o.title="Layers",o.setAttribute("role","button"),S(o,{keydown:function(t){13===t.keyCode&&this._expandSafely()},click:function(t){O(t),this._expandSafely()}},this),i||this.expand(),this._baseLayersList=P("div",t+"-base",n),this._separator=P("div",t+"-separator",n),this._overlaysList=P("div",t+"-overlays",n),e.appendChild(n)},_getLayer:function(t){for(var e=0;e<this._layers.length;e++)if(this._layers[e]&&h(this._layers[e].layer)===t)return this._layers[e]},_addLayer:function(t,e,i){this._map&&t.on("add remove",this._onLayerChange,this),this._layers.push({layer:t,name:e,overlay:i}),this.options.sortLayers&&this._layers.sort(a(function(t,e){return this.options.sortFunction(t.layer,e.layer,t.name,e.name)},this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(this._container){me(this._baseLayersList),me(this._overlaysList),this._layerControlInputs=[];for(var t,e,i,n=0,o=0;o<this._layers.length;o++)i=this._layers[o],this._addItem(i),e=e||i.overlay,t=t||!i.overlay,n+=i.overlay?0:1;this.options.hideSingleBase&&(this._baseLayersList.style.display=(t=t&&1<n)?"":"none"),this._separator.style.display=e&&t?"":"none"}return this},_onLayerChange:function(t){this._handlingClick||this._update();var e=this._getLayer(h(t.target)),t=e.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;t&&this._map.fire(t,e)},_createRadioElement:function(t,e){t='",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){if(!this._preventClick){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s–)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<n.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()}},_checkDisabledLayers:function(){for(var t,e,i=this._layerControlInputs,n=this._map.getZoom(),o=i.length-1;0<=o;o–)t=i[o],e=this._getLayer(t.layerId).layer,t.disabled=void 0!==e.options.minZoom&&ne.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section,e=(this._preventClick=!0,S(t,"click",O),this.expand(),this);setTimeout(function(){k(t,"click",O),e._preventClick=!1})}})),qe=B.extend({options:{position:"topleft",zoomInText:’+‘,zoomInTitle:"Zoom in",zoomOutText:’&#x2212;‘,zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ge=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new qe,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280<t?(i=this._getRoundNum(e=t/5280),this._updateScale(this._iScale,i+" mi",i/e)):(i=this._getRoundNum(t),this._updateScale(this._iScale,i+" ft",i/t))},_updateScale:function(t,e,i){t.style.width=Math.round(this.options.maxWidth*i)+"px",t.innerHTML=e},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),t=t/e;return e*(t=10<=t?10:5<=t?5:3<=t?3:2<=t?2:1)}})),Ke=B.extend({options:{position:"bottomright",prefix:'‘+(b.inlineSvg?’ ‘:"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]–,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(‘ | ‘)}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ke).addTo(this)}),B.Layers=Ve,B.Zoom=qe,B.Scale=Ge,B.Attribution=Ke,Ue.layers=function(t,e,i){return new Ve(t,e,i)},Ue.zoom=function(t){return new qe(t)},Ue.scale=function(t){return new Ge(t)},Ue.attribution=function(t){return new Ke(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Ye=b.touch?"touchstart mousedown":"mousedown",Xe=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xe._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xe._dragging===this&&this.finishDrag():Xe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xe._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1<t.touches.length?this._moved=!0:!(e=new p((e=t.touches&&1===t.touches.length?t.touches[0]:t).clientX,e.clientY)._subtract(this._startPoint)).x&&!e.y||Math.abs(e.x)+Math.abs(e.y)<this.options.clickTolerance||(e.x/=this._parentScale.x,e.y/=this._parentScale.y,O(t),this._moved||(this.fire("dragstart"),this._moved=!0,M(document.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof window.SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),M(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(e),this._moving=!0,this._lastEvent=t,this._updatePosition()))},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire("predrag",t),Z(this._element,this._newPos),this.fire("drag",t)},_onUp:function(){this._enabled&&this.finishDrag()},finishDrag:function(t){z(document.body,"leaflet-dragging"),this._lastTarget&&(z(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null),k(document,"mousemove touchmove",this._onMove,this),k(document,"mouseup touchend touchcancel",this._onUp,this),Te(),ae();var e=this._moved&&this._moving;this._moving=!1,Xe._dragging=!1,e&&this.fire("dragend",{noInertia:t,distance:this._newPos.distanceTo(this._startPos)})}});function Je(t,e,i){for(var n,o,s,r,a,h,l,u=[1,4,2,8],c=0,d=t.length;c<d;c++)t[c]._code=si(t[c],e);for(s=0;s<4;s++){for(h=u[s],n=[],c=0,o=(d=t.length)-1;c<d;o=c++)r=t[c],a=t[o],r._code&h?a._code&h||((l=oi(a,r,h,e,i))._code=si(l,e),n.push(l)):(a._code&h&&((l=oi(a,r,h,e,i))._code=si(l,e),n.push(l)),n.push(r));t=n}return t}function $e(t,e){var i,n,o,s,r,a,h;if(!t||0===t.length)throw new Error("latlngs not passed");I(t)||(console.warn("latlngs are not flat! Only the first ring will be used"),t=t[0]);for(var l=w([0,0]),u=g(t),c=(u.getNorthWest().distanceTo(u.getSouthWest())*u.getNorthEast().distanceTo(u.getNorthWest())<1700&&(l=Qe(t)),t.length),d=[],_=0;_<c;_++){var p=w(t[_]);d.push(e.project(w([p.lat-l.lat,p.lng-l.lng])))}for(_=r=a=h=0,i=c-1;_<c;i=_++)n=d[_],o=d[i],s=n.y*o.x-o.y*n.x,a+=(n.x+o.x)*s,h+=(n.y+o.y)*s,r+=3*s;u=0===r?d[0]:[a/r,h/r],u=e.unproject(m(u));return w([u.lat+l.lat,u.lng+l.lng])}function Qe(t){for(var e=0,i=0,n=0,o=0;o<t.length;o++){var s=w(t[o]);e+=s.lat,i+=s.lng,n++}return w([e/n,i/n])}var ti,gt={__proto__:null,clipPolygon:Je,polygonCenter:$e,centroid:Qe};function ei(t,e){if(e&&t.length){var i=t=function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;ne&&(i.push(t[n]),o=n);o<s-1&&i.push(t[s-1]);return i}(t,e=e*e),n=i.length,o=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(n);o[0]=o[n-1]=1,function t(e,i,n,o,s){var r,a,h,l=0;for(a=o+1;a<=s-1;a++)h=ri(e[a],e[o],e[s],!0),l<h&&(r=a,l=h);n<l&&(i[r]=1,t(e,i,n,o,r),t(e,i,n,r,s))}(i,o,e,0,n-1);var s,r=[];for(s=0;s<n;s++)o[s]&&r.push(i[s]);return r}return t.slice()}function ii(t,e,i){return Math.sqrt(ri(t,e,i,!0))}function ni(t,e,i,n,o){var s,r,a,h=n?ti:si(t,i),l=si(e,i);for(ti=l;;){if(!(h|l))return[t,e];if(h&l)return!1;a=si(r=oi(t,e,s=h||l,i,o),i),s===h?(t=r,h=a):(e=r,l=a)}}function oi(t,e,i,n,o){var s,r,a=e.x-t.x,e=e.y-t.y,h=n.min,n=n.max;return 8&i?(s=t.x+a*(n.y-t.y)/e,r=n.y):4&i?(s=t.x+a*(h.y-t.y)/e,r=h.y):2&i?(s=n.x,r=t.y+e*(n.x-t.x)/a):1&i&&(s=h.x,r=t.y+e*(h.x-t.x)/a),new p(s,r,o)}function si(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ri(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0<a&&(1<(a=((t.x-o)*s+(t.y-e)*r)/a)?(o=i.x,e=i.y):0<a&&(o+=s*a,e+=r*a)),s=t.x-o,r=t.y-e,n?s*s+r*r:new p(o,e)}function I(t){return!d(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function ai(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),I(t)}function hi(t,e){var i,n,o,s,r,a;if(!t||0===t.length)throw new Error("latlngs not passed");I(t)||(console.warn("latlngs are not flat! Only the first ring will be used"),t=t[0]);for(var h=w([0,0]),l=g(t),u=(l.getNorthWest().distanceTo(l.getSouthWest())*l.getNorthEast().distanceTo(l.getNorthWest())<1700&&(h=Qe(t)),t.length),c=[],d=0;d<u;d++){var _=w(t[d]);c.push(e.project(w([_.lat-h.lat,_.lng-h.lng])))}for(i=d=0;d<u-1;d++)i+=c[d].distanceTo(c[d+1])/2;if(0===i)a=c[0];else for(n=d=0;d<u-1;d++)if(o=c[d],s=c[d+1],i<(n+=r=o.distanceTo(s))){a=[s.x-(r=(n-i)/r)*(s.x-o.x),s.y-r*(s.y-o.y)];break}l=e.unproject(m(a));return w([l.lat+h.lat,l.lng+h.lng])}var vt={__proto__:null,simplify:ei,pointToSegmentDistance:ii,closestPointOnSegment:function(t,e,i){return ri(t,e,i)},clipSegment:ni,_getEdgeIntersection:oi,_getBitCode:si,_sqClosestPointOnSegment:ri,isFlat:I,_flat:ai,polylineCenter:hi},yt={project:function(t){return new p(t.lng,t.lat)},unproject:function(t){return new v(t.y,t.x)},bounds:new f([-180,-90],[180,90])},xt={R:6378137,R_MINOR:6356752.314245179,bounds:new f([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var e=Math.PI/180,i=this.R,n=t.lat*e,o=this.R_MINOR/i,o=Math.sqrt(1-o*o),s=o*Math.sin(n),s=Math.tan(Math.PI/4-n/2)/Math.pow((1-s)/(1+s),o/2),n=-i*Math.log(Math.max(s,1e-10));return new p(t.lng*e*i,n)},unproject:function(t){for(var e,i=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,l=.1;h<15&&1e-7<Math.abs(l);h++)e=s*Math.sin(a),e=Math.pow((1-e)/(1+e),s/2),a+=l=Math.PI/2-2*Math.atan(r*e)-a;return new v(a*i,t.x*i/n)}},wt={__proto__:null,LonLat:yt,Mercator:xt,SphericalMercator:rt},Pt=l({},st,{code:"EPSG:3395",projection:xt,transformation:ht(bt=.5/(Math.PI*xt.R),.5,-bt,.5)}),li=l({},st,{code:"EPSG:4326",projection:yt,transformation:ht(1/180,1,-1/180,.5)}),Lt=l({},ot,{projection:yt,transformation:ht(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,e){var i=e.lng-t.lng,e=e.lat-t.lat;return Math.sqrt(i*i+e*e)},infinite:!0}),o=(ot.Earth=st,ot.EPSG3395=Pt,ot.EPSG3857=lt,ot.EPSG900913=ut,ot.EPSG4326=li,ot.Simple=Lt,it.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[h(t)]=this},removeInteractiveTarget:function(t){return delete this._map._targets[h(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var e,i=t.target;i.hasLayer(this)&&(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents&&(e=this.getEvents(),i.on(e,this),this.once("remove",function(){i.off(e,this)},this)),this.onAdd(i),this.fire("add"),i.fire("layeradd",{layer:this}))}})),ui=(A.include({addLayer:function(t){var e;if(t._layerAdd)return e=h(t),this._layers[e]||((this._layers[e]=t)._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t)),this;throw new Error("The provided object is not a Layer.")},removeLayer:function(t){var e=h(t);return this._layers[e]&&(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null),this},hasLayer:function(t){return h(t)in this._layers},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},_addLayers:function(t){for(var e=0,i=(t=t?d(t)?t:[t]:[]).length;ethis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}}),o.extend({initialize:function(t,e){var i,n;if(c(this,e),this._layers={},t)for(i=0,n=t.length;i<n;i++)this.addLayer(t[i])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){t=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[t]&&this._map.removeLayer(this._layers[t]),delete this._layers[t],this},hasLayer:function(t){return("number"==typeof t?t:this.getLayerId(t))in this._layers},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)(i=this._layers[e])[t]&&i[t].apply(i,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:h})),ci=ui.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),ui.prototype.addLayer.call(this,t),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?((t=t in this._layers?this._layers[t]:t).removeEventParent(this),ui.prototype.removeLayer.call(this,t),this.fire("layerremove",{layer:t})):this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t,e=new s;for(t in this._layers){var i=this._layers[t];e.extend(i.getBounds?i.getBounds():i.getLatLng())}return e}}),di=et.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0],crossOrigin:!1},initialize:function(t){c(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(i)return i=this._createImg(i,e&&"IMG"===e.tagName?e:null),this._setIconStyles(i,t),!this.options.crossOrigin&&""!==this.options.crossOrigin||(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i;if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null},_setIconStyles:function(t,e){var i=this.options,n=i[e+"Size"],n=m(n="number"==typeof n?[n,n]:n),o=m("shadow"===e&&i.shadowAnchor||i.iconAnchor||n&&n.divideBy(2,!0));t.className="leaflet-marker-"+e+" "+(i.className||""),o&&(t.style.marginLeft=-o.x+"px",t.style.marginTop=-o.y+"px"),n&&(t.style.width=n.x+"px",t.style.height=n.y+"px")},_createImg:function(t,e){return(e=e||document.createElement("img")).src=t,e},_getIconUrl:function(t){return b.retina&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}});var _i=di.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return"string"!=typeof _i.imagePath&&(_i.imagePath=this._detectIconPath()),(this.options.imagePath||_i.imagePath)+di.prototype._getIconUrl.call(this,t)},_stripUrl:function(t){function e(t,e,i){return(e=e.exec(t))&&e[i]}return(t=e(t,/^url\((['"])?(.+)\1\)$/,2))&&e(t,/^(.*)marker-icon\.png$/,1)},_detectIconPath:function(){var t=P("div","leaflet-default-icon-path",document.body),e=pe(t,"background-image")||pe(t,"backgroundImage");return document.body.removeChild(t),(e=this._stripUrl(e))?e:(t=document.querySelector('link[href$="leaflet.css"]'))?t.href.substring(0,t.href.length-"leaflet.css".length-1):""}}),pi=n.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new Xe(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),M(t,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&z(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var e=this._marker,i=e._map,n=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=Pe(e._icon),r=i.getPixelBounds(),a=i.getPixelOrigin(),a=_(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));a.contains(s)||(o=m((Math.max(a.max.x,s.x)-a.max.x)/(r.max.x-a.max.x)-(Math.min(a.min.x,s.x)-a.min.x)/(r.min.x-a.min.x),(Math.max(a.max.y,s.y)-a.max.y)/(r.max.y-a.max.y)-(Math.min(a.min.y,s.y)-a.min.y)/(r.min.y-a.min.y)).multiplyBy(n),i.panBy(o,{animate:!1}),this._draggable._newPos._add(o),this._draggable._startPos._add(o),Z(e._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=x(this._adjustPan.bind(this,t)))},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup&&this._marker.closePopup(),this._marker.fire("movestart").fire("dragstart")},_onPreDrag:function(t){this._marker.options.autoPan&&(r(this._panRequest),this._panRequest=x(this._adjustPan.bind(this,t)))},_onDrag:function(t){var e=this._marker,i=e._shadow,n=Pe(e._icon),o=e._map.layerPointToLatLng(n);i&&Z(i,n),e._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,e.fire("move",t).fire("drag",t)},_onDragEnd:function(t){r(this._panRequest),delete this._oldLatLng,this._marker.fire("moveend").fire("dragend",t)}}),mi=o.extend({options:{icon:new _i,interactive:!0,keyboard:!0,title:"",alt:"Marker",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",shadowPane:"shadowPane",bubblingMouseEvents:!1,autoPanOnFocus:!0,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10},initialize:function(t,e){c(this,e),this._latlng=w(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var e=this._latlng;return this._latlng=w(t),this.update(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},getIcon:function(){return this.options.icon},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){var t;return this._icon&&this._map&&(t=this._map.latLngToLayerPoint(this._latlng).round(),this._setPos(t)),this},_initIcon:function(){var t=this.options,e="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),i=t.icon.createIcon(this._icon),n=!1,i=(i!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(i.title=t.title),"IMG"===i.tagName&&(i.alt=t.alt||"")),M(i,e),t.keyboard&&(i.tabIndex="0",i.setAttribute("role","button")),this._icon=i,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex}),this.options.autoPanOnFocus&&S(i,"focus",this._panOnFocus,this),t.icon.createShadow(this._shadow)),o=!1;i!==this._shadow&&(this._removeShadow(),o=!0),i&&(M(i,e),i.alt=""),this._shadow=i,t.opacity<1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),i&&o&&this.getPane(t.shadowPane).appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),this.options.autoPanOnFocus&&k(this._icon,"focus",this._panOnFocus,this),T(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&T(this._shadow),this._shadow=null},_setPos:function(t){this._icon&&Z(this._icon,t),this._shadow&&Z(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon&&(this._icon.style.zIndex=this._zIndex+t)},_animateZoom:function(t){t=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(t)},_initInteraction:function(){var t;this.options.interactive&&(M(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),pi&&(t=this.options.draggable,this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new pi(this),t&&this.dragging.enable()))},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;this._icon&&C(this._icon,t),this._shadow&&C(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_panOnFocus:function(){var t,e,i=this._map;i&&(t=(e=this.options.icon.options).iconSize?m(e.iconSize):m(0,0),e=e.iconAnchor?m(e.iconAnchor):m(0,0),i.panInside(this._latlng,{paddingTopLeft:e,paddingBottomRight:t.subtract(e)}))},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}});var fi=o.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:"evenodd",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return c(this,t),this._renderer&&(this._renderer._updateStyle(this),this.options.stroke&&t&&Object.prototype.hasOwnProperty.call(t,"weight")&&this._updateBounds()),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+(this._renderer.options.tolerance||0)}}),gi=fi.extend({options:{fill:!0,radius:10},initialize:function(t,e){c(this,e),this._latlng=w(t),this._radius=this.options.radius},setLatLng:function(t){var e=this._latlng;return this._latlng=w(t),this.redraw(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var e=t&&t.radius||this._radius;return fi.prototype.setStyle.call(this,t),this.setRadius(e),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,e=this._radiusY||t,i=this._clickTolerance(),t=[t+i,e+i];this._pxBounds=new f(this._point.subtract(t),this._point.add(t))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}});var vi=gi.extend({initialize:function(t,e,i){if(c(this,e="number"==typeof e?l({},i,{radius:e}):e),this._latlng=w(t),isNaN(this.options.radius))throw new Error("Circle radius cannot be NaN");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new s(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:fi.prototype.setStyle,_project:function(){var t,e,i,n,o,s=this._latlng.lng,r=this._latlng.lat,a=this._map,h=a.options.crs;h.distance===st.distance?(n=Math.PI/180,o=this._mRadius/st.R/n,t=a.project([r+o,s]),e=a.project([r-o,s]),e=t.add(e).divideBy(2),i=a.unproject(e).lat,n=Math.acos((Math.cos(o*n)-Math.sin(r*n)*Math.sin(i*n))/(Math.cos(r*n)*Math.cos(i*n)))/n,!isNaN(n)&&0!==n||(n=o/Math.cos(Math.PI/180*r)),this._point=e.subtract(a.getPixelOrigin()),this._radius=isNaN(n)?0:e.x-a.project([i,s-n]).x,this._radiusY=e.y-t.y):(o=h.unproject(h.project(this._latlng).subtract([this._mRadius,0])),this._point=a.latLngToLayerPoint(this._latlng),this._radius=this._point.x-a.latLngToLayerPoint(o).x),this._updateBounds()}});var yi=fi.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,e){c(this,e),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var e=1/0,i=null,n=ri,o=0,s=this._parts.length;o<s;o++)for(var r=this._parts[o],a=1,h=r.length;a<h;a++){var l,u,c=n(t,l=r[a-1],u=r[a],!0);c<e&&(e=c,i=n(t,l,u))}return i&&(i.distance=Math.sqrt(e)),i},getCenter:function(){if(this._map)return hi(this._defaultShape(),this._map.options.crs);throw new Error("Must add layer to map before using getCenter()")},getBounds:function(){return this._bounds},addLatLng:function(t,e){return e=e||this._defaultShape(),t=w(t),e.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new s,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return I(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var e=[],i=I(t),n=0,o=t.length;n<o;n++)i?(e[n]=w(t[n]),this._bounds.extend(e[n])):e[n]=this._convertLatLngs(t[n]);return e},_project:function(){var t=new f;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t),this._bounds.isValid()&&t.isValid()&&(this._rawPxBounds=t,this._updateBounds())},_updateBounds:function(){var t=this._clickTolerance(),t=new p(t,t);this._rawPxBounds&&(this._pxBounds=new f([this._rawPxBounds.min.subtract(t),this._rawPxBounds.max.add(t)]))},_projectLatlngs:function(t,e,i){var n,o,s=t[0]instanceof v,r=t.length;if(s){for(o=[],n=0;n<r;n++)o[n]=this._map.latLngToLayerPoint(t[n]),i.extend(o[n]);e.push(o)}else for(n=0;n<r;n++)this._projectLatlngs(t[n],e,i)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var e,i,n,o,s=this._parts,r=0,a=0,h=this._rings.length;r<h;r++)for(e=0,i=(o=this._rings[r]).length;e<i-1;e++)(n=ni(o[e],o[e+1],t,e,!0))&&(s[a]=s[a]||[],s[a].push(n[0]),n[1]===o[e+1]&&e!==i-2||(s[a].push(n[1]),a++))},_simplifyPoints:function(){for(var t=this._parts,e=this.options.smoothFactor,i=0,n=t.length;i<n;i++)t[i]=ei(t[i],e)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,e){var i,n,o,s,r,a,h=this._clickTolerance();if(this._pxBounds&&this._pxBounds.contains(t))for(i=0,s=this._parts.length;i<s;i++)for(n=0,o=(r=(a=this._parts[i]).length)-1;n<r;o=n++)if((e||0!==n)&&ii(t,a[o],a[n])<=h)return!0;return!1}});yi._flat=ai;var xi=yi.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(this._map)return $e(this._defaultShape(),this._map.options.crs);throw new Error("Must add layer to map before using getCenter()")},_convertLatLngs:function(t){var t=yi.prototype._convertLatLngs.call(this,t),e=t.length;return 2<=e&&t[0]instanceof v&&t[0].equals(t[e-1])&&t.pop(),t},_setLatLngs:function(t){yi.prototype._setLatLngs.call(this,t),I(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return(I(this._latlngs[0])?this._latlngs:this._latlngs[0])[0]},_clipPoints:function(){var t=this._renderer._bounds,e=this.options.weight,e=new p(e,e),t=new f(t.min.subtract(e),t.max.add(e));if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var i,n=0,o=this._rings.length;n<o;n++)(i=Je(this._rings[n],t,!0)).length&&this._parts.push(i)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var e,i,n,o,s,r,a,h,l=!1;if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(h=(e=this._parts[o]).length)-1;st.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||yi.prototype._containsPoint.call(this,t,!0)}});var wi=ci.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;e<i;e++)((n=o[e]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s,r=this.options;return(!r.filter||r.filter(t))&&(s=bi(t,r))?(s.feature=Zi(t),s.defaultOptions=s.options,this.resetStyle(s),r.onEachFeature&&r.onEachFeature(t,s),this.addLayer(s)):this},resetStyle:function(t){return void 0===t?this.eachLayer(this.resetStyle,this):(t.options=l({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this)},setStyle:function(e){return this.eachLayer(function(t){this._setLayerStyle(t,e)},this)},_setLayerStyle:function(t,e){t.setStyle&&("function"==typeof e&&(e=e(t.feature)),t.setStyle(e))}});function bi(t,e){var i,n,o,s,r="Feature"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],l=e&&e.pointToLayer,u=e&&e.coordsToLatLng||Li;if(!a&&!r)return null;switch(r.type){case"Point":return Pi(l,t,i=u(a),e);case"MultiPoint":for(o=0,s=a.length;o<s;o++)i=u(a[o]),h.push(Pi(l,t,i,e));return new ci(h);case"LineString":case"MultiLineString":return n=Ti(a,"LineString"===r.type?0:1,u),new yi(n,e);case"Polygon":case"MultiPolygon":return n=Ti(a,"Polygon"===r.type?1:2,u),new xi(n,e);case"GeometryCollection":for(o=0,s=r.geometries.length;o<s;o++){var c=bi({geometry:r.geometries[o],type:"Feature",properties:t.properties},e);c&&h.push(c)}return new ci(h);case"FeatureCollection":for(o=0,s=r.features.length;o<s;o++){var d=bi(r.features[o],e);d&&h.push(d)}return new ci(h);default:throw new Error("Invalid GeoJSON object.")}}function Pi(t,e,i,n){return t?t(e,i):new mi(i,n&&n.markersInheritOptions&&n)}function Li(t){return new v(t[1],t[0],t[2])}function Ti(t,e,i){for(var n,o=[],s=0,r=t.length;s<r;s++)n=e?Ti(t[s],e-1,i):(i||Li)(t[s]),o.push(n);return o}function Mi(t,e){return void 0!==(t=w(t)).alt?[i(t.lng,e),i(t.lat,e),i(t.alt,e)]:[i(t.lng,e),i(t.lat,e)]}function zi(t,e,i,n){for(var o=[],s=0,r=t.length;s<r;s++)o.push(e?zi(t[s],I(t[s])?0:e-1,i,n):Mi(t[s],n));return!e&&i&&0<o.length&&o.push(o[0].slice()),o}function Ci(t,e){return t.feature?l({},t.feature,{geometry:e}):Zi(e)}function Zi(t){return"Feature"===t.type||"FeatureCollection"===t.type?t:{type:"Feature",properties:{},geometry:t}}Tt={toGeoJSON:function(t){return Ci(this,{type:"Point",coordinates:Mi(this.getLatLng(),t)})}};function Si(t,e){return new wi(t,e)}mi.include(Tt),vi.include(Tt),gi.include(Tt),yi.include({toGeoJSON:function(t){var e=!I(this._latlngs);return Ci(this,{type:(e?"Multi":"")+"LineString",coordinates:zi(this._latlngs,e?1:0,!1,t)})}}),xi.include({toGeoJSON:function(t){var e=!I(this._latlngs),i=e&&!I(this._latlngs[0]),t=zi(this._latlngs,i?2:e?1:0,!0,t);return Ci(this,{type:(i?"Multi":"")+"Polygon",coordinates:t=e?t:[t]})}}),ui.include({toMultiPoint:function(e){var i=[];return this.eachLayer(function(t){i.push(t.toGeoJSON(e).geometry.coordinates)}),Ci(this,{type:"MultiPoint",coordinates:i})},toGeoJSON:function(e){var i,n,t=this.feature&&this.feature.geometry&&this.feature.geometry.type;return"MultiPoint"===t?this.toMultiPoint(e):(i="GeometryCollection"===t,n=[],this.eachLayer(function(t){t.toGeoJSON&&(t=t.toGeoJSON(e),i?n.push(t.geometry):"FeatureCollection"===(t=Zi(t)).type?n.push.apply(n,t.features):n.push(t))}),i?Ci(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n})}});var Mt=Si,Ei=o.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(t,e,i){this._url=t,this._bounds=g(e),c(this,i)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(M(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){T(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&fe(this._image),this},bringToBack:function(){return this._map&&ge(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=g(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t="IMG"===this._url.tagName,e=this._image=t?this._url:P("img");M(e,"leaflet-image-layer"),this._zoomAnimated&&M(e,"leaflet-zoom-animated"),this.options.className&&M(e,this.options.className),e.onselectstart=u,e.onmousemove=u,e.onload=a(this.fire,this,"load"),e.onerror=a(this._overlayOnError,this,"error"),!this.options.crossOrigin&&""!==this.options.crossOrigin||(e.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),t?this._url=e.src:(e.src=this._url,e.alt=this.options.alt)},_animateZoom:function(t){var e=this._map.getZoomScale(t.zoom),t=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;be(this._image,t,e)},_reset:function(){var t=this._image,e=new f(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=e.getSize();Z(t,e.min),t.style.width=i.x+"px",t.style.height=i.y+"px"},_updateOpacity:function(){C(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)},getCenter:function(){return this._bounds.getCenter()}}),ki=Ei.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1,playsInline:!0},_initImage:function(){var t="VIDEO"===this._url.tagName,e=this._image=t?this._url:P("video");if(M(e,"leaflet-image-layer"),this._zoomAnimated&&M(e,"leaflet-zoom-animated"),this.options.className&&M(e,this.options.className),e.onselectstart=u,e.onmousemove=u,e.onloadeddata=a(this.fire,this,"load"),t){for(var i=e.getElementsByTagName("source"),n=[],o=0;o<i.length;o++)n.push(i[o].src);this._url=0<i.length?n:[e.src]}else{d(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(e.style,"objectFit")&&(e.style.objectFit="fill"),e.autoplay=!!this.options.autoplay,e.loop=!!this.options.loop,e.muted=!!this.options.muted,e.playsInline=!!this.options.playsInline;for(var s=0;s<this._url.length;s++){var r=P("source");r.src=this._url[s],e.appendChild(r)}}}});var Oi=Ei.extend({_initImage:function(){var t=this._image=this._url;M(t,"leaflet-image-layer"),this._zoomAnimated&&M(t,"leaflet-zoom-animated"),this.options.className&&M(t,this.options.className),t.onselectstart=u,t.onmousemove=u}});var Ai=o.extend({options:{interactive:!1,offset:[0,0],className:"",pane:void 0,content:""},initialize:function(t,e){t&&(t instanceof v||d(t))?(this._latlng=w(t),c(this,e)):(c(this,t),this._source=e),this.options.content&&(this._content=this.options.content)},openOn:function(t){return(t=arguments.length?t:this._source._map).hasLayer(this)||t.addLayer(this),this},close:function(){return this._map&&this._map.removeLayer(this),this},toggle:function(t){return this._map?this.close():(arguments.length?this._source=t:t=this._source,this._prepareOpen(),this.openOn(t._map)),this},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&C(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&C(this._container,1),this.bringToFront(),this.options.interactive&&(M(this._container,"leaflet-interactive"),this.addInteractiveTarget(this._container))},onRemove:function(t){t._fadeAnimated?(C(this._container,0),this._removeTimeout=setTimeout(a(T,void 0,this._container),200)):T(this._container),this.options.interactive&&(z(this._container,"leaflet-interactive"),this.removeInteractiveTarget(this._container))},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=w(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&fe(this._container),this},bringToBack:function(){return this._map&&ge(this._container),this},_prepareOpen:function(t){if(!(i=this._source)._map)return!1;if(i instanceof ci){var e,i=null,n=this._source._layers;for(e in n)if(n[e]._map){i=n[e];break}if(!i)return!1;this._source=i}if(!t)if(i.getCenter)t=i.getCenter();else if(i.getLatLng)t=i.getLatLng();else{if(!i.getBounds)throw new Error("Unable to get source layer LatLng.");t=i.getBounds().getCenter()}return this.setLatLng(t),this._map&&this.update(),!0},_updateContent:function(){if(this._content){var t=this._contentNode,e="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof e)t.innerHTML=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(e)}this.fire("contentupdate")}},_updatePosition:function(){var t,e,i;this._map&&(e=this._map.latLngToLayerPoint(this._latlng),t=m(this.options.offset),i=this._getAnchor(),this._zoomAnimated?Z(this._container,e.add(i)):t=t.add(e).add(i),e=this._containerBottom=-t.y,i=this._containerLeft=-Math.round(this._containerWidth/2)+t.x,this._container.style.bottom=e+"px",this._container.style.left=i+"px")},_getAnchor:function(){return[0,0]}}),Bi=(A.include({_initOverlay:function(t,e,i,n){var o=e;return o instanceof t||(o=new t(n).setContent(e)),i&&o.setLatLng(i),o}}),o.include({_initOverlay:function(t,e,i,n){var o=i;return o instanceof t?(c(o,n),o._source=this):(o=e&&!n?e:new t(n,this)).setContent(i),o}}),Ai.extend({options:{pane:"popupPane",offset:[0,7],maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:""},openOn:function(t){return!(t=arguments.length?t:this._source._map).hasLayer(this)&&t._popup&&t._popup.options.autoClose&&t.removeLayer(t._popup),t._popup=this,Ai.prototype.openOn.call(this,t)},onAdd:function(t){Ai.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof fi||this._source.on("preclick",Ae))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof fi||this._source.off("preclick",Ae))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this.close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_initLayout:function(){var t="leaflet-popup",e=this._container=P("div",t+" "+(this.options.className||"")+" leaflet-zoom-animated"),i=this._wrapper=P("div",t+"-content-wrapper",e);this._contentNode=P("div",t+"-content",i),Ie(e),Be(this._contentNode),S(e,"contextmenu",Ae),this._tipContainer=P("div",t+"-tip-container",e),this._tip=P("div",t+"-tip",this._tipContainer),this.options.closeButton&&((i=this._closeButton=P("a",t+"-close-button",e)).setAttribute("role","button"),i.setAttribute("aria-label","Close popup"),i.href="#close",i.innerHTML='&#215;‘,S(i,"click",function(t){O(t),this.close()},this))},_updateLayout:function(){var t=this._contentNode,e=t.style,i=(e.width="",e.whiteSpace="nowrap",t.offsetWidth),i=Math.min(i,this.options.maxWidth),i=(i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="",t.offsetHeight),n=this.options.maxHeight,o="leaflet-popup-scrolled";(n&&ns.x&&(r=i.x+a-s.x+o.x),i.x-r-n.xs.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Ii=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Bi,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Bi,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ci||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof fi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Ai.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ai.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.x<o.x?(s="right",0):(s="left",r+2*(h.x+l.x)),a/2);t=t.subtract(m(e,i,!0)).add(h).add(l),z(n,"leaflet-tooltip-right"),z(n,"leaflet-tooltip-left"),z(n,"leaflet-tooltip-top"),z(n,"leaflet-tooltip-bottom"),M(n,"leaflet-tooltip-"+s),Z(n,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&C(this._container,t)},_animateZoom:function(t){t=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(t)},_getAnchor:function(){return m(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}})),Ri=(A.include({openTooltip:function(t,e,i){return this._initOverlay(Ii,t,e,i).openOn(this),this},closeTooltip:function(t){return t.close(),this}}),o.include({bindTooltip:function(t,e){return this._tooltip&&this.isTooltipOpen()&&this.unbindTooltip(),this._tooltip=this._initOverlay(Ii,this._tooltip,t,e),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){var e,i;!t&&this._tooltipHandlersAdded||(e=t?"off":"on",i={remove:this.closeTooltip,move:this._moveTooltip},this._tooltip.options.permanent?i.add=this._openTooltip:(i.mouseover=this._openTooltip,i.mouseout=this.closeTooltip,i.click=this._openTooltip,this._map?this._addFocusListeners():i.add=this._addFocusListeners),this._tooltip.options.sticky&&(i.mousemove=this._moveTooltip),this[e](i),this._tooltipHandlersAdded=!t)},openTooltip:function(t){return this._tooltip&&(this instanceof ci||(this._tooltip._source=this),this._tooltip._prepareOpen(t)&&(this._tooltip.openOn(this._map),this.getElement?this._setAriaDescribedByOnLayer(this):this.eachLayer&&this.eachLayer(this._setAriaDescribedByOnLayer,this))),this},closeTooltip:function(){if(this._tooltip)return this._tooltip.close()},toggleTooltip:function(){return this._tooltip&&this._tooltip.toggle(this),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_addFocusListeners:function(){this.getElement?this._addFocusListenersOnLayer(this):this.eachLayer&&this.eachLayer(this._addFocusListenersOnLayer,this)},_addFocusListenersOnLayer:function(t){var e="function"==typeof t.getElement&&t.getElement();e&&(S(e,"focus",function(){this._tooltip._source=t,this.openTooltip()},this),S(e,"blur",this.closeTooltip,this))},_setAriaDescribedByOnLayer:function(t){t="function"==typeof t.getElement&&t.getElement();t&&t.setAttribute("aria-describedby",this._tooltip._container.id)},_openTooltip:function(t){var e;this._tooltip&&this._map&&(this._map.dragging&&this._map.dragging.moving()&&!this._openOnceFlag?(this._openOnceFlag=!0,(e=this)._map.once("moveend",function(){e._openOnceFlag=!1,e._openTooltip(t)})):(this._tooltip._source=t.layer||t.target,this.openTooltip(this._tooltip.options.sticky?t.latlng:void 0)))},_moveTooltip:function(t){var e=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(t=this._map.mouseEventToContainerPoint(t.originalEvent),t=this._map.containerPointToLayerPoint(t),e=this._map.layerPointToLatLng(t)),this._tooltip.setLatLng(e)}}),di.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var t=t&&"DIV"===t.tagName?t:document.createElement("div"),e=this.options;return e.html instanceof Element?(me(t),t.appendChild(e.html)):t.innerHTML=!1!==e.html?e.html:"",e.bgPos&&(e=m(e.bgPos),t.style.backgroundPosition=-e.x+"px "+-e.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}));di.Default=_i;var Ni=o.extend({options:{tileSize:256,opacity:1,updateWhenIdle:b.mobile,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){c(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),T(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(fe(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(ge(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){var t;return this._map&&(this._removeAllTiles(),(t=this._clampZoom(this._map.getZoom()))!==this._tileZoom&&(this._tileZoom=t,this._updateLevels()),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=j(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof p?t:new p(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var e,i=this.getPane().children,n=-t(-1/0,1/0),o=0,s=i.length;o<s;o++)e=i[o].style.zIndex,i[o]!==this._container&&e&&(n=t(n,+e));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!b.ielt9){C(this._container,this.options.opacity);var t,e=+new Date,i=!1,n=!1;for(t in this._tiles){var o,s=this._tiles[t];s.current&&s.loaded&&(o=Math.min(1,(e-s.loaded)/200),C(s.el,o),o<1?i=!0:(s.active?n=!0:this._onOpaqueTile(s),s.active=!0))}n&&!this._noPrune&&this._pruneTiles(),i&&(r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this))}},_onOpaqueTile:u,_initContainer:function(){this._container||(this._container=P("div","leaflet-layer "+(this.options.className||"")),this._updateZIndex(),this.options.opacitythis.options.maxZoom||n<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(i=this._tiles[t]).retain=i.current;for(t in this._tiles)(i=this._tiles[t]).current&&!i.active&&(e=i.coords,this._retainParent(e.x,e.y,e.z,e.z-5)||this._retainChildren(e.x,e.y,e.z,e.z+2));for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var e in this._tiles)this._tiles[e].coords.z===t&&this._removeTile(e)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)T(this._levels[t].el),this._onRemoveLevel(Number(t)),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,e,i,n){var t=Math.floor(t/2),e=Math.floor(e/2),i=i-1,o=new p(+t,+e),o=(o.z=i,this._tileCoordsToKey(o)),o=this._tiles[o];return o&&o.active?o.retain=!0:(o&&o.loaded&&(o.retain=!0),n<i&&this._retainParent(t,e,i,n))},_retainChildren:function(t,e,i,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*e;s<2*e+2;s++){var r=new p(o,s),r=(r.z=i+1,this._tileCoordsToKey(r)),r=this._tiles[r];r&&r.active?r.retain=!0:(r&&r.loaded&&(r.retain=!0),i+1<n&&this._retainChildren(o,s,i+1,n))}},_resetView:function(t){t=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),t,t)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var e=this.options;return void 0!==e.minNativeZoom&&t<e.minNativeZoom?e.minNativeZoom:void 0!==e.maxNativeZoom&&e.maxNativeZoomthis.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom?void 0:this._clampZoom(o),s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),i||this._pruneTiles(),this._noPrune=!!i),this._setZoomTransforms(t,e)},_setZoomTransforms:function(t,e){for(var i in this._levels)this._setZoomTransform(this._levels[i],t,e)},_setZoomTransform:function(t,e,i){var n=this._map.getZoomScale(i,t.zoom),e=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(e,i)).round();b.any3d?be(t.el,e,n):Z(t.el,e)},_resetGrid:function(){var t=this._map,e=t.options.crs,i=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=e.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,e.wrapLng[0]],n).x/i.x),Math.ceil(t.project([0,e.wrapLng[1]],n).x/i.y)],this._wrapY=e.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([e.wrapLat[0],0],n).y/i.x),Math.ceil(t.project([e.wrapLat[1],0],n).y/i.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var e=this._map,i=e._animatingZoom?Math.max(e._animateToZoom,e.getZoom()):e.getZoom(),i=e.getZoomScale(i,this._tileZoom),t=e.project(t,this._tileZoom).floor(),e=e.getSize().divideBy(2*i);return new f(t.subtract(e),t.add(e))},_update:function(t){var e=this._map;if(e){var i=this._clampZoom(e.getZoom());if(void 0===t&&(t=e.getCenter()),void 0!==this._tileZoom){var n,e=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(e),s=o.getCenter(),r=[],e=this.options.keepBuffer,a=new f(o.getBottomLeft().subtract([e,-e]),o.getTopRight().add([e,-e]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of tiles");for(n in this._tiles){var h=this._tiles[n].coords;h.z===this._tileZoom&&a.contains(new p(h.x,h.y))||(this._tiles[n].current=!1)}if(1<Math.abs(i-this._tileZoom))this._setView(t,i);else{for(var l=o.min.y;l<=o.max.y;l++)for(var u=o.min.x;u<=o.max.x;u++){var c,d=new p(u,l);d.z=this._tileZoom,this._isValidTile(d)&&((c=this._tiles[this._tileCoordsToKey(d)])?c.current=!0:r.push(d))}if(r.sort(function(t,e){return t.distanceTo(s)-e.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));for(var _=document.createDocumentFragment(),u=0;u<r.length;u++)this._addTile(r[u],_);this._level.el.appendChild(_)}}}}},_isValidTile:function(t){var e=this._map.options.crs;if(!e.infinite){var i=this._globalTileRange;if(!e.wrapLng&&(t.xi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Di=Ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0<e.maxZoom?(e.tileSize=Math.floor(e.tileSize/2),e.zoomReverse?(e.zoomOffset–,e.minZoom=Math.min(e.maxZoom,e.minZoom+1)):(e.zoomOffset++,e.maxZoom=Math.max(e.minZoom,e.maxZoom-1)),e.minZoom=Math.max(0,e.minZoom)):e.zoomReverse?e.minZoom=Math.min(e.maxZoom,e.minZoom):e.maxZoom=Math.max(e.minZoom,e.maxZoom),"string"==typeof e.subdomains&&(e.subdomains=e.subdomains.split("")),this.on("tileunload",this._onTileRemove)},setUrl:function(t,e){return this._url===t&&void 0===e&&(e=!0),this._url=t,e||this.redraw(),this},createTile:function(t,e){var i=document.createElement("img");return S(i,"load",a(this._tileOnLoad,this,e,i)),S(i,"error",a(this._tileOnError,this,e,i)),!this.options.crossOrigin&&""!==this.options.crossOrigin||(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),"string"==typeof this.options.referrerPolicy&&(i.referrerPolicy=this.options.referrerPolicy),i.alt="",i.src=this.getTileUrl(t),i},getTileUrl:function(t){var e={r:b.retina?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};return this._map&&!this._map.options.crs.infinite&&(t=this._globalTileRange.max.y-t.y,this.options.tms&&(e.y=t),e["-y"]=t),q(this._url,l(e,this.options))},_tileOnLoad:function(t,e){b.ielt9?setTimeout(a(t,this,null,e),0):t(null,e)},_tileOnError:function(t,e,i){var n=this.options.errorTileUrl;n&&e.getAttribute("src")!==n&&(e.src=n),t(i,e)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,e=this.options.maxZoom;return(t=this.options.zoomReverse?e-t:t)+this.options.zoomOffset},_getSubdomain:function(t){t=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[t]},_abortLoading:function(){var t,e,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=u,i.onerror=u,i.complete||(i.src=K,e=this._tiles[t].coords,T(i),delete this._tiles[t],this.fire("tileabort",{tile:i,coords:e})))},_removeTile:function(t){var e=this._tiles[t];if(e)return e.el.setAttribute("src",K),Ni.prototype._removeTile.call(this,t)},_tileReady:function(t,e,i){if(this._map&&(!i||i.getAttribute("src")!==K))return Ni.prototype._tileReady.call(this,t,e,i)}});function ji(t,e){return new Di(t,e)}var Hi=Di.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var i,n=l({},this.defaultWmsParams);for(i in e)i in this.options||(n[i]=e[i]);var t=(e=c(this,e)).detectRetina&&b.retina?2:1,o=this.getTileSize();n.width=o.x*t,n.height=o.y*t,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=1.3<=this._wmsVersion?"crs":"srs";this.wmsParams[e]=this._crs.code,Di.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._tileCoordsToNwSe(t),i=this._crs,i=_(i.project(e[0]),i.project(e[1])),e=i.min,i=i.max,e=(1.3<=this._wmsVersion&&this._crs===li?[e.y,e.x,i.y,i.x]:[e.x,e.y,i.x,i.y]).join(","),i=Di.prototype.getTileUrl.call(this,t);return i+U(this.wmsParams,i,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+e},setParams:function(t,e){return l(this.wmsParams,t),e||this.redraw(),this}});Di.WMS=Hi,ji.wms=function(t,e){return new Hi(t,e)};var Wi=o.extend({options:{padding:.1},initialize:function(t){c(this,t),h(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),M(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,e){var i=this._map.getZoomScale(e,this._zoom),n=this._map.getSize().multiplyBy(.5+this.options.padding),o=this._map.project(this._center,e),n=n.multiplyBy(-i).add(o).subtract(this._map._getNewPixelOrigin(t,e));b.any3d?be(this._container,n,i):Z(this._container,n)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,e=this._map.getSize(),i=this._map.containerPointToLayerPoint(e.multiplyBy(-t)).round();this._bounds=new f(i,i.add(e.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),Fi=Wi.extend({options:{tolerance:0},getEvents:function(){var t=Wi.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){Wi.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");S(t,"mousemove",this._onMouseMove,this),S(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),S(t,"mouseout",this._handleMouseOut,this),t._leaflet_disable_events=!0,this._ctx=t.getContext("2d")},_destroyContainer:function(){r(this._redrawRequest),delete this._ctx,T(this._container),k(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){var t,e,i,n;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),t=this._bounds,e=this._container,i=t.getSize(),n=b.retina?2:1,Z(e,t.min),e.width=n*i.x,e.height=n*i.y,e.style.width=i.x+"px",e.style.height=i.y+"px",b.retina&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update"))},_reset:function(){Wi.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t);t=(this._layers[h(t)]=t)._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=t),this._drawLast=t,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var e=t._order,i=e.next,e=e.prev;i?i.prev=e:this._drawLast=e,e?e.next=i:this._drawFirst=i,delete t._order,delete this._layers[h(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){for(var e,i=t.options.dashArray.split(/[, ]+/),n=[],o=0;o<i.length;o++){if(e=Number(i[o]),isNaN(e))return;n.push(e)}t.options._dashArray=n}else t.options._dashArray=t.options.dashArray},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||x(this._redraw,this))},_extendRedrawBounds:function(t){var e;t._pxBounds&&(e=(t.options.weight||0)+1,this._redrawBounds=this._redrawBounds||new f,this._redrawBounds.extend(t._pxBounds.min.subtract([e,e])),this._redrawBounds.extend(t._pxBounds.max.add([e,e])))},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t,e=this._redrawBounds;e?(t=e.getSize(),this._ctx.clearRect(e.min.x,e.min.y,t.x,t.y)):(this._ctx.save(),this._ctx.setTransform(1,0,0,1,0,0),this._ctx.clearRect(0,0,this._container.width,this._container.height),this._ctx.restore())},_draw:function(){var t,e,i=this._redrawBounds;this._ctx.save(),i&&(e=i.getSize(),this._ctx.beginPath(),this._ctx.rect(i.min.x,i.min.y,e.x,e.y),this._ctx.clip()),this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!i||t._pxBounds&&t._pxBounds.intersects(i))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,e){if(this._drawing){var i,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(h.beginPath(),i=0;i<a;i++){for(n=0,o=r[i].length;n<o;n++)s=r[i][n],h[n?"lineTo":"moveTo"](s.x,s.y);e&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){var e,i,n,o;this._drawing&&!t._empty()&&(e=t._point,i=this._ctx,n=Math.max(Math.round(t._radius),1),1!=(o=(Math.max(Math.round(t._radiusY),1)||n)/n)&&(i.save(),i.scale(1,o)),i.beginPath(),i.arc(e.x,e.y/o,n,0,2*Math.PI,!1),1!=o&&i.restore(),this._fillStroke(i,t))},_fillStroke:function(t,e){var i=e.options;i.fill&&(t.globalAlpha=i.fillOpacity,t.fillStyle=i.fillColor||i.color,t.fill(i.fillRule||"evenodd")),i.stroke&&0!==i.weight&&(t.setLineDash&&t.setLineDash(e.options&&e.options._dashArray||[]),t.globalAlpha=i.opacity,t.lineWidth=i.weight,t.strokeStyle=i.color,t.lineCap=i.lineCap,t.lineJoin=i.lineJoin,t.stroke())},_onClick:function(t){for(var e,i,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(n)&&(("click"===t.type||"preclick"===t.type)&&this._map._draggableMoved(e)||(i=e));this._fireEvent(!!i&&[i],t)},_onMouseMove:function(t){var e;!this._map||this._map.dragging.moving()||this._map._animatingZoom||(e=this._map.mouseEventToLayerPoint(t),this._handleMouseHover(t,e))},_handleMouseOut:function(t){var e=this._hoveredLayer;e&&(z(this._container,"leaflet-interactive"),this._fireEvent([e],t,"mouseout"),this._hoveredLayer=null,this._mouseHoverThrottled=!1)},_handleMouseHover:function(t,e){if(!this._mouseHoverThrottled){for(var i,n,o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(e)&&(n=i);n!==this._hoveredLayer&&(this._handleMouseOut(t),n&&(M(this._container,"leaflet-interactive"),this._fireEvent([n],t,"mouseover"),this._hoveredLayer=n)),this._fireEvent(!!this._hoveredLayer&&[this._hoveredLayer],t),this._mouseHoverThrottled=!0,setTimeout(a(function(){this._mouseHoverThrottled=!1},this),32)}},_fireEvent:function(t,e,i){this._map._fireDOMEvent(e,i||e.type,t)},_bringToFront:function(t){var e,i,n=t._order;n&&(e=n.next,i=n.prev,e&&((e.prev=i)?i.next=e:e&&(this._drawFirst=e),n.prev=this._drawLast,(this._drawLast.next=n).next=null,this._drawLast=n,this._requestRedraw(t)))},_bringToBack:function(t){var e,i,n=t._order;n&&(e=n.next,(i=n.prev)&&((i.next=e)?e.prev=i:i&&(this._drawLast=i),n.prev=null,n.next=this._drawFirst,this._drawFirst.prev=n,this._drawFirst=n,this._requestRedraw(t)))}});function Ui(t){return b.canvas?new Fi(t):null}var Vi=function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return document.createElement("’)}}catch(t){}return function(t){return document.createElement("’)}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Wi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Vi("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Vi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Vi("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Vi("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},qi=b.vml?Vi:ct,Gi=Wi.extend({_initContainer:function(){this._container=qi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=qi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=qi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Ki(t){return b.svg||b.vml?new Gi(t):null}b.vml&&Gi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Ui(t)||Ki(t)}});var Yi=xi.extend({initialize:function(t,e){xi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Gi.create=qi,Gi.pointsToPath=dt,wi.geometryToLayer=bi,wi.coordsToLatLng=Li,wi.coordsToLatLngs=Ti,wi.latLngToCoords=Mi,wi.latLngsToCoords=zi,wi.getFeature=Ci,wi.asFeature=Zi,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1<this._positions.length&&50<t-this._times[0];)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,e){return t-(t-e)*this._viscosity},_onPreDragLimit:function(){var t,e;this._viscosity&&this._offsetLimit&&(t=this._draggable._newPos.subtract(this._draggable._startPos),e=this._offsetLimit,t.x<e.min.x&&(t.x=this._viscousLimit(t.x,e.min.x)),t.ye.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)<Math.abs(n+i)?o:n;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=t},_onDragEnd:function(t){var e,i,n,o,s=this._map,r=s.options,a=!r.inertia||t.noInertia||this._times.length<2;s.fire("dragend",t),!a&&(this._prunePositions(+new Date),t=this._lastPos.subtract(this._positions[0]),a=(this._lastTime-this._times[0])/1e3,e=r.easeLinearity,a=(t=t.multiplyBy(e/a)).distanceTo([0,0]),i=Math.min(r.inertiaMaxSpeed,a),t=t.multiplyBy(i/a),n=i/(r.inertiaDeceleration*e),(o=t.multiplyBy(-n/2).round()).x||o.y)?(o=s._limitOffset(o,s.options.maxBounds),x(function(){s.panBy(o,{duration:n,easeLinearity:e,noMoveStart:!0,animate:!0})})):s.fire("moveend")}})),St=(A.addInitHook("addHandler","dragging",Zt),A.mergeOptions({keyboard:!0,keyboardPanDelta:80}),n.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),S(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),k(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){var t,e,i;this._focused||(i=document.body,t=document.documentElement,e=i.scrollTop||t.scrollTop,i=i.scrollLeft||t.scrollLeft,this._map._container.focus(),window.scrollTo(i,e))},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){for(var e=this._panKeys={},i=this.keyCodes,n=0,o=i.left.length;n<o;n++)e[i.left[n]]=[-1*t,0];for(n=0,o=i.right.length;n<o;n++)e[i.right[n]]=[t,0];for(n=0,o=i.down.length;n<o;n++)e[i.down[n]]=[0,t];for(n=0,o=i.up.length;n<o;n++)e[i.up[n]]=[0,-1*t]},_setZoomDelta:function(t){for(var e=this._zoomKeys={},i=this.keyCodes,n=0,o=i.zoomIn.length;n<o;n++)e[i.zoomIn[n]]=t;for(n=0,o=i.zoomOut.length;n<o;n++)e[i.zoomOut[n]]=-t},_addHooks:function(){S(document,"keydown",this._onKeyDown,this)},_removeHooks:function(){k(document,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var e,i,n=t.keyCode,o=this._map;if(n in this._panKeys)o._panAnim&&o._panAnim._inProgress||(i=this._panKeys[n],t.shiftKey&&(i=m(i).multiplyBy(3)),o.options.maxBounds&&(i=o._limitOffset(m(i),o.options.maxBounds)),o.options.worldCopyJump?(e=o.wrapLatLng(o.unproject(o.project(o.getCenter()).add(i))),o.panTo(e)):o.panBy(i));else if(n in this._zoomKeys)o.setZoom(o.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[n]);else{if(27!==n||!o._popup||!o._popup.options.closeOnEscapeKey)return;o.closePopup()}Re(t)}}})),Et=(A.addInitHook("addHandler","keyboard",St),A.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60}),n.extend({addHooks:function(){S(this._map._container,"wheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){k(this._map._container,"wheel",this._onWheelScroll,this)},_onWheelScroll:function(t){var e=He(t),i=this._map.options.wheelDebounceTime,e=(this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date),Math.max(i-(+new Date-this._startTime),0));clearTimeout(this._timer),this._timer=setTimeout(a(this._performZoom,this),e),Re(t)},_performZoom:function(){var t=this._map,e=t.getZoom(),i=this._map.options.zoomSnap||0,n=(t._stop(),this._delta/(4*this._map.options.wheelPxPerZoomLevel)),n=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,i=i?Math.ceil(n/i)*i:n,n=t._limitZoom(e+(0<this._delta?i:-i))-e;this._delta=0,this._startTime=null,n&&("center"===t.options.scrollWheelZoom?t.setZoom(e+n):t.setZoomAround(this._lastMousePos,e+n))}})),kt=(A.addInitHook("addHandler","scrollWheelZoom",Et),A.mergeOptions({tapHold:b.touchNative&&b.safari&&b.mobile,tapTolerance:15}),n.extend({addHooks:function(){S(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){k(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){var e;clearTimeout(this._holdTimeout),1===t.touches.length&&(e=t.touches[0],this._startPos=this._newPos=new p(e.clientX,e.clientY),this._holdTimeout=setTimeout(a(function(){this._cancel(),this._isTapValid()&&(S(document,"touchend",O),S(document,"touchend touchcancel",this._cancelClickPrevent),this._simulateEvent("contextmenu",e))},this),600),S(document,"touchend touchcancel contextmenu",this._cancel,this),S(document,"touchmove",this._onMove,this))},_cancelClickPrevent:function t(){k(document,"touchend",O),k(document,"touchend touchcancel",t)},_cancel:function(){clearTimeout(this._holdTimeout),k(document,"touchend touchcancel contextmenu",this._cancel,this),k(document,"touchmove",this._onMove,this)},_onMove:function(t){t=t.touches[0];this._newPos=new p(t.clientX,t.clientY)},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_simulateEvent:function(t,e){t=new MouseEvent(t,{bubbles:!0,cancelable:!0,view:window,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY});t._simulated=!0,e.target.dispatchEvent(t)}})),Ot=(A.addInitHook("addHandler","tapHold",kt),A.mergeOptions({touchZoom:b.touch,bounceAtZoomLimits:!0}),n.extend({addHooks:function(){M(this._map._container,"leaflet-touch-zoom"),S(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){z(this._map._container,"leaflet-touch-zoom"),k(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var e,i,n=this._map;!t.touches||2!==t.touches.length||n._animatingZoom||this._zooming||(e=n.mouseEventToContainerPoint(t.touches[0]),i=n.mouseEventToContainerPoint(t.touches[1]),this._centerPoint=n.getSize()._divideBy(2),this._startLatLng=n.containerPointToLatLng(this._centerPoint),"center"!==n.options.touchZoom&&(this._pinchStartLatLng=n.containerPointToLatLng(e.add(i)._divideBy(2))),this._startDist=e.distanceTo(i),this._startZoom=n.getZoom(),this._moved=!1,this._zooming=!0,n._stop(),S(document,"touchmove",this._onTouchMove,this),S(document,"touchend touchcancel",this._onTouchEnd,this),O(t))},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var e=this._map,i=e.mouseEventToContainerPoint(t.touches[0]),n=e.mouseEventToContainerPoint(t.touches[1]),o=i.distanceTo(n)/this._startDist;if(this._zoom=e.getScaleZoom(o,this._startZoom),!e.options.bounceAtZoomLimits&&(this._zoom<e.getMinZoom()&&oe.getMaxZoom()&&1<o)&&(this._zoom=e._limitZoom(this._zoom)),"center"===e.options.touchZoom){if(this._center=this._startLatLng,1==o)return}else{i=i._add(n)._divideBy(2)._subtract(this._centerPoint);if(1==o&&0===i.x&&0===i.y)return;this._center=e.unproject(e.project(this._pinchStartLatLng,this._zoom).subtract(i),this._zoom)}this._moved||(e._moveStart(!0,!1),this._moved=!0),r(this._animRequest);n=a(e._move,e,this._center,this._zoom,{pinch:!0,round:!1},void 0);this._animRequest=x(n,this,!0),O(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,r(this._animRequest),k(document,"touchmove",this._onTouchMove,this),k(document,"touchend touchcancel",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}})),Xi=(A.addInitHook("addHandler","touchZoom",Ot),A.BoxZoom=_t,A.DoubleClickZoom=Ct,A.Drag=Zt,A.Keyboard=St,A.ScrollWheelZoom=Et,A.TapHold=kt,A.TouchZoom=Ot,t.Bounds=f,t.Browser=b,t.CRS=ot,t.Canvas=Fi,t.Circle=vi,t.CircleMarker=gi,t.Class=et,t.Control=B,t.DivIcon=Ri,t.DivOverlay=Ai,t.DomEvent=mt,t.DomUtil=pt,t.Draggable=Xe,t.Evented=it,t.FeatureGroup=ci,t.GeoJSON=wi,t.GridLayer=Ni,t.Handler=n,t.Icon=di,t.ImageOverlay=Ei,t.LatLng=v,t.LatLngBounds=s,t.Layer=o,t.LayerGroup=ui,t.LineUtil=vt,t.Map=A,t.Marker=mi,t.Mixin=ft,t.Path=fi,t.Point=p,t.PolyUtil=gt,t.Polygon=xi,t.Polyline=yi,t.Popup=Bi,t.PosAnimation=Fe,t.Projection=wt,t.Rectangle=Yi,t.Renderer=Wi,t.SVG=Gi,t.SVGOverlay=Oi,t.TileLayer=Di,t.Tooltip=Ii,t.Transformation=at,t.Util=tt,t.VideoOverlay=ki,t.bind=a,t.bounds=_,t.canvas=Ui,t.circle=function(t,e,i){return new vi(t,e,i)},t.circleMarker=function(t,e){return new gi(t,e)},t.control=Ue,t.divIcon=function(t){return new Ri(t)},t.extend=l,t.featureGroup=function(t,e){return new ci(t,e)},t.geoJSON=Si,t.geoJson=Mt,t.gridLayer=function(t){return new Ni(t)},t.icon=function(t){return new di(t)},t.imageOverlay=function(t,e,i){return new Ei(t,e,i)},t.latLng=w,t.latLngBounds=g,t.layerGroup=function(t,e){return new ui(t,e)},t.map=function(t,e){return new A(t,e)},t.marker=function(t,e){return new mi(t,e)},t.point=m,t.polygon=function(t,e){return new xi(t,e)},t.polyline=function(t,e){return new yi(t,e)},t.popup=function(t,e){return new Bi(t,e)},t.rectangle=function(t,e){return new Yi(t,e)},t.setOptions=c,t.stamp=h,t.svg=Ki,t.svgOverlay=function(t,e,i){return new Oi(t,e,i)},t.tileLayer=ji,t.tooltip=function(t,e){return new Ii(t,e)},t.transformation=ht,t.version="1.9.4",t.videoOverlay=function(t,e,i){return new ki(t,e,i)},window.L);t.noConflict=function(){return window.L=Xi,this},window.L=t}); //# sourceMappingURL=leaflet.js.map (function(){ "use strict"; const CATS = { raf:{label:"RAF / air bases",var:"–c-raf",n:20}, army:{label:"Army garrison centres",var:"–c-army",n:10}, radar:{label:"Radar / ASACS stations",var:"–c-radar",n:10}, mctrl:{label:"Military control centres",var:"–c-mctrl",n:8}, nbase:{label:"Naval bases",var:"–c-nbase",n:6}, nctrl:{label:"Naval control / comms",var:"–c-nctrl",n:6}, gov:{label:"Centres of government",var:"–c-gov",n:14}, city:{label:"Key towns & cities",var:"–c-city",n:24} }; // Tier-1 crown jewels (highest-priority point-defence candidates) const TIER1 = new Set([ "HMNB Clyde (Faslane)","RNAD Coulport","HMNB Portsmouth","HMNB Devonport", "RAF Marham","RAF Waddington","RAF Lossiemouth","RAF Coningsby","RAF Fylingdales", "RAF Lakenheath","RAF Brize Norton","Whitehall / Westminster","MOD Main Building", "PJHQ Northwood","Cheltenham (GCHQ)","London" ]); // cat,name,place,lat,lon,note const NODES = [ ["raf","RAF Lossiemouth","Moray",57.705,-3.339,"QRA (North); Typhoon & P-8 Poseidon MPA"], ["raf","RAF Marham","Norfolk",52.648,0.551,"F-35B Lightning main operating base"], ["raf","RAF Coningsby","Lincolnshire",53.093,-0.166,"QRA (South); Typhoon"], ["raf","RAF Waddington","Lincolnshire",53.166,-0.524,"ISTAR hub — Rivet Joint, Shadow, UAS"], ["raf","RAF Brize Norton","Oxfordshire",51.750,-1.584,"Air transport / air-to-air refuelling hub"], ["raf","RAF Benson","Oxfordshire",51.616,-1.096,"Support helicopter force (Puma/Chinook)"], ["raf","RAF Odiham","Hampshire",51.234,-0.943,"Chinook heavy-lift main base"], ["raf","RAF Wittering","Cambridgeshire",52.613,-0.476,"A4 Force / expeditionary air support"], ["raf","RAF Cranwell","Lincolnshire",53.030,-0.483,"RAF College; flying training"], ["raf","RAF Valley","Anglesey",53.248,-4.535,"Fast-jet training (Hawk); SAR"], ["raf","RAF Shawbury","Shropshire",52.798,-2.668,"Defence helicopter flying school"], ["raf","RAF Leeming","North Yorkshire",54.292,-1.535,"Support / training; dispersal"], ["raf","RAF Honington","Suffolk",52.342,0.773,"RAF Regiment / force protection centre"], ["raf","RAF Northolt","Greater London",51.553,-0.418,"London-area air movements"], ["raf","RAF Cosford","Shropshire",52.640,-2.306,"Technical training"], ["raf","RAF Scampton area","Lincolnshire",53.308,-0.551,"Historic station / Lincolnshire cluster"], ["raf","RAF Boulmer","Northumberland",55.421,-1.600,"ASACS control & reporting; SAR heritage"], ["raf","RAF Fylingdales","North Yorkshire",54.362,-0.670,"BMEWS — ballistic-missile early warning"], ["raf","RAF Lakenheath","Suffolk",52.409,0.561,"USAF — F-15E / F-35A (48th FW)"], ["raf","RAF Mildenhall","Suffolk",52.361,0.486,"USAF — tanker / special ops / ISR"], ["army","Catterick Garrison","North Yorkshire",54.374,-1.723,"Largest British Army garrison"], ["army","Aldershot","Hampshire",51.248,-0.762,"’Home of the British Army’"], ["army","Tidworth–Bulford","Wiltshire",51.233,-1.783,"Armoured centre; Salisbury Plain"], ["army","Colchester","Essex",51.895,0.903,"16 Air Assault Brigade"], ["army","Edinburgh (Redford/Dreghorn)","Lothian",55.906,-3.258,"Scotland garrison"], ["army","Ripon / Catterick corridor","North Yorkshire",54.138,-1.524,"Engineer & training units"], ["army","Warminster","Wiltshire",51.204,-2.182,"Land Warfare Centre"], ["army","Larkhill","Wiltshire",51.203,-1.809,"Royal Artillery centre"], ["army","Bovington / Lulworth","Dorset",50.700,-2.237,"Armour & gunnery training"], ["army","Blandford","Dorset",50.880,-2.166,"Royal Signals centre"], ["radar","RAF Fylingdales (BMEWS)","North Yorkshire",54.362,-0.670,"Phased-array ballistic early warning"], ["radar","RAF Boulmer (ASACS)","Northumberland",55.421,-1.600,"Control & Reporting Centre"], ["radar","Brizlee Wood","Northumberland",55.375,-1.838,"Remote radar head"], ["radar","Buchan","Aberdeenshire",57.472,-1.888,"Remote radar head (NE)"], ["radar","Benbecula","Western Isles",57.481,-7.367,"Remote radar head (NW)"], ["radar","Saxa Vord","Shetland",60.820,-0.848,"Northernmost radar head"], ["radar","Staxton Wold","North Yorkshire",54.192,-0.428,"Remote radar head"], ["radar","Trimingham","Norfolk",52.906,1.400,"Remote radar head (E coast)"], ["radar","Portreath","Cornwall",50.293,-5.294,"Remote radar head (SW)"], ["radar","Neatishead","Norfolk",52.715,1.470,"Air defence radar support site"], ["mctrl","MOD Main Building","Whitehall, London",51.504,-0.125,"Ministry of Defence HQ"], ["mctrl","PJHQ Northwood","Greater London",51.615,-0.419,"Permanent Joint HQ / NATO MARCOM"], ["mctrl","Air Command High Wycombe","Buckinghamshire",51.681,-0.810,"RAF Air Command / CAOC"], ["mctrl","Army HQ Andover","Hampshire",51.207,-1.489,"British Army headquarters"], ["mctrl","Navy Command Portsmouth","Hampshire",50.800,-1.103,"Navy Command HQ"], ["mctrl","Strategic Command Northwood","Greater London",51.615,-0.419,"UK Strategic Command"], ["mctrl","Corsham (Basil Hill)","Wiltshire",51.432,-2.190,"Defence digital / comms hub"], ["mctrl","Boulmer ASACS HQ","Northumberland",55.421,-1.600,"Air surveillance coordination"], ["nbase","HMNB Clyde (Faslane)","Argyll & Bute",56.064,-4.819,"Submarine base — strategic deterrent"], ["nbase","RNAD Coulport","Argyll & Bute",56.056,-4.876,"Warhead storage / loading"], ["nbase","HMNB Portsmouth","Hampshire",50.800,-1.109,"Surface fleet main base (carriers)"], ["nbase","HMNB Devonport","Plymouth",50.385,-4.179,"Largest naval base in W. Europe"], ["nbase","RNAS Culdrose","Cornwall",50.086,-5.256,"Naval air — ASW / Merlin"], ["nbase","RNAS Yeovilton","Somerset",51.009,-2.639,"Naval air — Wildcat / Commando"], ["nctrl","Northwood fleet ops","Greater London",51.615,-0.419,"Maritime operations control"], ["nctrl","VLF submarine broadcast","Midlands (approx)",52.37,-1.26,"Very-low-frequency SSBN comms"], ["nctrl","Forest Moor","North Yorkshire",54.01,-1.69,"Naval communications site"], ["nctrl","NE maritime comms","Aberdeenshire",57.60,-1.91,"Northern comms node"], ["nctrl","Portsmouth comms","Hampshire",50.800,-1.103,"Fleet communications (S)"], ["nctrl","Devonport comms","Plymouth",50.385,-4.179,"Fleet communications (SW)"], ["gov","Whitehall / Westminster","London",51.501,-0.126,"Parliament, Cabinet Office, departments"], ["gov","Edinburgh","Lothian",55.953,-3.188,"Scottish Government & Parliament"], ["gov","Cardiff","South Glamorgan",51.483,-3.179,"Welsh Government & Senedd"], ["gov","Belfast (Stormont)","Antrim",54.597,-5.930,"NI Executive & Assembly"], ["gov","York","North Yorkshire",53.959,-1.083,"Regional seat (historic war plans)"], ["gov","Preston","Lancashire",53.759,-2.699,"NW regional seat (historic)"], ["gov","Cambridge","Cambridgeshire",52.205,0.119,"Eastern regional seat (historic)"], ["gov","Bristol","Avon",51.455,-2.588,"SW regional seat (historic)"], ["gov","Reading","Berkshire",51.455,-0.974,"SE regional seat (historic)"], ["gov","Nottingham","Nottinghamshire",52.954,-1.158,"E. Midlands regional seat"], ["gov","Birmingham (gov)","West Midlands",52.480,-1.903,"W. Midlands regional seat"], ["gov","Leeds (gov)","West Yorkshire",53.801,-1.549,"Yorkshire regional seat"], ["gov","Cheltenham (GCHQ)","Gloucestershire",51.898,-2.124,"Signals intelligence HQ"], ["gov","Corsham bunker","Wiltshire",51.432,-2.190,"Continuity-of-government (historic)"], ["city","London","Greater London",51.509,-0.128,"Capital; population & economic centre"], ["city","Birmingham","West Midlands",52.486,-1.890,"2nd city"], ["city","Manchester","Greater Manchester",53.480,-2.242,""], ["city","Glasgow","Lanarkshire",55.864,-4.252,""], ["city","Liverpool","Merseyside",53.408,-2.991,"Port"], ["city","Leeds","West Yorkshire",53.800,-1.549,""], ["city","Sheffield","South Yorkshire",53.381,-1.470,"Steel / industry"], ["city","Bristol (city)","Avon",51.454,-2.587,"Port / aerospace"], ["city","Newcastle / Gateshead","Tyne & Wear",54.978,-1.617,""], ["city","Sunderland","Tyne & Wear",54.906,-1.383,"Automotive"], ["city","Nottingham (city)","Nottinghamshire",52.954,-1.158,""], ["city","Leicester","Leicestershire",52.636,-1.139,""], ["city","Coventry","West Midlands",52.408,-1.510,"Manufacturing"], ["city","Hull","East Yorkshire",53.745,-0.336,"Port / energy"], ["city","Stoke-on-Trent","Staffordshire",53.002,-2.179,""], ["city","Cardiff (city)","South Glamorgan",51.483,-3.179,"Port"], ["city","Swansea","West Glamorgan",51.621,-3.944,"Port / industry"], ["city","Southampton","Hampshire",50.909,-1.404,"Major port"], ["city","Portsmouth (city)","Hampshire",50.819,-1.088,"Port city"], ["city","Plymouth","Devon",50.376,-4.143,"Port city"], ["city","Aberdeen","Aberdeenshire",57.149,-2.094,"Energy hub"], ["city","Edinburgh (city)","Lothian",55.953,-3.188,""], ["city","Dover","Kent",51.128,1.313,"Cross-Channel chokepoint"], ["city","Teesside","North Yorkshire",54.574,-1.235,"Chemicals / energy / port"] ]; const SYSTEMS = { thaad: {label:"THAAD", sub:"wide-area BMD", var:"–s-thaad", radius:200, on:false, rings:[200]}, patriot: {label:"Patriot PAC-3 MSE", sub:"medium area defence",var:"–s-patriot", radius:120, on:false, rings:[120]}, camm: {label:"Sky Sabre / CAMM-ER", sub:"point defence · 2/site", var:"–s-camm", radius:45, on:true, rings:[25,45]} }; // "Mega" sites (deterrent, carriers, F-35 MOB, capital/government core) — get 4 SHORAD units; others scale down const MEGA = new Set(["HMNB Clyde (Faslane)","RNAD Coulport","HMNB Portsmouth","HMNB Devonport", "RAF Marham","RAF Lossiemouth","Whitehall / Westminster","MOD Main Building","London"]); const SHORAD = {label:"SHORAD / C-UAS", sub:"2–4 per Sky Sabre site", vcol:"–s-shorad", range:8, on:false}; let shoradSites = []; // {lat,lon,units,covered} const PSETS = { all: {label:"All nodes", test:()=>true}, mil: {label:"Military only", test:n=>["raf","army","radar","mctrl","nbase","nctrl"].includes(n.cat)}, cv: {label:"Cities + gov", test:n=>["gov","city"].includes(n.cat)}, t1: {label:"Tier-1 critical", test:n=>TIER1.has(n.name)} }; let activeSet = "t1"; // —- Map —- const map = L.map(‘map’,{center:[54.7,-3.4],zoom:6,minZoom:5,maxZoom:11,zoomControl:true,attributionControl:true}); map.zoomControl.setPosition(‘bottomright’); map.attributionControl.setPrefix(”); map.attributionControl.addAttribution(‘Coastline: Natural Earth · Nodes & ranges: open sources’); const isDark = ()=>{ const a=document.documentElement.getAttribute(‘data-theme’); if(a===’dark’)return true; if(a===’light’)return false; return window.matchMedia(‘(prefers-color-scheme: dark)’).matches; }; function cssVar(v){ return getComputedStyle(document.documentElement).getPropertyValue(v).trim(); } function esc(s){ return String(s).replace(/[&"]/g,c=>({‘&’:’&amp;’,”:’&gt;’,’"’:’&quot;’}[c])); } const UK_GEO = {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"MultiPolygon","coordinates":[[[[-6.307617,54.011035],[-6.345166,53.987207],[-6.347607,53.941309],[-6.321582,53.882178],[-6.270117,53.840234],[-6.194873,53.640869],[-6.141846,53.577539],[-6.129102,53.390869],[-6.15166,53.366406],[-6.04502,53.091162],[-6.027393,52.9271],[-6.130664,52.807275],[-6.169336,52.738135],[-6.199219,52.663477],[-6.217236,52.543115],[-6.34541,52.402002],[-6.463184,52.345361],[-6.325,52.24668],[-6.437939,52.202686],[-6.561084,52.188818],[-6.697314,52.213525],[-6.782227,52.210498],[-6.890234,52.159229],[-6.914648,52.168555],[-6.965771,52.249512],[-7.003271,52.165918],[-7.081787,52.139307],[-7.216211,52.144971],[-7.440869,52.122705],[-7.527295,52.098877],[-7.624902,51.993115],[-7.872168,51.935303],[-7.95249,51.865771],[-8.057812,51.825586],[-8.14502,51.813525],[-8.290234,51.890674],[-8.40918,51.88877],[-8.371631,51.87627],[-8.347363,51.847705],[-8.335596,51.792969],[-8.349121,51.739307],[-8.407812,51.712061],[-8.477832,51.707031],[-8.588281,51.651367],[-8.734473,51.636182],[-8.813428,51.584912],[-9.296484,51.498242],[-9.462891,51.529053],[-9.737305,51.47373],[-9.835352,51.48335],[-9.710352,51.603711],[-9.524902,51.681104],[-9.579834,51.689258],[-10.120752,51.600684],[-10.069434,51.655566],[-9.802881,51.780127],[-9.749512,51.824268],[-9.598828,51.874414],[-10.084229,51.770996],[-10.211719,51.783594],[-10.241748,51.812451],[-10.341064,51.798926],[-10.378711,51.86875],[-10.231592,51.974512],[-10.14585,52.02002],[-9.946045,52.079834],[-9.909668,52.122949],[-9.955811,52.13667],[-10.390234,52.134912],[-10.356689,52.206934],[-10.210938,52.27168],[-10.13208,52.28208],[-9.937305,52.237646],[-9.772119,52.250098],[-9.841064,52.291455],[-9.853223,52.375488],[-9.906055,52.403711],[-9.761133,52.466357],[-9.632227,52.546924],[-9.056152,52.621143],[-8.783447,52.679639],[-8.923291,52.712305],[-8.990283,52.75542],[-9.0979,52.668262],[-9.175391,52.634912],[-9.394238,52.61709],[-9.561035,52.653955],[-9.764355,52.57998],[-9.916602,52.569727],[-9.7396,52.648193],[-9.464893,52.823193],[-9.393652,52.89624],[-9.415723,52.92876],[-9.461963,52.947266],[-9.299219,53.097559],[-9.241895,53.124854],[-9.137598,53.129248],[-8.997168,53.162061],[-8.930127,53.20708],[-9.140332,53.250488],[-9.514209,53.238232],[-9.581738,53.271973],[-9.601758,53.323047],[-9.625977,53.334473],[-9.825391,53.320361],[-9.875781,53.342725],[-9.79541,53.394971],[-9.899023,53.407275],[-10.003906,53.397021],[-10.09126,53.412842],[-10.093994,53.445605],[-10.054395,53.47832],[-10.10625,53.509326],[-10.116992,53.548535],[-10.061719,53.567822],[-10.001367,53.561426],[-9.878271,53.59043],[-9.720654,53.604492],[-9.909717,53.657617],[-9.901611,53.727197],[-9.745068,53.781494],[-9.578223,53.80542],[-9.590527,53.841162],[-9.578857,53.879834],[-9.74751,53.891016],[-9.914062,53.863721],[-9.89624,53.937598],[-9.856348,54.004297],[-9.856445,54.095361],[-9.934473,54.075244],[-9.943604,54.141602],[-9.9771,54.187109],[-10.092676,54.155762],[-10.089697,54.21582],[-10.056396,54.257812],[-9.995947,54.276025],[-9.824561,54.268896],[-9.717139,54.300439],[-9.562305,54.308545],[-9.315527,54.298633],[-9.145898,54.209619],[-9.002441,54.287988],[-8.746777,54.263477],[-8.588037,54.231104],[-8.545557,54.241211],[-8.568457,54.303613],[-8.623145,54.346875],[-8.554443,54.403564],[-8.470996,54.441943],[-8.230371,54.507275],[-8.192969,54.580127],[-8.133447,54.64082],[-8.456543,54.609277],[-8.763916,54.681201],[-8.715186,54.732031],[-8.538281,54.782959],[-8.527686,54.809473],[-8.377295,54.889453],[-8.411719,54.965088],[-8.393262,55.02041],[-8.325781,55.056445],[-8.274609,55.146289],[-8.137695,55.159912],[-8.006104,55.195312],[-7.803174,55.200049],[-7.750537,55.185791],[-7.762549,55.24834],[-7.66709,55.256494],[-7.629785,55.243994],[-7.613379,55.199658],[-7.57002,55.171387],[-7.556641,55.122217],[-7.634277,55.05498],[-7.589844,55.025049],[-7.65874,54.970947],[-7.478418,55.046973],[-7.501953,55.144727],[-7.531445,55.193848],[-7.517871,55.247949],[-7.458301,55.281787],[-7.301758,55.298779],[-7.365967,55.360205],[-7.308789,55.36582],[-6.96167,55.237891],[-7.056396,55.17832],[-7.172852,55.137012],[-7.218652,55.091992],[-7.178613,55.056885],[-7.100635,55.048291],[-7.030762,55.080615],[-6.947168,55.18252],[-6.698828,55.193457],[-6.475049,55.241016],[-6.12915,55.217383],[-6.035791,55.144531],[-5.985742,55.029688],[-5.869189,54.916211],[-5.716846,54.81748],[-5.710742,54.75708],[-5.879102,54.684375],[-5.878613,54.641309],[-5.738623,54.673047],[-5.58252,54.663428],[-5.52793,54.619629],[-5.47041,54.500195],[-5.483887,54.44165],[-5.525879,54.460205],[-5.568555,54.512598],[-5.671094,54.549756],[-5.646094,54.477881],[-5.655957,54.381738],[-5.557812,54.370996],[-5.606787,54.272559],[-5.826172,54.23584],[-5.937744,54.089062],[-6.019043,54.05127],[-6.119531,54.058887],[-6.218018,54.088721],[-6.156934,54.017236],[-6.230664,54.003613],[-6.307617,54.011035]]],[[[-10.181055,54.016846],[-9.996387,54.003613],[-9.956152,53.987207],[-9.952441,53.88457],[-10.026514,53.920557],[-10.0625,53.959717],[-10.265723,53.977686],[-10.181055,54.016846]]],[[[-6.253174,55.607227],[-6.305078,55.606934],[-6.27002,55.670313],[-6.302051,55.728369],[-6.286426,55.77251],[-6.301758,55.780615],[-6.491357,55.697314],[-6.462842,55.808252],[-6.374951,55.871338],[-6.311279,55.856494],[-6.128906,55.930566],[-6.055322,55.695312],[-6.088379,55.65752],[-6.253174,55.607227]]],[[[-6.041309,55.925635],[-5.911768,55.974756],[-5.970312,55.992188],[-5.939062,56.045264],[-5.799609,56.108789],[-5.725146,56.118555],[-5.797217,56.005615],[-5.970068,55.814551],[-6.041553,55.806787],[-6.060352,55.8229],[-6.071973,55.893115],[-6.041309,55.925635]]],[[[-6.138867,56.490625],[-6.310645,56.552148],[-6.319678,56.569434],[-6.30625,56.598779],[-6.18208,56.642969],[-6.102734,56.645654],[-6.02959,56.609814],[-5.94668,56.534521],[-5.836035,56.522559],[-5.76084,56.490674],[-5.777881,56.344336],[-6.176172,56.288721],[-6.313428,56.293652],[-6.32583,56.320947],[-6.298486,56.33916],[-6.184863,56.356885],[-6.138867,56.490625]]],[[[-6.483691,56.665771],[-6.607617,56.58501],[-6.664453,56.579443],[-6.668555,56.593604],[-6.569922,56.66123],[-6.483691,56.665771]]],[[[-7.406689,57.000293],[-7.398926,56.98335],[-7.416895,56.96543],[-7.504785,56.95166],[-7.542969,56.972363],[-7.522949,57.006787],[-7.455469,57.018945],[-7.406689,57.000293]]],[[[-6.278223,57.031396],[-6.260547,56.985254],[-6.30874,56.951807],[-6.383398,56.970898],[-6.432617,57.01792],[-6.322363,57.050537],[-6.278223,57.031396]]],[[[-7.422363,57.229346],[-7.410547,57.381104],[-7.267139,57.371777],[-7.249854,57.115332],[-7.347412,57.115137],[-7.381494,57.130664],[-7.422363,57.229346]]],[[[-6.067627,57.283545],[-5.880273,57.263232],[-5.706006,57.268945],[-5.672461,57.252686],[-5.668652,57.226904],[-5.91377,57.062646],[-5.987305,57.044434],[-6.014746,57.051953],[-6.034375,57.201221],[-6.162744,57.182129],[-6.266113,57.184326],[-6.322705,57.20249],[-6.442432,57.32749],[-6.675439,57.362891],[-6.761133,57.442383],[-6.704199,57.495752],[-6.643457,57.482617],[-6.583008,57.507129],[-6.616797,57.562695],[-6.378516,57.60332],[-6.357666,57.666797],[-6.305957,57.671973],[-6.246924,57.651221],[-6.166064,57.585303],[-6.144727,57.50498],[-6.16377,57.408838],[-6.135547,57.314258],[-6.067627,57.283545]]],[[[-7.499414,57.636328],[-7.440039,57.656396],[-7.391895,57.645215],[-7.324854,57.663135],[-7.271191,57.657471],[-7.205566,57.682959],[-7.092773,57.62666],[-7.182617,57.533301],[-7.320557,57.53374],[-7.514746,57.601953],[-7.499414,57.636328]]],[[[-6.436523,58.091895],[-6.403369,58.075879],[-6.402441,58.041357],[-6.425195,58.021289],[-6.578125,57.941357],[-6.683301,57.911035],[-6.796582,57.827539],[-6.85376,57.826514],[-6.956934,57.750049],[-7.013184,57.761768],[-7.083447,57.81377],[-6.955957,57.864893],[-6.944141,57.893652],[-6.856836,57.923535],[-7.05708,58.003174],[-6.985303,58.050488],[-7.076904,58.079004],[-7.095605,58.138281],[-7.085254,58.182178],[-7.012061,58.228711],[-6.949561,58.217676],[-6.88623,58.182568],[-6.812305,58.196094],[-6.726465,58.189404],[-6.787744,58.283887],[-6.776465,58.301514],[-6.237451,58.502832],[-6.194238,58.435107],[-6.198682,58.363281],[-6.32583,58.188867],[-6.375586,58.18457],[-6.419287,58.140967],[-6.55459,58.092871],[-6.436523,58.091895]]],[[[-1.515332,50.669775],[-1.563428,50.666113],[-1.515674,50.70332],[-1.38584,50.733545],[-1.312793,50.773486],[-1.144238,50.734717],[-1.065576,50.690234],[-1.149365,50.655713],[-1.196094,50.599219],[-1.251465,50.588818],[-1.306299,50.588525],[-1.515332,50.669775]]],[[[-4.373047,53.13418],[-4.418848,53.178027],[-4.471973,53.176367],[-4.553223,53.260449],[-4.567871,53.386475],[-4.461719,53.419287],[-4.315088,53.417236],[-4.154883,53.302832],[-4.049365,53.305762],[-4.084277,53.264307],[-4.373047,53.13418]]],[[[-3.293115,51.39043],[-3.562354,51.413818],[-3.762695,51.539941],[-3.890771,51.59165],[-3.943652,51.59751],[-4.115283,51.566406],[-4.23457,51.569092],[-4.173682,51.627344],[-4.091016,51.659912],[-4.276172,51.68252],[-4.386279,51.741064],[-4.600781,51.737646],[-4.717627,51.683691],[-4.902295,51.62627],[-5.124756,51.705859],[-5.168359,51.740723],[-5.167236,51.808057],[-5.200586,51.861377],[-5.262305,51.880176],[-5.18335,51.949658],[-5.088086,51.995898],[-4.878516,52.041846],[-4.383154,52.197314],[-4.149365,52.32627],[-4.050537,52.475146],[-3.980322,52.541748],[-4.048437,52.557617],[-4.078906,52.607861],[-4.070703,52.658838],[-4.039258,52.704053],[-4.117529,52.82002],[-4.101465,52.915479],[-4.356445,52.897412],[-4.583691,52.814941],[-4.683057,52.806152],[-4.681445,52.844141],[-4.63833,52.891113],[-4.405078,53.013818],[-4.328418,53.105127],[-4.268555,53.144531],[-4.111035,53.218945],[-3.764209,53.307617],[-3.645898,53.2979],[-3.326172,53.347168],[-3.097559,53.260303],[-3.165576,53.394678],[-3.064746,53.426855],[-2.918555,53.305371],[-2.86416,53.292578],[-2.749512,53.310205],[-2.913086,53.350244],[-2.969971,53.389209],[-3.0646,53.512842],[-3.059473,53.58623],[-2.925098,53.732764],[-3.031787,53.773584],[-3.045361,53.843848],[-3.026758,53.905908],[-2.899854,53.960693],[-2.862402,54.043848],[-2.846484,54.135303],[-2.867578,54.177246],[-2.993506,54.170508],[-3.109668,54.126318],[-3.165967,54.12793],[-3.321533,54.229102],[-3.569385,54.467578],[-3.592041,54.564355],[-3.4646,54.773096],[-3.26792,54.906592],[-3.03623,54.953076],[-3.434082,54.96377],[-3.550439,54.947412],[-3.658301,54.892871],[-3.783252,54.869922],[-3.95791,54.780957],[-4.132959,54.779248],[-4.208398,54.837158],[-4.253418,54.846777],[-4.51748,54.75835],[-4.818066,54.846143],[-4.889502,54.772266],[-4.91123,54.689453],[-5.032324,54.761377],[-5.135498,54.85752],[-5.170117,54.91792],[-5.172705,54.985889],[-5.116699,55.012256],[-5.055859,54.988135],[-4.965186,55.149463],[-4.721143,55.420996],[-4.676758,55.501318],[-4.684375,55.553906],[-4.72417,55.598291],[-4.891846,55.699121],[-4.87168,55.873926],[-4.826074,55.929541],[-4.584082,55.938672],[-4.844092,56.051172],[-4.800293,56.15835],[-4.9271,56.028076],[-5.092822,55.987305],[-5.11499,55.944629],[-5.19585,55.928662],[-5.2146,55.888867],[-5.228223,55.886328],[-5.245605,55.929248],[-5.247314,56.000391],[-5.222949,56.06582],[-5.176416,56.116992],[-4.996973,56.23335],[-5.282324,56.089941],[-5.383447,56.019238],[-5.418896,55.975244],[-5.3729,55.827686],[-5.38584,55.770117],[-5.556445,55.3896],[-5.58877,55.351416],[-5.646533,55.326855],[-5.730664,55.334131],[-5.768213,55.362646],[-5.7521,55.443457],[-5.681348,55.623975],[-5.605029,55.720752],[-5.504492,55.802393],[-5.573877,55.791699],[-5.622852,55.813135],[-5.60957,56.055273],[-5.555273,56.134961],[-5.534961,56.25083],[-5.391943,56.514795],[-5.329443,56.555908],[-5.312695,56.618799],[-5.188379,56.758057],[-5.652441,56.531982],[-5.864844,56.561865],[-5.936768,56.605713],[-5.968896,56.689893],[-6.057715,56.692139],[-6.133691,56.706689],[-6.132764,56.718018],[-6.034717,56.763916],[-5.877637,56.779639],[-5.730615,56.853076],[-5.861426,56.902686],[-5.736279,56.960645],[-5.591309,57.102344],[-5.561914,57.232715],[-5.656348,57.334082],[-5.794922,57.378809],[-5.818066,57.436084],[-5.801953,57.468018],[-5.756738,57.499219],[-5.581787,57.546777],[-5.67876,57.57168],[-5.714941,57.601074],[-5.744922,57.668311],[-5.694727,57.778223],[-5.60835,57.881348],[-5.349023,57.878076],[-5.319189,57.903613],[-5.289795,57.90459],[-5.157227,57.881348],[-5.413184,58.069727],[-5.351367,58.143701],[-5.355957,58.211914],[-5.338281,58.238721],[-5.008301,58.262646],[-5.080615,58.345166],[-5.090137,58.384521],[-5.066504,58.520215],[-5.016748,58.566553],[-4.975635,58.580322],[-4.924658,58.588379],[-4.809619,58.5729],[-4.71543,58.51001],[-4.491895,58.568457],[-4.433252,58.512842],[-4.188623,58.557227],[-3.453564,58.616895],[-3.259131,58.65],[-3.053076,58.634814],[-3.056982,58.58877],[-3.109668,58.515479],[-3.101123,58.433691],[-3.112891,58.408887],[-3.212354,58.32124],[-3.990039,57.959033],[-4.035596,57.852002],[-3.906836,57.839648],[-3.857129,57.818555],[-3.887939,57.786914],[-4.078418,57.677051],[-4.134521,57.577734],[-3.988477,57.58125],[-3.402783,57.708252],[-3.294531,57.710156],[-3.036035,57.672314],[-2.856299,57.692285],[-2.244141,57.680859],[-2.074072,57.702393],[-1.961523,57.67666],[-1.867383,57.612354],[-1.77793,57.49375],[-1.780664,57.474023],[-1.934473,57.352197],[-2.020312,57.258887],[-2.089551,57.102539],[-2.260254,56.86333],[-2.42666,56.730713],[-2.500977,56.636572],[-2.592676,56.561572],[-2.680957,56.514404],[-2.775195,56.482959],[-3.047412,56.449365],[-3.214453,56.383936],[-3.309961,56.363477],[-2.885156,56.39751],[-2.652734,56.318262],[-2.674268,56.253418],[-2.767578,56.202148],[-2.979785,56.194092],[-3.178223,56.080127],[-3.362256,56.027637],[-3.695117,56.06333],[-3.789062,56.095215],[-3.70415,56.043164],[-3.607812,56.016016],[-3.04873,55.951953],[-2.836865,56.02627],[-2.599316,56.027295],[-2.14707,55.902979],[-1.830273,55.671729],[-1.655371,55.570361],[-1.610156,55.498096],[-1.422656,55.026416],[-1.291748,54.773877],[-1.232422,54.703711],[-1.154395,54.654492],[-0.671387,54.503906],[-0.370361,54.279199],[-0.232861,54.190137],[-0.084375,54.118066],[-0.156299,54.080615],[-0.205566,54.021729],[-0.16875,53.94165],[0.115332,53.609277],[0.036084,53.640527],[-0.07373,53.643652],[-0.27002,53.736768],[-0.461377,53.716162],[-0.659912,53.724023],[-0.485059,53.694385],[-0.293701,53.692334],[0.12832,53.468262],[0.270996,53.335498],[0.355762,53.159961],[0.298047,53.081104],[0.045898,52.905615],[0.279785,52.808691],[0.381934,52.825195],[0.558789,52.966943],[0.704492,52.977246],[0.948535,52.953369],[1.055566,52.958984],[1.271289,52.924561],[1.382129,52.893506],[1.656738,52.753711],[1.716113,52.677246],[1.743359,52.578516],[1.746582,52.468994],[1.647363,52.278516],[1.591406,52.119775],[1.413477,51.994775],[1.316797,51.956934],[1.232422,51.97124],[1.227832,51.949121],[1.273828,51.9021],[1.274414,51.845361],[1.188477,51.803369],[1.101172,51.785449],[0.955078,51.807812],[0.752246,51.72959],[0.898047,51.689404],[0.927441,51.646631],[0.890918,51.571436],[0.799219,51.537891],[0.507227,51.501074],[0.424512,51.465625],[0.52832,51.484473],[0.600293,51.467969],[0.645508,51.404687],[0.686523,51.386572],[0.889355,51.359521],[1.257129,51.375098],[1.414941,51.363281],[1.397559,51.182031],[1.365527,51.155469],[1.044434,51.047266],[0.978613,50.97168],[0.960156,50.925879],[0.772363,50.933984],[0.684375,50.885547],[0.532324,50.853418],[0.299707,50.775977],[0.205078,50.763037],[-0.203906,50.814355],[-0.450781,50.810156],[-0.785254,50.76543],[-0.871387,50.772803],[-1.132861,50.84458],[-1.285059,50.857324],[-1.416455,50.896875],[-1.334473,50.820801],[-1.516748,50.747461],[-1.60083,50.732861],[-1.866016,50.715234],[-2.031055,50.725391],[-1.962061,50.627783],[-2.03584,50.603076],[-2.350146,50.637402],[-2.394678,50.630908],[-2.433447,50.599219],[-2.547754,50.616309],[-2.776953,50.705566],[-2.900879,50.722412],[-2.999414,50.716602],[-3.40459,50.632422],[-3.485449,50.547949],[-3.525879,50.428174],[-3.584375,50.321826],[-3.679785,50.239941],[-3.793359,50.229248],[-3.900195,50.285937],[-4.103418,50.348535],[-4.19458,50.393311],[-4.296973,50.359082],[-4.506689,50.341357],[-4.727979,50.290479],[-5.009521,50.160742],[-5.048633,50.134375],[-5.118506,50.03833],[-5.225244,50.021387],[-5.322852,50.082959],[-5.433984,50.104443],[-5.551221,50.083398],[-5.622119,50.050684],[-5.655176,50.077246],[-5.65625,50.131885],[-5.570654,50.196973],[-5.342285,50.246143],[-5.141797,50.37373],[-5.004443,50.495264],[-4.956396,50.523145],[-4.893555,50.533691],[-4.861279,50.582031],[-4.58291,50.776367],[-4.523096,50.977441],[-4.296484,51.027148],[-4.188184,51.188525],[-3.842334,51.230908],[-3.60791,51.228564],[-3.375098,51.196973],[-3.135986,51.205029],[-3.042041,51.248584],[-2.88125,51.405664],[-2.590283,51.608594],[-2.433057,51.740723],[-2.742139,51.581104],[-2.978516,51.538867],[-3.293115,51.39043]]],[[[-5.392676,55.618359],[-5.318115,55.70918],[-5.251611,55.716943],[-5.1604,55.666797],[-5.10498,55.573975],[-5.094727,55.494336],[-5.10542,55.448828],[-5.231494,55.448096],[-5.331494,55.481055],[-5.392676,55.618359]]],[[[-2.896436,58.827588],[-2.938965,58.738623],[-2.975391,58.756934],[-3.035449,58.822656],[-2.896436,58.827588]]],[[[-3.394727,58.909619],[-3.357422,58.918994],[-3.271924,58.905273],[-3.227637,58.857178],[-3.211621,58.813574],[-3.158545,58.801221],[-3.278809,58.781934],[-3.367188,58.839746],[-3.40083,58.881787],[-3.394727,58.909619]]],[[[-2.793018,58.906934],[-2.86377,58.890527],[-2.994824,58.939355],[-3.200781,58.925293],[-3.22334,58.93877],[-3.242139,58.999707],[-3.304346,58.967432],[-3.331641,58.97124],[-3.353711,59.01875],[-3.346826,59.06499],[-3.310352,59.130811],[-3.248584,59.143945],[-3.156494,59.136328],[-3.019238,59.076025],[-3.02002,59.057666],[-3.070703,59.00498],[-2.81792,58.981885],[-2.762451,58.955811],[-2.793018,58.906934]]],[[[-3.052051,59.323877],[-2.975537,59.347119],[-2.861621,59.28833],[-2.815039,59.24082],[-2.730664,59.226758],[-2.719922,59.219482],[-2.729395,59.186768],[-2.815234,59.161914],[-2.851855,59.182471],[-2.861426,59.246826],[-3.013477,59.291455],[-3.052051,59.323877]]],[[[-2.548877,59.231348],[-2.662061,59.230176],[-2.603613,59.289307],[-2.535645,59.30415],[-2.406982,59.297559],[-2.429834,59.271045],[-2.548877,59.231348]]],[[[-1.065674,60.381592],[-1.179248,60.113916],[-1.199316,60.006592],[-1.245312,59.97124],[-1.299463,59.878662],[-1.355859,59.911133],[-1.276172,60.114648],[-1.322803,60.188379],[-1.481494,60.173389],[-1.499121,60.221777],[-1.516602,60.231006],[-1.613037,60.229102],[-1.641357,60.236768],[-1.660059,60.262256],[-1.66377,60.28252],[-1.57666,60.298389],[-1.494434,60.29248],[-1.374609,60.33291],[-1.449561,60.468555],[-1.571777,60.494434],[-1.552637,60.517432],[-1.498145,60.529834],[-1.414209,60.59873],[-1.363965,60.60957],[-1.301709,60.607666],[-1.308105,60.5375],[-1.287402,60.467041],[-1.235742,60.485303],[-1.157764,60.417725],[-1.052441,60.444482],[-1.065674,60.381592]]],[[[-1.000342,60.658008],[-1.049023,60.646924],[-1.034229,60.530176],[-1.067871,60.502295],[-1.165527,60.603906],[-1.093311,60.720215],[-1.005615,60.716504],[-0.99165,60.686035],[-1.000342,60.658008]]],[[[-0.938086,60.745654],[-0.91582,60.810449],[-0.864941,60.805811],[-0.823437,60.831885],[-0.774268,60.811963],[-0.826172,60.716162],[-0.825488,60.683936],[-0.909131,60.687012],[-0.938086,60.745654]]]]}}]}; function landStyle(){ return { color: cssVar(‘–land-edge’), weight:0.8, fillColor: cssVar(‘–land’), fillOpacity:1 }; } let landLayer = L.geoJSON(UK_GEO,{style:landStyle,interactive:false}).addTo(map); map.getContainer().style.background = cssVar(‘–sea’); // —- point-in-polygon (ray casting) over the multipolygon —- const POLYS = UK_GEO.features[0].geometry.coordinates; // [ [ring0, hole1…], … ] function inRing(lon,lat,ring){ let inside=false; for(let i=0,j=ring.length-1;ilat)!==(yj>lat)) && (lon < (xj-xi)*(lat-yi)/(yj-yi)+xi); if(intersect) inside=!inside; } return inside; } function onLand(lon,lat){ for(const poly of POLYS){ if(inRing(lon,lat,poly[0])){ let inHole=false; for(let h=1;h({cat:d[0],name:d[1],place:d[2],lat:d[3],lon:d[4],note:d[5]})); const CANDIDATES = (function(){ const c=[]; for(let lat=50.0; lat<=61.0; lat+=0.2) for(let lon=-8.0; lonc.push([n.lat,n.lon])); return c; })(); function hav(aLat,aLon,bLat,bLon){ const R=6371, toR=Math.PI/180; const dLat=(bLat-aLat)*toR, dLon=(bLon-aLon)*toR; const la1=aLat*toR, la2=bLat*toR; const x=Math.sin(dLat/2)**2 + Math.cos(la1)*Math.cos(la2)*Math.sin(dLon/2)**2; return 2*R*Math.asin(Math.sqrt(x)); } // —- greedy set cover —- function greedyCover(targets, radiusKm){ if(!targets.length) return []; const cov = CANDIDATES.map(c=>{ const s=[]; for(let i=0;i<targets.length;i++){ if(hav(c[0],c[1],targets[i].lat,targets[i].lon)i)); const chosen=[]; let guard=0; while(uncovered.size && guard++<600){ let best=-1,bestCnt=0; for(let k=0;k<CANDIDATES.length;k++){ let cnt=0; const cv=cov[k]; for(let m=0;mbestCnt){bestCnt=cnt;best=k;} } if(bestcatLayers[c]=L.layerGroup().addTo(map)); const catState={}; Object.keys(CATS).forEach(c=>catState[c]=true); const markerIndex=[]; NODE_PTS.forEach(n=>{ const m=L.circleMarker([n.lat,n.lon],{radius:n.cat===’city’?4.5:5.5,color:’#ffffffaa’,weight:1,fillColor:cssVar(CATS[n.cat].var),fillOpacity:.95}); m.bindPopup(‘‘+esc(n.name)+(TIER1.has(n.name)?’ ★’:”)+’‘+esc(CATS[n.cat].label)+(n.place?’ · ‘+esc(n.place):”)+’‘+(n.note?’‘+esc(n.note)+’‘:”)); m.addTo(catLayers[n.cat]); markerIndex.push(Object.assign({marker:m},n)); }); // —- system ring layers —- const sysLayers={}; Object.keys(SYSTEMS).forEach(s=>sysLayers[s]=L.layerGroup().addTo(map)); const sysResult={}; // s -> array of battery [lat,lon] function drawSystem(s){ const layer=sysLayers[s]; layer.clearLayers(); const sys=SYSTEMS[s]; const col=cssVar(sys.var); const sites=sysResult[s]||[]; sites.forEach(pt=>{ sys.rings.forEach((rk,idx)=>{ L.circle([pt[0],pt[1]],{radius:rk*1000,color:col,weight:idx===sys.rings.length-1?1.4:1,opacity:.75, fillColor:col,fillOpacity:idx===sys.rings.length-1?0.06:0.0,dashArray:idx<sys.rings.length-1?'4 4':null}).addTo(layer); }); L.rectangle([[pt[0]-0.05,pt[1]-0.08],[pt[0]+0.05,pt[1]+0.08]],{color:'#fff',weight:1,fillColor:col,fillOpacity:1}) .bindPopup('‘+esc(sys.label)+’ battery
‘+pt[0].toFixed(2)+’°, ‘+pt[1].toFixed(2)+’°
‘) .addTo(layer); }); if(sys.on) layer.addTo(map); else map.removeLayer(layer); } function currentTargets(){ return NODE_PTS.filter(PSETS[activeSet].test); } // SHORAD is derived from the Sky Sabre (camm) laydown: each point-defence site hosts 2–4 SHORAD units const shoradLayer = L.layerGroup(); function deriveShorad(targets){ const cammSites = sysResult[‘camm’]||[]; shoradSites = cammSites.map(pt=>{ let covered=0, mega=false; targets.forEach(t=>{ if(hav(pt[0],pt[1],t.lat,t.lon)=2?3:2); return {lat:pt[0],lon:pt[1],units,covered}; }); } function drawShorad(){ shoradLayer.clearLayers(); const col=cssVar(SHORAD.vcol); shoradSites.forEach(s=>{ L.circle([s.lat,s.lon],{radius:SHORAD.range*1000,color:col,weight:1,opacity:.85,fillColor:col,fillOpacity:0.12}).addTo(shoradLayer); L.circleMarker([s.lat,s.lon],{radius:2.5,color:col,weight:0,fillColor:col,fillOpacity:1}) .bindTooltip(‘×’+s.units,{permanent:true,direction:’right’,offset:[4,0],className:’shorad-tt’}) .addTo(shoradLayer); }); if(SHORAD.on) shoradLayer.addTo(map); else map.removeLayer(shoradLayer); } function shoradTotal(){ return shoradSites.reduce((a,s)=>a+s.units,0); } function recompute(){ const targets=currentTargets(); Object.keys(SYSTEMS).forEach(s=>{ sysResult[s] = (s===’camm’) ? targets.map(t=>[t.lat,t.lon]) : greedyCover(targets, SYSTEMS[s].radius); drawSystem(s); }); deriveShorad(targets); drawShorad(); renderCounts(targets.length); } // —- UI: results card —- function renderCounts(nTargets){ document.getElementById(‘setLabel’).textContent=PSETS[activeSet].label; document.getElementById(‘setCount’).textContent=’to cover ‘+nTargets+’ defended point’+(nTargets===1?”:’s’); const host=document.getElementById(‘syscounts’); host.innerHTML=”; // order: camm, patriot, thaad (short→long) for readability [‘camm’,’patriot’,’thaad’].forEach(s=>{ const sys=SYSTEMS[s]; const col=cssVar(sys.var); const sites=(sysResult[s]||[]).length; const n=(s===’camm’)?sites*2:sites; const unit=(s===’camm’)?’launch units’:’×’; const row=document.createElement(‘div’); row.className=’syscount’; row.innerHTML=’‘+ ‘‘+sys.label+’‘+sys.radius+’ km · ‘+sys.sub+’‘+ ‘‘+n+’‘+unit+’‘; host.appendChild(row); }); const scol=cssVar(SHORAD.vcol), su=shoradTotal(), ss=shoradSites.length; const srow=document.createElement(‘div’); srow.className=’syscount’; srow.innerHTML=’‘+ ‘‘+SHORAD.label+’‘+ss+’ sites × 2–4 units‘+ ‘‘+su+’units‘; host.appendChild(srow); const foot=document.createElement(‘div’); foot.style.cssText=’margin-top:9px;padding-top:9px;border-top:1px solid var(–panel-edge);font-size:10px;line-height:1.5;color:var(–ink-soft)’; foot.innerHTML=’Recommended procurement — Sky Sabre 72 launch units (32 UK point defence + 24 field army + 12 overseas + 4 spare); SHORAD ~200 incl. Stormer replacement.’; host.appendChild(foot); } // —- UI: system controls —- const sysBody=document.getElementById(‘sysBody’); [‘thaad’,’patriot’,’camm’].forEach(s=>{ const sys=SYSTEMS[s]; const col=cssVar(sys.var); const row=document.createElement(‘div’); row.className=’sysrow’; row.style.setProperty(‘–sysclr’,col); row.innerHTML= ‘
‘+ ‘‘+ ‘‘+ ‘‘+sys.label+’‘+sys.sub+’‘+ ‘
‘+ ‘
range km‘+ ‘needs –
‘; sysBody.appendChild(row); }); sysBody.querySelectorAll(‘input[type=checkbox]’).forEach(cb=>{ cb.addEventListener(‘change’,e=>{ const s=e.target.dataset.sys; if(!s||!SYSTEMS[s])return; SYSTEMS[s].on=e.target.checked; drawSystem(s); }); }); sysBody.querySelectorAll(‘input[data-rng]’).forEach(inp=>{ inp.addEventListener(‘change’,e=>{ const s=e.target.dataset.rng; let v=parseFloat(e.target.value)||SYSTEMS[s].radius; v=Math.max(5,Math.min(400,v)); e.target.value=v; SYSTEMS[s].radius=v; SYSTEMS[s].rings = s===’camm’ ? [Math.min(25,v), v] : [v]; recompute(); refreshReq(); }); }); // SHORAD derived control row (function(){ const col=cssVar(SHORAD.vcol); const row=document.createElement(‘div’); row.className=’sysrow’; row.style.setProperty(‘–sysclr’,col); row.innerHTML= ‘
‘+ ‘‘+ ‘‘+ ‘‘+SHORAD.label+’on each Sky Sabre site‘+ ‘
‘+ ‘
bubble km‘+ ‘total –
‘; sysBody.appendChild(row); row.querySelector(‘[data-shorad]’).addEventListener(‘change’,e=>{ SHORAD.on=e.target.checked; drawShorad(); }); row.querySelector(‘[data-srng]’).addEventListener(‘change’,e=>{ let v=parseFloat(e.target.value)||SHORAD.range; v=Math.max(3,Math.min(30,v)); e.target.value=v; SHORAD.range=v; drawShorad(); }); })(); function refreshReq(){ Object.keys(SYSTEMS).forEach(s=>{ const b=sysBody.querySelector(‘[data-req="’+s+’"]’); if(b){ const k=(sysResult[s]||[]).length; b.textContent=(s===’camm’)?k*2:k; } }); const sb=sysBody.querySelector(‘[data-sreq]’); if(sb) sb.textContent=shoradTotal(); } // —- UI: priority set —- const setBody=document.getElementById(‘setBody’); Object.keys(PSETS).forEach(k=>{ const n=NODE_PTS.filter(PSETS[k].test).length; const lab=document.createElement(‘label’); lab.className=’optrow’; lab.innerHTML=”+ ‘‘+PSETS[k].label+’‘+n+’‘; lab.querySelector(‘input’).addEventListener(‘change’,()=>{ activeSet=k; recompute(); refreshReq(); }); setBody.appendChild(lab); }); // —- UI: category legend —- const legend=document.getElementById(‘legend’); Object.keys(CATS).forEach(cat=>{ const row=document.createElement(‘div’); row.className=’legrow’; row.dataset.cat=cat; row.innerHTML=’‘+CATS[cat].label+’‘+CATS[cat].n+’‘; row.addEventListener(‘click’,()=>toggleCat(cat)); legend.appendChild(row); }); function toggleCat(cat){ catState[cat]=!catState[cat]; if(catState[cat])catLayers[cat].addTo(map); else map.removeLayer(catLayers[cat]); document.querySelector(‘.legrow[data-cat="’+cat+’"]’).classList.toggle(‘off’,!catState[cat]); } document.getElementById(‘allOn’).addEventListener(‘click’,()=>Object.keys(CATS).forEach(c=>{if(!catState[c])toggleCat(c);})); document.getElementById(‘allOff’).addEventListener(‘click’,()=>Object.keys(CATS).forEach(c=>{if(catState[c])toggleCat(c);})); // —- section collapse —- document.querySelectorAll(‘.sect .shead’).forEach(h=>h.addEventListener(‘click’,()=>h.parentElement.classList.toggle(‘collapsed’))); // —- list drawer —- const listbody=document.getElementById(‘listbody’); function buildList(filter){ listbody.innerHTML=”; const f=(filter||”).trim().toLowerCase(); Object.keys(CATS).forEach(cat=>{ const items=markerIndex.filter(x=>x.cat===cat && (!f||(x.name+’ ‘+x.place).toLowerCase().includes(f))); if(!items.length) return; const block=document.createElement(‘div’); block.className=’catblock’; const h=document.createElement(‘h3′); h.innerHTML=’‘+CATS[cat].label+’‘+items.length+’‘; block.appendChild(h); items.forEach(x=>{ const d=document.createElement(‘div’); d.className=’item’; d.innerHTML=’‘+esc(x.name)+’‘+(TIER1.has(x.name)?’T1‘:”)+(x.place?’‘+esc(x.place)+’‘:”)+(x.note?’— ‘+esc(x.note)+’‘:”); d.addEventListener(‘click’,()=>{ if(!catState[cat])toggleCat(cat); map.setView([x.lat,x.lon],9,{animate:true}); x.marker.openPopup(); closeDrawer(); }); block.appendChild(d); }); listbody.appendChild(block); }); } const drawer=document.getElementById(‘drawer’); function openDrawer(){drawer.classList.add(‘open’);} function closeDrawer(){drawer.classList.remove(‘open’);} document.getElementById(‘listbtn’).addEventListener(‘click’,openDrawer); document.getElementById(‘closeDrawer’).addEventListener(‘click’,closeDrawer); document.getElementById(‘search’).addEventListener(‘input’,e=>buildList(e.target.value)); // —- theme refresh —- function refreshTheme(){ landLayer.setStyle(landStyle()); map.getContainer().style.background=cssVar(‘–sea’); markerIndex.forEach(x=>x.marker.setStyle({fillColor:cssVar(CATS[x.cat].var)})); document.querySelectorAll(‘.legrow’).forEach(r=>{const d=r.querySelector(‘.dot’); if(d)d.style.background=cssVar(CATS[r.dataset.cat].var);}); Object.keys(SYSTEMS).forEach(s=>drawSystem(s)); drawShorad(); renderCounts(currentTargets().length); buildList(document.getElementById(‘search’).value); } try{ window.matchMedia(‘(prefers-color-scheme: dark)’).addEventListener(‘change’,refreshTheme); new MutationObserver(refreshTheme).observe(document.documentElement,{attributes:true,attributeFilter:[‘data-theme’]}); }catch(e){} // —- init —- buildList(”); recompute(); refreshReq(); })(); “>

Leave a Reply