diff --git a/internal/check-leaf-hints.mjs b/internal/check-leaf-hints.mjs index 7a49e9656..d00123535 100644 --- a/internal/check-leaf-hints.mjs +++ b/internal/check-leaf-hints.mjs @@ -47,7 +47,7 @@ const ENGINE_RE = /useMapInstance|useMapProvider|mapbox-gl|maplibre-gl|window\.( // the gate and the generator cannot drift. const manifest = JSON.parse(readFileSync(join(TREE, 'manifest.json'), 'utf8')) const engineBundles = new Map() -function bundleLoadsEngine(bundle) { +function oneBundleLoadsEngine(bundle) { if (!engineBundles.has(bundle)) { let hit = false try { hit = ENGINE_RE.test(readFileSync(join(TREE, bundle, `${bundle}.js`), 'utf8')) } catch { hit = false } @@ -55,13 +55,27 @@ function bundleLoadsEngine(bundle) { } return engineBundles.get(bundle) } +// Element tag → owning bundle (mirrors generate-tree): a composes entry may name a child by element tag. +const elementToBundle = new Map() +for (const b of manifest.bundles || []) for (const e of (b.elements || [])) elementToBundle.set(e, b.bundle) +// This bundle OR any bundle it composes loads an engine (mirrors generate-tree's builtBundleLoadsEngine): +// catches a composite whose engine lives in a lazily-fetched child (research-map-plus-grid → doxa-research-map). +function bundleLoadsEngine(bundle, composes) { + if (oneBundleLoadsEngine(bundle)) return true + for (const c of composes || []) { + const tag = String(c).split('/').pop() + const child = elementToBundle.get(tag) || String(c).split('/')[0] + if (child && child !== bundle && oneBundleLoadsEngine(child)) return true + } + return false +} // Expected hint state per profile, and the leaf dirs it renders to (profile page + any instance pages). const expect = new Map() // "/" -> boolean shouldHint for (const b of manifest.bundles || []) { for (const p of b.profiles || []) { const shell = p.type === 'nested-mfe-spa' const composite = p.type === 'nested-elements-mfe' - const shouldHint = (!!p.isMap || (composite && bundleLoadsEngine(b.bundle))) && !shell + const shouldHint = (!!p.isMap || (composite && bundleLoadsEngine(b.bundle, b.composes))) && !shell expect.set(`${b.bundle}/${p.profile}`, shouldHint) } } diff --git a/internal/generate-tree.mjs b/internal/generate-tree.mjs index 8b849290f..c178a03e1 100644 --- a/internal/generate-tree.mjs +++ b/internal/generate-tree.mjs @@ -884,14 +884,35 @@ function resourceHints({ isMapLibre, config, apiBaseUrl }) { return lines.length ? ` \n${lines.join('\n')}\n` : '' } -// Does a bundle's BUILT .js reference a map engine? The directly verifiable signal for A9 leaf hints -// (below), read from public///.js with the same regex the source classifier uses. -// This catches a composite whose own bundle mounts a map inline even when its profile is isMap:false; -// it does not catch one whose engine loads only in a lazily-fetched child bundle (see the hint comment). -function builtBundleLoadsEngine(bundleName) { +// Does this BUILT bundle .js reference a map engine? Read from public///.js with the +// same regex the source classifier uses — the directly verifiable A9-leaf-hint signal. +function oneBundleLoadsEngine(bundleName) { try { return MAP_ENGINE_RE.test(readFileSync(join(DEFAULT_ROOT, bundleName, `${bundleName}.js`), 'utf8')) } catch { return false } } +// Element tag → owning bundle, built once from the scanned bundles so a composes entry that names a +// child by its ELEMENT tag (stack-demo composes "research-dashboard-map", whose bundle is +// "research-dashboard") resolves to the right bundle, not a non-existent dir. +let ELEMENT_TO_BUNDLE = null +function setElementToBundle(bundles) { + ELEMENT_TO_BUNDLE = new Map() + for (const b of bundles) for (const e of (b.elements || [])) ELEMENT_TO_BUNDLE.set(e, b.bundle) +} +// Does a leaf's PAGE end up loading an engine? True if its own bundle does, OR any bundle it `composes` +// does — the latter catches a composite whose engine lives in a lazily-fetched child (research-map-plus-grid +// composes doxa-research-map: its own bundle has 0 engine refs, the child's has 74). A `composes` entry is +// "/", a bare bundle, or an element TAG — resolved to a bundle via ELEMENT_TO_BUNDLE, then +// the bundle's first segment. Verifiable from built files, so the gate can mirror it. Excludes a composite +// that composes only non-maps (big-picture). +function builtBundleLoadsEngine(bundleName, composes) { + if (oneBundleLoadsEngine(bundleName)) return true + for (const c of composes || []) { + const tag = String(c).split('/').pop() + const child = (ELEMENT_TO_BUNDLE && ELEMENT_TO_BUNDLE.get(tag)) || String(c).split('/')[0] + if (child && child !== bundleName && oneBundleLoadsEngine(child)) return true + } + return false +} function mapPageHtml(opts) { const { title, tag, config, jsSrc, apiBaseUrl, tokenUrlExpr, bakedToken, integrity, shellTokenFree, isMap, scrollPage, isComposite, bundleLoadsEngine } = opts @@ -938,20 +959,17 @@ function mapPageHtml(opts) { // integrity and crossorigin from library/constants/cdn.js so it cannot drift from the runtime tag. // WHO GETS HINTS: any page whose OWN bundle loads a map engine — the directly verifiable signal // (`bundleLoadsEngine`, an engine reference in the built .js), NOT the leaf's `isMap` flag. rega's A9 - // net run found regions-mfe (isMap:false, but 33 engine refs in its bundle) opening cdn.jsdelivr.net + + // net run found regions-mfe (isMap:false, 56 engine refs in its bundle) AND research-map-plus-grid + // (isMap:false, own bundle 0 refs but composes doxa-research-map, 74 refs) opening cdn.jsdelivr.net + // tiles.openfreemap.org from the top page and getting no hints — my first cut keyed on isMap and missed - // it, the same trap check:leaf-engine-per-provider's isMap gate fell into. Keying on the built bundle - // hints regions-mfe and excludes the genuinely map-less composites (big-picture, stack-demo: 0 engine - // refs), with no false positives. A cap-5 nested-mfe-spa shell (shellTokenFree) is excluded even if it - // somehow references an engine: its nested maps render in their OWN iframe leaves, which carry hints. - // KNOWN GAP: a composite whose engine loads only inside a LAZILY-fetched child bundle (research-map-plus-grid - // composes doxa-research-map; its own bundle has 0 engine refs) is not hinted — the top page's own bytes - // don't name the engine. Recorded in the A9 report; the deeper fix is the upstream isMap classifier, - // which mislabels these composites isMap:false (composes-by-tag where the child .vue filename differs). - // A plain non-map leaf (a list/card) can SHARE a bundle with a map leaf (connectivity-list rides the - // cities-internet bundle, which loads an engine for connectivity-map) — so the bundle signal alone - // over-hints it. The engine only mounts in-page for a real map leaf (drawsMap) or a cap-4 composite - // (isComposite) that stacks a map child; a non-map, non-composite leaf never opens the engine itself. + // both, the same trap check:leaf-engine-per-provider's isMap gate fell into. bundleLoadsEngine is true + // when the leaf's own bundle OR any bundle it composes loads an engine, so both composites are covered; + // a composite that composes only non-maps (big-picture) stays out. A cap-5 nested-mfe-spa shell + // (shellTokenFree) is excluded even if it references an engine: its maps render in their OWN iframe + // leaves, which carry hints. A plain non-map leaf (a list/card) can SHARE a bundle with a map leaf + // (connectivity-list rides the cities-internet bundle) — so the `isComposite &&` guard keeps the bundle + // signal from over-hinting it: the engine only mounts in-page for a real map leaf (drawsMap) or a cap-4 + // composite (isComposite) that stacks a map child; a non-map, non-composite leaf never opens it. const drawsMapInPage = (drawsMap || (isComposite && bundleLoadsEngine)) && !shellTokenFree const hintBlock = drawsMapInPage ? resourceHints({ isMapLibre, config, apiBaseUrl }) : '' const peerBlock = shellOnly @@ -1261,7 +1279,7 @@ function profileHtml(b, profile, tokenUrlExpr, bakedToken) { // non-map leaf renders token-free with no map peer; only a real map runs the token ladder. isMap: profile.isMap, // Whether this bundle's OWN built .js loads a map engine — the A9-leaf-hint signal (mapPageHtml). - bundleLoadsEngine: builtBundleLoadsEngine(b.bundle), + bundleLoadsEngine: builtBundleLoadsEngine(b.bundle, b.composes), // A cap-4 composite (nested-elements-mfe) is a StackLayout SCROLL-STACK: its leaf must let the // DOCUMENT own the scroll (height:auto, no position:fixed) so the page grows and a reader scrolls // PAST one section to the next. A fixed-viewport leaf traps a 100vh dashboard and nothing scrolls @@ -1297,7 +1315,7 @@ function instanceHtml(b, profile, inst, tokenUrlExpr, bakedToken) { // non-map (token-free, no peer); a preset of a real map still runs the token ladder. isMap: profile.isMap, // Same bundle as the profile page, so the same engine signal (A9-leaf-hint, mapPageHtml). - bundleLoadsEngine: builtBundleLoadsEngine(b.bundle), + bundleLoadsEngine: builtBundleLoadsEngine(b.bundle, b.composes), // A preset of a cap-4 composite scroll-stack is still a scroll page (see profileHtml). scrollPage: profile.type === 'nested-elements-mfe', }) @@ -1613,6 +1631,7 @@ function readDestinations() { } function writeManifestAndHtml(root, bundles, tokenUrlExpr, bakedToken) { + setElementToBundle(bundles) // for builtBundleLoadsEngine's tag→bundle resolution (A9 leaf hints) // ── DERIVE THE COMPOSITION TIER FROM THE EDGES, BEFORE ANYTHING READS THE MANIFEST ────────── // Every consumer downstream — the gallery's capFor, the studio rail, check:composite-embed-knobs — // trusts profile.type. Deriving here means a composite can no longer ship understated because its diff --git a/public/dx-maps/all-people-groups/all-people-groups/index.html b/public/dx-maps/all-people-groups/all-people-groups/index.html index 13c80e6f8..35f43d65c 100644 --- a/public/dx-maps/all-people-groups/all-people-groups/index.html +++ b/public/dx-maps/all-people-groups/all-people-groups/index.html @@ -11,7 +11,7 @@ all-people-groups · all-people-groups - + diff --git a/public/dx-maps/cities-internet/connectivity-map/index.html b/public/dx-maps/cities-internet/connectivity-map/index.html index 6afe275a7..cb0cfb0c4 100644 --- a/public/dx-maps/cities-internet/connectivity-map/index.html +++ b/public/dx-maps/cities-internet/connectivity-map/index.html @@ -11,7 +11,7 @@ connectivity-map · cities-internet - + diff --git a/public/dx-maps/country-map/country-map/index.html b/public/dx-maps/country-map/country-map/index.html index 240411590..680696953 100644 --- a/public/dx-maps/country-map/country-map/index.html +++ b/public/dx-maps/country-map/country-map/index.html @@ -11,7 +11,7 @@ country-map · country-map - + diff --git a/public/dx-maps/country-posters/countries-map/index.html b/public/dx-maps/country-posters/countries-map/index.html index 3aba54c13..6ffe5924b 100644 --- a/public/dx-maps/country-posters/countries-map/index.html +++ b/public/dx-maps/country-posters/countries-map/index.html @@ -11,7 +11,7 @@ countries-map · country-posters - + diff --git a/public/dx-maps/country-posters/country-posters-mfe/index.html b/public/dx-maps/country-posters/country-posters-mfe/index.html index 35302bde3..06f061fed 100644 --- a/public/dx-maps/country-posters/country-posters-mfe/index.html +++ b/public/dx-maps/country-posters/country-posters-mfe/index.html @@ -11,7 +11,7 @@ country-posters-mfe · country-posters - + diff --git a/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/default/index.html b/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/default/index.html index 7496e4a27..594c9016e 100644 --- a/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/default/index.html +++ b/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/default/index.html @@ -11,7 +11,7 @@ default · dashboard-plus-grid - + diff --git a/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/index.html b/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/index.html index 62c5f9ca0..1fde76485 100644 --- a/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/index.html +++ b/public/dx-maps/dashboard-plus-grid/dashboard-plus-grid/index.html @@ -11,7 +11,7 @@ dashboard-plus-grid · dashboard-plus-grid - + diff --git a/public/dx-maps/demo-map/demo-map/index.html b/public/dx-maps/demo-map/demo-map/index.html index 7222b7779..a477fb3a8 100644 --- a/public/dx-maps/demo-map/demo-map/index.html +++ b/public/dx-maps/demo-map/demo-map/index.html @@ -11,7 +11,7 @@ demo-map · demo-map - + diff --git a/public/dx-maps/demo-map/demo-map/maplibre/index.html b/public/dx-maps/demo-map/demo-map/maplibre/index.html index 96656dc2b..b970e0b95 100644 --- a/public/dx-maps/demo-map/demo-map/maplibre/index.html +++ b/public/dx-maps/demo-map/demo-map/maplibre/index.html @@ -11,7 +11,7 @@ Demo map — MapLibre (token-free) · demo-map - + diff --git a/public/dx-maps/doxa-research-map/research-map/index.html b/public/dx-maps/doxa-research-map/research-map/index.html index 5dc98edcb..a427b9c8b 100644 --- a/public/dx-maps/doxa-research-map/research-map/index.html +++ b/public/dx-maps/doxa-research-map/research-map/index.html @@ -11,7 +11,7 @@ research-map · doxa-research-map - + diff --git a/public/dx-maps/doxa-research-map/research-map/maplibre/index.html b/public/dx-maps/doxa-research-map/research-map/maplibre/index.html index 14d189a40..125eade2a 100644 --- a/public/dx-maps/doxa-research-map/research-map/maplibre/index.html +++ b/public/dx-maps/doxa-research-map/research-map/maplibre/index.html @@ -11,7 +11,7 @@ Research map — MapLibre (token-free, no search bar) · doxa-research-map - + diff --git a/public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html b/public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html index 394daab73..47ab232b8 100644 --- a/public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html +++ b/public/dx-maps/doxa-simple-map/doxa-simple-map/adoption/index.html @@ -11,7 +11,7 @@ Adoption Map · doxa-simple-map - + diff --git a/public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html b/public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html index bfe189ff5..1d0e19b8f 100644 --- a/public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html +++ b/public/dx-maps/doxa-simple-map/doxa-simple-map/engagement/index.html @@ -11,7 +11,7 @@ Engagement Map · doxa-simple-map - + diff --git a/public/dx-maps/doxa-simple-map/doxa-simple-map/index.html b/public/dx-maps/doxa-simple-map/doxa-simple-map/index.html index 98214c59a..f2b7a9fc8 100644 --- a/public/dx-maps/doxa-simple-map/doxa-simple-map/index.html +++ b/public/dx-maps/doxa-simple-map/doxa-simple-map/index.html @@ -11,7 +11,7 @@ doxa-simple-map · doxa-simple-map - + diff --git a/public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html b/public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html index e3f9e7a72..7ef03e009 100644 --- a/public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html +++ b/public/dx-maps/doxa-simple-map/doxa-simple-map/prayer/index.html @@ -11,7 +11,7 @@ Prayer Map · doxa-simple-map - + diff --git a/public/dx-maps/gospel-internet/board/board/index.html b/public/dx-maps/gospel-internet/board/board/index.html index 499f25c87..8a22680ed 100644 --- a/public/dx-maps/gospel-internet/board/board/index.html +++ b/public/dx-maps/gospel-internet/board/board/index.html @@ -11,7 +11,7 @@ Gospel x Internet — the board · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/index.html b/public/dx-maps/gospel-internet/board/index.html index 3384e49a4..e980b8d6e 100644 --- a/public/dx-maps/gospel-internet/board/index.html +++ b/public/dx-maps/gospel-internet/board/index.html @@ -11,7 +11,7 @@ board · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/india-china/index.html b/public/dx-maps/gospel-internet/board/india-china/index.html index f8c55c49a..17a9bb141 100644 --- a/public/dx-maps/gospel-internet/board/india-china/index.html +++ b/public/dx-maps/gospel-internet/board/india-china/index.html @@ -11,7 +11,7 @@ India and China by state and province · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/language-tree/index.html b/public/dx-maps/gospel-internet/board/language-tree/index.html index 991b96ca8..a649be0ae 100644 --- a/public/dx-maps/gospel-internet/board/language-tree/index.html +++ b/public/dx-maps/gospel-internet/board/language-tree/index.html @@ -11,7 +11,7 @@ Language tree — which languages have the gospel, family by family · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/platforms/index.html b/public/dx-maps/gospel-internet/board/platforms/index.html index ee69e9813..ac08b86c3 100644 --- a/public/dx-maps/gospel-internet/board/platforms/index.html +++ b/public/dx-maps/gospel-internet/board/platforms/index.html @@ -11,7 +11,7 @@ Platforms — which apps would carry a resource there · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/project-700/index.html b/public/dx-maps/gospel-internet/board/project-700/index.html index d0fc1391f..31ef937cf 100644 --- a/public/dx-maps/gospel-internet/board/project-700/index.html +++ b/public/dx-maps/gospel-internet/board/project-700/index.html @@ -11,7 +11,7 @@ Project 700 — the list as a partner embed · gospel-internet - + diff --git a/public/dx-maps/gospel-internet/board/zero/index.html b/public/dx-maps/gospel-internet/board/zero/index.html index c6961c6c5..a30f2694b 100644 --- a/public/dx-maps/gospel-internet/board/zero/index.html +++ b/public/dx-maps/gospel-internet/board/zero/index.html @@ -11,7 +11,7 @@ Nothing in their own language — the front door · gospel-internet - + diff --git a/public/dx-maps/gospel-resources/gospel-dashboard/index.html b/public/dx-maps/gospel-resources/gospel-dashboard/index.html index 2cb8ad13b..f1f7c9303 100644 --- a/public/dx-maps/gospel-resources/gospel-dashboard/index.html +++ b/public/dx-maps/gospel-resources/gospel-dashboard/index.html @@ -11,7 +11,7 @@ gospel-dashboard · gospel-resources - + diff --git a/public/dx-maps/gospel-resources/resources-map/index.html b/public/dx-maps/gospel-resources/resources-map/index.html index 3bac78293..14c9c63f2 100644 --- a/public/dx-maps/gospel-resources/resources-map/index.html +++ b/public/dx-maps/gospel-resources/resources-map/index.html @@ -11,7 +11,7 @@ resources-map · gospel-resources - + diff --git a/public/dx-maps/my-upg-100-list/upg-100-list/index.html b/public/dx-maps/my-upg-100-list/upg-100-list/index.html index 1c6f99cf3..16e9d5afe 100644 --- a/public/dx-maps/my-upg-100-list/upg-100-list/index.html +++ b/public/dx-maps/my-upg-100-list/upg-100-list/index.html @@ -11,7 +11,7 @@ upg-100-list · my-upg-100-list - + diff --git a/public/dx-maps/my-upg-100-list/upg-100-mfe/index.html b/public/dx-maps/my-upg-100-list/upg-100-mfe/index.html index 6fe972807..a38b6d0e6 100644 --- a/public/dx-maps/my-upg-100-list/upg-100-mfe/index.html +++ b/public/dx-maps/my-upg-100-list/upg-100-mfe/index.html @@ -11,7 +11,7 @@ upg-100-mfe · my-upg-100-list - + diff --git a/public/dx-maps/pplr-data-maps/pplr-data-maps/index.html b/public/dx-maps/pplr-data-maps/pplr-data-maps/index.html index fb715c62b..4dc6408e4 100644 --- a/public/dx-maps/pplr-data-maps/pplr-data-maps/index.html +++ b/public/dx-maps/pplr-data-maps/pplr-data-maps/index.html @@ -11,7 +11,7 @@ pplr-data-maps · pplr-data-maps - + diff --git a/public/dx-maps/prayer-walk-planner/prayer-walk-planner/index.html b/public/dx-maps/prayer-walk-planner/prayer-walk-planner/index.html index eb130ca63..1fcf456e6 100644 --- a/public/dx-maps/prayer-walk-planner/prayer-walk-planner/index.html +++ b/public/dx-maps/prayer-walk-planner/prayer-walk-planner/index.html @@ -11,7 +11,7 @@ prayer-walk-planner · prayer-walk-planner - + diff --git a/public/dx-maps/regions-dashboard/region-dashboards/index.html b/public/dx-maps/regions-dashboard/region-dashboards/index.html index b76a0807b..0e90d022a 100644 --- a/public/dx-maps/regions-dashboard/region-dashboards/index.html +++ b/public/dx-maps/regions-dashboard/region-dashboards/index.html @@ -11,7 +11,7 @@ region-dashboards · regions-dashboard - + diff --git a/public/dx-maps/regions-dashboard/regions-mfe/index.html b/public/dx-maps/regions-dashboard/regions-mfe/index.html index f485971bf..5b73230a1 100644 --- a/public/dx-maps/regions-dashboard/regions-mfe/index.html +++ b/public/dx-maps/regions-dashboard/regions-mfe/index.html @@ -11,7 +11,7 @@ regions-mfe · regions-dashboard - + diff --git a/public/dx-maps/research-dashboard/research-dashboard/index.html b/public/dx-maps/research-dashboard/research-dashboard/index.html index f1f5eb57d..d2c0bba03 100644 --- a/public/dx-maps/research-dashboard/research-dashboard/index.html +++ b/public/dx-maps/research-dashboard/research-dashboard/index.html @@ -11,7 +11,7 @@ research-dashboard · research-dashboard - + diff --git a/public/dx-maps/research-map-plus-grid/research-map-plus-grid/default/index.html b/public/dx-maps/research-map-plus-grid/research-map-plus-grid/default/index.html index c41d953c9..a071a14cc 100644 --- a/public/dx-maps/research-map-plus-grid/research-map-plus-grid/default/index.html +++ b/public/dx-maps/research-map-plus-grid/research-map-plus-grid/default/index.html @@ -11,6 +11,11 @@ default · research-map-plus-grid + + + + + + + + + + + + + + + + + + diff --git a/public/dx-maps/upg-neighbor/upg-neighbor/flower-mesh/index.html b/public/dx-maps/upg-neighbor/upg-neighbor/flower-mesh/index.html index 7790184eb..69f9d1b5c 100644 --- a/public/dx-maps/upg-neighbor/upg-neighbor/flower-mesh/index.html +++ b/public/dx-maps/upg-neighbor/upg-neighbor/flower-mesh/index.html @@ -11,7 +11,7 @@ Mobilize near neighbors · upg-neighbor - + diff --git a/public/dx-maps/upg-neighbor/upg-neighbor/index.html b/public/dx-maps/upg-neighbor/upg-neighbor/index.html index 526b6c3b0..f4837d15e 100644 --- a/public/dx-maps/upg-neighbor/upg-neighbor/index.html +++ b/public/dx-maps/upg-neighbor/upg-neighbor/index.html @@ -11,7 +11,7 @@ upg-neighbor · upg-neighbor - + diff --git a/public/dx-maps/upg-neighbor/upg-neighbor/lang-cluster/index.html b/public/dx-maps/upg-neighbor/upg-neighbor/lang-cluster/index.html index 09565250e..2e75e4794 100644 --- a/public/dx-maps/upg-neighbor/upg-neighbor/lang-cluster/index.html +++ b/public/dx-maps/upg-neighbor/upg-neighbor/lang-cluster/index.html @@ -11,7 +11,7 @@ Bridge-language campaigns · upg-neighbor - + diff --git a/public/dx-maps/upg-neighbor/upg-neighbor/send-map/index.html b/public/dx-maps/upg-neighbor/upg-neighbor/send-map/index.html index 7790184eb..69f9d1b5c 100644 --- a/public/dx-maps/upg-neighbor/upg-neighbor/send-map/index.html +++ b/public/dx-maps/upg-neighbor/upg-neighbor/send-map/index.html @@ -11,7 +11,7 @@ Mobilize near neighbors · upg-neighbor - + diff --git a/public/dx-maps/upg-neighbor/upg-neighbor/upg-neighbors/index.html b/public/dx-maps/upg-neighbor/upg-neighbor/upg-neighbors/index.html index f7757b80f..1e1bd781d 100644 --- a/public/dx-maps/upg-neighbor/upg-neighbor/upg-neighbors/index.html +++ b/public/dx-maps/upg-neighbor/upg-neighbor/upg-neighbors/index.html @@ -11,7 +11,7 @@ UPG Neighbors: mobilize · upg-neighbor - +