{"id":386299,"date":"2026-06-29T03:14:24","date_gmt":"2026-06-29T01:14:24","guid":{"rendered":"https:\/\/www.e-borghi.com\/?page_id=386299"},"modified":"2026-06-30T00:20:28","modified_gmt":"2026-06-29T22:20:28","slug":"map","status":"publish","type":"page","link":"https:\/\/www.e-borghi.com\/en\/interactive-map\/","title":{"rendered":"Map"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"386299\" class=\"elementor elementor-386299 elementor-386294\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b675146 e-flex e-con-boxed e-con e-parent\" data-id=\"b675146\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0dfe6ed elementor-widget elementor-widget-shortcode\" data-id=\"0dfe6ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <div class=\"ebm0-app\" data-ajax=\"https:\/\/www.e-borghi.com\/wp-admin\/admin-ajax.php\" data-fast=\"https:\/\/www.e-borghi.com\/wp-content\/plugins\/eb-mappa\/eb-mappa-v1.php\" data-start-lat=\"\" data-start-lng=\"\" data-start-q=\"\" data-start-village=\"0\" data-village-slug=\"\" data-region=\"\" data-region-only-villages=\"0\" data-landing=\"0\" data-near-me=\"0\" data-radius=\"\">\n            <section class=\"ebm0-hero\">\n                                    <div class=\"ebm0-kicker\">E-BORGHI MAP<\/div>\n                    <h1>Explore authentic Italy<\/h1>\n                    <p class=\"ebm0-subtitle\">Search for a place and discover villages, places to visit, experiences, restaurants, accommodation and shops nearby.<\/p>\n                                <div class=\"ebm0-search\">\n                    <input type=\"text\" class=\"ebm0-q\" placeholder=\"Search village, town or place\" \/>\n                    <button type=\"button\" class=\"ebm0-find\">Search<\/button>\n                    <button type=\"button\" class=\"ebm0-near\">Use my location<\/button>\n                <\/div>\n            <\/section>\n            <section class=\"ebm0-filters\" aria-label=\"Map filters\">\n                <label><input type=\"checkbox\" data-type=\"borghi\" checked> Villages<\/label><label><input type=\"checkbox\" data-type=\"cosa_vedere\" checked> What to see<\/label><label><input type=\"checkbox\" data-type=\"esperienze\" checked> Experiences<\/label><label><input type=\"checkbox\" data-type=\"mangiare\" checked> Food<\/label><label><input type=\"checkbox\" data-type=\"dormire\" checked> Sleep<\/label><label><input type=\"checkbox\" data-type=\"affitti\" checked> Rentals<\/label><label><input type=\"checkbox\" data-type=\"acquistare\" checked> Shopping<\/label><label><input type=\"checkbox\" data-type=\"eventi\" checked> Events<\/label>\n            <\/section>\n            <div class=\"ebm0-status\">Search for a place to start.<\/div>\n            <div id=\"ebm0-map\"><\/div><div id=\"ebm0-products-modal\" class=\"ebm0-products-modal\" aria-hidden=\"true\"><div class=\"ebm0-products-box\"><div class=\"ebm0-products-top\"><strong id=\"ebm0-products-title\">Products<\/strong><button type=\"button\" id=\"ebm0-products-close\" class=\"ebm0-products-close\">\u00d7<\/button><\/div><div id=\"ebm0-products-grid\" class=\"ebm0-products-grid\"><\/div><\/div><\/div>\n            <section class=\"ebm0-results\"><div class=\"ebm0-results-head\"><strong>Results<\/strong><span class=\"ebm0-count\">0<\/span><\/div><div class=\"ebm0-list\"><\/div><\/section>\n        <\/div>\n        <style>\n        .ebm0-app{--eb:#a0142a;--soft:#fff8f5;--line:#edd8d2;--text:#202020;width:min(1260px,calc(100vw - 28px));max-width:calc(100vw - 28px);margin:0 auto 60px!important;font-family:Roboto,Arial,sans-serif;color:var(--text);box-sizing:border-box;overflow:hidden}.ebm0-app *{box-sizing:border-box}.ebm0-hero{background:linear-gradient(135deg,#fff,#fff8f5);border:1px solid var(--line);border-radius:24px;padding:24px;margin:18px 0 14px}.ebm0-kicker{font-size:12px;font-weight:900;color:var(--eb);letter-spacing:.12em}.ebm0-hero h1{font-size:clamp(34px,4vw,58px);line-height:1;margin:8px 0 10px;letter-spacing:-.04em}.ebm0-subtitle{margin:0 0 18px;color:#555;font-size:16px;line-height:1.45;max-width:760px}.ebm0-hero-landing{padding:18px 20px}.ebm0-landing-intro{max-width:980px;margin-bottom:14px}.ebm0-search{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px}.ebm0-q{border:1px solid var(--line);border-radius:16px;padding:15px 16px;font-size:16px;outline:none}.ebm0-find,.ebm0-near{border:0;border-radius:16px;padding:13px 20px;font-weight:900;cursor:pointer}.ebm0-find{background:var(--eb);color:#fff}.ebm0-near{background:#fff;color:var(--eb);border:1px solid var(--line)}.ebm0-filters{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.ebm0-filters label{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:8px 12px;font-size:13px;font-weight:800;color:var(--eb);cursor:pointer}.ebm0-filters input{width:14px;height:14px;accent-color:var(--eb)}.ebm0-status{font-size:14px;color:#555;margin:6px 0 10px}#ebm0-map{width:100%;height:70vh;min-height:620px;border:1px solid var(--line);border-radius:24px;overflow:hidden;box-shadow:0 18px 45px rgba(0,0,0,.08)}.ebm0-results{margin-top:16px;background:var(--soft);border:1px solid var(--line);border-radius:24px;padding:14px}.ebm0-results-head{display:flex;align-items:center;justify-content:space-between;color:var(--eb);font-size:15px;text-transform:uppercase;margin-bottom:12px}.ebm0-count{background:#fff;border:1px solid var(--line);border-radius:999px;padding:5px 10px}.ebm0-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}.ebm0-card{display:grid;grid-template-columns:118px minmax(0,1fr);gap:12px;background:#fff;border:1px solid #efd8d2;border-radius:18px;padding:10px;cursor:pointer;min-height:144px;transition:.15s;overflow:hidden;align-items:start}.ebm0-card:hover,.ebm0-card.active{border-color:var(--eb);box-shadow:0 0 0 2px rgba(160,20,42,.11)}.ebm0-card-origin{border-color:var(--eb)!important;box-shadow:0 0 0 2px rgba(160,20,42,.10)}.ebm0-img,.ebm0-noimg{width:118px!important;height:96px!important;object-fit:cover!important;border-radius:14px;background:transparent;display:block;max-width:118px!important;min-width:118px!important;overflow:hidden;aspect-ratio:118\/96}.ebm0-card>div{min-width:0;overflow:hidden}.ebm0-badge{display:inline-block;background:#fff6f3;color:var(--eb);border:1px solid #e4b9b0;border-radius:999px;padding:3px 8px;font-size:10px;font-weight:900;text-transform:uppercase;line-height:1}.ebm0-card h3{font-size:15px;line-height:1.18;margin:6px 0 5px;font-weight:900;color:#202020;word-break:normal;overflow-wrap:anywhere}.ebm0-place,.ebm0-address,.ebm0-dist{display:block;font-size:12px;line-height:1.25;margin-top:3px}.ebm0-place{color:var(--eb);font-weight:900}.ebm0-address{color:#666}.ebm0-desc{display:-webkit-box;font-size:12px;line-height:1.3;margin-top:5px;color:#555;max-height:31px;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}.ebm0-dist{color:var(--eb);font-weight:900}.ebm0-empty{background:#fff;border:1px dashed #e4b9b0;border-radius:18px;padding:18px;font-weight:800;color:#8a2635}.ebm0-extend-search{margin-top:12px;border:0;border-radius:999px;background:#a0142a;color:#fff;font-weight:900;padding:10px 16px;cursor:pointer}.leaflet-popup-content{width:auto!important;max-width:min(360px,calc(100vw - 70px))!important}.leaflet-popup-content-wrapper{border-radius:16px!important;overflow:hidden!important}.ebm0-popup{width:340px;max-width:100%;overflow:hidden}.ebm0-popup-img{width:100%!important;height:155px!important;object-fit:cover!important;border-radius:14px;background:transparent;display:block;margin:0 0 10px 0;max-width:100%!important;min-width:0!important;overflow:hidden;aspect-ratio:16\/9}.ebm0-popup .ebm0-noimg,.ebm0-popup .ebm0-broken{display:none!important}.ebm0-popup strong{display:block;font-size:20px;line-height:1.18;margin:7px 0}.ebm0-popup small{display:block;font-size:13px;line-height:1.35;margin:3px 0;color:#666}.ebm0-popup .desc{color:#444;max-height:38px;overflow:hidden;margin-top:6px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.ebm0-popup .place,.ebm0-popup .dist{color:var(--eb);font-weight:900}.ebm0-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px}.ebm0-popup a.ebm0-cta,.ebm0-products-btn{display:inline-block;background:var(--eb);color:#fff!important;border-radius:999px;padding:10px 17px;text-decoration:none;font-weight:900;border:0;cursor:pointer;line-height:1;font-size:15px}.ebm0-products-btn{background:#fff;color:var(--eb)!important;border:1px solid var(--eb)}.ebm0-rec{display:inline-block;margin-left:6px;background:#fff1d8;color:#8a5200;border:1px solid #f1c77b;border-radius:999px;padding:3px 8px;font-size:10px;font-weight:900;text-transform:uppercase}.ebm0-product{display:grid!important;grid-template-columns:64px minmax(0,1fr);gap:10px;align-items:center;background:#fff!important;color:#202020!important;border:1px solid #edd8d2;border-radius:14px;padding:9px!important;margin:0!important;text-decoration:none!important;font-size:13px;font-weight:900;overflow:hidden}.ebm0-prod-img{width:64px!important;height:58px!important;object-fit:cover!important;border-radius:10px;background:transparent}.ebm0-product span{min-width:0;overflow:hidden}.ebm0-product b{display:block;color:var(--eb);font-size:12px;margin-top:3px}.ebm0-products-modal{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:999999;display:none;align-items:center;justify-content:center;padding:20px}.ebm0-products-modal.open{display:flex}.ebm0-products-box{width:min(620px,calc(100vw - 28px));max-height:84vh;overflow:auto;background:#fff;border-radius:22px;padding:18px;box-shadow:0 24px 70px rgba(0,0,0,.25)}.ebm0-products-top{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.ebm0-products-top strong{font-size:20px;line-height:1.1}.ebm0-products-close{border:0;background:#a0142a;color:#fff;border-radius:999px;width:34px;height:34px;font-size:18px;cursor:pointer}.ebm0-products-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.marker-cluster-small,.marker-cluster-medium,.marker-cluster-large{background:rgba(160,20,42,.18)}.marker-cluster-small div,.marker-cluster-medium div,.marker-cluster-large div{background:#a0142a;color:#fff;font-weight:900}@media(max-width:1100px){.ebm0-list{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:760px){.ebm0-app{width:calc(100vw - 12px);max-width:calc(100vw - 12px);margin-bottom:36px!important}.ebm0-hero{padding:14px;border-radius:18px;margin-top:10px}.ebm0-kicker{font-size:10px}.ebm0-hero h1{font-size:28px;letter-spacing:-.03em;margin-bottom:14px}.ebm0-search{grid-template-columns:1fr;gap:8px}.ebm0-q{padding:13px 14px}.ebm0-find,.ebm0-near{width:100%;padding:13px 14px}.ebm0-filters{flex-wrap:nowrap;overflow:auto;padding-bottom:7px;margin:10px 0;scrollbar-width:thin}.ebm0-filters label{white-space:nowrap;font-size:12px;padding:7px 10px}.ebm0-status{font-size:13px}.ebm0-results{padding:10px;border-radius:18px}.ebm0-list{grid-template-columns:1fr;gap:10px}.ebm0-card{grid-template-columns:88px minmax(0,1fr);min-height:104px;padding:9px}.ebm0-img,.ebm0-noimg{width:88px!important;height:72px!important;max-width:88px!important;min-width:88px!important}.ebm0-card h3{font-size:14px}.ebm0-place,.ebm0-address,.ebm0-dist{font-size:11.5px}#ebm0-map{height:56vh;min-height:410px;border-radius:18px}.leaflet-popup-content{margin:10px!important}.ebm0-popup{width:238px;overflow:hidden}.ebm0-popup-img{width:100%!important;height:92px!important;max-width:100%!important}.ebm0-popup .ebm0-noimg,.ebm0-popup .ebm0-broken{display:none!important}.ebm0-popup strong{font-size:16px;line-height:1.15}.ebm0-products-grid{grid-template-columns:1fr}.ebm0-product{font-size:12px}.ebm0-products-box{padding:14px}.ebm0-actions{gap:6px}.ebm0-popup a.ebm0-cta,.ebm0-products-btn{padding:9px 14px}}\n                <\/style>\n        <script>\n        document.addEventListener('DOMContentLoaded', function(){\n            const root = document.querySelector('.ebm0-app');\n            if (!root || !window.L) return;\n            const ajax = root.dataset.ajax;\n            const fastAjax = root.dataset.fast || ajax;\n            const I18N = {\"kicker\":\"E-BORGHI MAP\",\"hero_title\":\"Explore authentic Italy\",\"hero_subtitle\":\"Search for a place and discover villages, places to visit, experiences, restaurants, accommodation and shops nearby.\",\"placeholder\":\"Search village, town or place\",\"search\":\"Search\",\"near_me\":\"Use my location\",\"filters_label\":\"Map filters\",\"filter_borghi\":\"Villages\",\"filter_cosa_vedere\":\"What to see\",\"filter_esperienze\":\"Experiences\",\"filter_mangiare\":\"Food\",\"filter_dormire\":\"Sleep\",\"filter_affitti\":\"Rentals\",\"filter_acquistare\":\"Shopping\",\"filter_eventi\":\"Events\",\"start_status\":\"Search for a place to start.\",\"products\":\"Products\",\"results\":\"Results\",\"label_borghi\":\"Village\",\"label_cosa_vedere\":\"What to see\",\"label_mangiare\":\"Food\",\"label_dormire\":\"Sleep\",\"label_affitti\":\"Rentals\",\"label_acquistare\":\"Shopping\",\"label_esperienze\":\"Experience\",\"label_eventi\":\"Event\",\"origin_label\":\"this place\",\"this_village\":\"this village\",\"near_label\":\"your location\",\"near_input\":\"Your location\",\"in_village_prefix\":\"In the village of \",\"product_fallback\":\"Product\",\"no_products\":\"No linked products.\",\"recommended\":\"Recommended\",\"position\":\"POSITION\",\"discover\":\"Discover\",\"no_region_results\":\"No results in the regional map with these filters.\",\"region_results_suffix\":\" results in the regional map.\",\"road_results_prefix\":\" results within \",\"road_results_mid\":\" road km from \",\"no_road_results_prefix\":\"No results within \",\"no_road_results_mid\":\" road km from \",\"with_filters\":\" with these filters.\",\"empty_results\":\"No results. Enable another filter or search for another place.\",\"calculating\":\"Calculating road distances\u2026\",\"loading_prefix\":\"Loading results for \"};\n            const LOCAL_KM = 60;\n            \/\/ Confini Italia usati per centrare la mappa generale. Deve essere sempre definito,\n            \/\/ anche quando la pagina principale usa il nuovo slug \/mappa-interattiva\/.\n            const ITALY_BOUNDS = L.latLngBounds([[35.45, 6.35], [47.15, 18.75]]);\n            const OSRM_CANDIDATES = 220;\n            const archiveRegion = root.dataset.region || '';\n            const archiveMode = !!archiveRegion;\n            const regionOnlyVillages = root.dataset.regionOnlyVillages === '1';\n            const landingMode = root.dataset.landing === '1';\n            const startNearMe = root.dataset.nearMe === '1';\n            const initialHomeMap = !archiveMode && !startNearMe && !root.dataset.startQ && !root.dataset.startLat && !root.dataset.villageSlug;\n            let homeMapMode = initialHomeMap;\n            let broadSearchMode = false;\n            let contextActive = false;\n            const q = root.querySelector('.ebm0-q');\n            const list = root.querySelector('.ebm0-list');\n            const countEl = root.querySelector('.ebm0-count');\n            const status = root.querySelector('.ebm0-status');\n            const checks = [...root.querySelectorAll('.ebm0-filters input[type=\"checkbox\"]')];\n            if (archiveMode || initialHomeMap) { checks.forEach(c => { c.checked = (c.dataset.type === 'borghi'); }); }\n            if (archiveMode && regionOnlyVillages) {\n                checks.forEach(c => {\n                    const label = c.closest('label');\n                    if (c.dataset.type !== 'borghi') {\n                        c.checked = false;\n                        c.disabled = true;\n                        if (label) label.style.display = 'none';\n                    }\n                });\n            }\n            const labels = {borghi:I18N.label_borghi, cosa_vedere:I18N.label_cosa_vedere, mangiare:I18N.label_mangiare, dormire:I18N.label_dormire, affitti:I18N.label_affitti, acquistare:I18N.label_acquistare, esperienze:I18N.label_esperienze, eventi:I18N.label_eventi};\n            const icons = {borghi:'\ud83c\udfd8\ufe0f', cosa_vedere:'\ud83d\udc40', mangiare:'\ud83c\udf7d\ufe0f', dormire:'\ud83d\udecf\ufe0f', affitti:'\ud83c\udfe1', acquistare:'\ud83d\udecd\ufe0f', esperienze:'\ud83e\udded', eventi:'\ud83d\udcc5'};\n            let origin = [42.7, 12.5], originLabel = I18N.origin_label, originMarker = null, allItems = [], requestId = 0, originIsIndexedVillage = false, originVillageItem = null;\n            if (root.dataset.startLat && root.dataset.startLng) { origin = [parseFloat(root.dataset.startLat), parseFloat(root.dataset.startLng)]; if (root.dataset.startQ) { q.value = root.dataset.startQ; originLabel = root.dataset.startQ; } }\n            else if (root.dataset.startQ) { q.value = root.dataset.startQ; originLabel = root.dataset.startQ; }\n            const map = L.map('ebm0-map', {scrollWheelZoom:false}).setView(origin, initialHomeMap ? 6 : 11);\n            L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {maxZoom:19, attribution:'&copy; OpenStreetMap'}).addTo(map);\n            const cluster = L.markerClusterGroup({showCoverageOnHover:false, maxClusterRadius:42, disableClusteringAtZoom:16, spiderfyOnMaxZoom:true}); map.addLayer(cluster);\n            document.addEventListener('click', function(e){\n                const btn=e.target.closest('.ebm0-products-btn');\n                if(btn){ e.preventDefault(); const id=Number(btn.getAttribute('data-products')); const it=allItems.find(x=>Number(x.id)===id); if(it) openProducts(it); }\n                if(e.target.closest('#ebm0-products-close') || e.target.id==='ebm0-products-modal'){ document.getElementById('ebm0-products-modal').classList.remove('open'); }\n            });\n            function lang(){ return (document.documentElement.lang || 'it').toLowerCase().indexOf('en') === 0 ? 'en' : 'it'; }\n            function activeTypes(){ return checks.filter(c => c.checked).map(c => c.dataset.type); }\n            function onlyHomeVillages(){ const a=activeTypes(); return homeMapMode && a.length===1 && a[0]==='borghi' && !(q.value||'').trim(); }\n            function homeVillagesText(n){ return lang()==='en' ? 'Explore '+n+' villages across Italy' : 'Esplora '+n+' borghi distribuiti in tutta Italia'; }\n            function decodeHtml(s){ const t=document.createElement('textarea'); t.innerHTML=String(s||''); return t.value; }\n            function esc(s){ return decodeHtml(s).replace(\/[&<>'\"]\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;',\"'\":'&#039;','\"':'&quot;'}[m])); }\n            function img(src,cls){ return src ? '<img decoding=\"async\" class=\"'+cls+'\" src=\"'+esc(src)+'\" loading=\"lazy\" alt=\"\" onerror=\"this.style.display=\\'none\\';this.classList.add(\\'ebm0-broken\\')\">' : '<span class=\"'+cls+' ebm0-noimg\"><\/span>'; }\n            function airKm(it){ const n=Number(it.air_distance); return Number.isFinite(n) ? n : 999999; }\n            function roadKm(it){ const n=Number(it.road_distance); return Number.isFinite(n) ? n : null; }\n            function place(it){ return (it.type!=='acquistare' && it.village) ? I18N.in_village_prefix+it.village : ''; }\n            function addr(it){ let a=(it.address||'').trim(); return a.length>115 ? a.substring(0,112)+'\u2026' : a; }\n            function desc(it){ let d=decodeHtml(it.excerpt||'').trim().replace(\/\\s+\/g,' '); return d.length>135 ? d.substring(0,132)+'\u2026' : d; }\n            function eventDate(it){ return (it.type==='eventi' && it.event_dates) ? String(it.event_dates) : ''; }\n            function distText(it){ const r=roadKm(it); return r===null ? '' : r+' km'+(it.duration_min?' \u00b7 '+it.duration_min+' min':''); }\n            function displayType(it){ return it.type; }\n            function isRecommended(it){ return it.type==='acquistare' && (Number(it.products||0)>0 || Number(it.premium||0)===1); }\n            function matches(it){ const a=activeTypes(); if(!a.length) return false; return a.includes(it.type); }\n            function itemImage(it){ return it.image || ''; }\n            function productCards(it){ const raw=Array.isArray(it.product_items)?it.product_items:[]; const seen=new Set(); const ps=[]; raw.forEach(p=>{ const key=((p.url||'')+'|'+(p.title||'')).toLowerCase().trim(); if(!key || seen.has(key)) return; seen.add(key); ps.push(p); }); return ps.slice(0,8).map(p=>'<a href=\"'+esc(p.url||'#')+'\" class=\"ebm0-product\">'+img(p.image,'ebm0-prod-img')+'<span>'+esc(p.title||I18N.product_fallback)+(p.price?' <b>'+esc(p.price)+'<\/b>':'')+'<\/span><\/a>').join('') || '<div class=\"ebm0-empty\">'+esc(I18N.no_products)+'<\/div>'; }\n            function openProducts(it){ const ps=Array.isArray(it.product_items)?it.product_items:[]; if(!ps.length) return; const modal=document.getElementById('ebm0-products-modal'); const title=document.getElementById('ebm0-products-title'); const grid=document.getElementById('ebm0-products-grid'); title.textContent=I18N.products; grid.innerHTML=productCards(it); modal.classList.add('open'); }\n            window.ebm0OpenProducts=function(id){ const it=allItems.find(x=>Number(x.id)===Number(id)); if(it) openProducts(it); return false; };\n            function productButton(it){ const ps=Array.isArray(it.product_items)?it.product_items:[]; return ps.length ? '<button type=\"button\" class=\"ebm0-products-btn\" data-products=\"'+esc(String(it.id))+'\" onclick=\"return window.ebm0OpenProducts && window.ebm0OpenProducts('+esc(String(it.id))+')\">'+esc(I18N.products)+'<\/button>' : ''; }\n            function clearMap(){ cluster.clearLayers(); if(originMarker){map.removeLayer(originMarker); originMarker=null;} }\n            function setOrigin(show){ if(originMarker) map.removeLayer(originMarker); originMarker=null; if(show===false) return; originMarker=L.marker(origin,{zIndexOffset:10000,interactive:false,icon:L.divIcon({className:'',html:'<div style=\"width:24px;height:24px;border-radius:50%;background:#111;color:white;display:flex;align-items:center;justify-content:center;border:3px solid white;box-shadow:0 3px 12px rgba(0,0,0,.3);font-size:12px\">\u2316<\/div>'})}).addTo(map); }\n            function iconFor(t){ return L.divIcon({className:'',html:'<div style=\"width:30px;height:30px;border-radius:50%;background:#a0142a;color:white;display:flex;align-items:center;justify-content:center;border:3px solid white;box-shadow:0 3px 12px rgba(0,0,0,.25);font-size:14px\">'+(icons[t]||'\u2022')+'<\/div>'}); }\n            async function computeRoadDistances(items,rid){\n                const candidates=items\n                    .filter(it=>matches(it)&&airKm(it)<=LOCAL_KM*1.8)\n                    .sort((a,b)=>airKm(a)-airKm(b))\n                    .slice(0,OSRM_CANDIDATES);\n\n                candidates.forEach(it=>{it.road_distance=null; it.duration_min=null;});\n\n                async function osrmNearest(lat,lng){\n                    const url='https:\/\/router.project-osrm.org\/nearest\/v1\/driving\/'+lng+','+lat+'?number=1';\n                    try{\n                        const j=await fetch(url,{mode:'cors'}).then(r=>r.json());\n                        if(j && j.code==='Ok' && j.waypoints && j.waypoints[0] && j.waypoints[0].location){\n                            const loc=j.waypoints[0].location;\n                            return [Number(loc[0]), Number(loc[1])]; \/\/ lng, lat agganciati alla strada\n                        }\n                    }catch(e){}\n                    return null;\n                }\n\n                const snappedOrigin = await osrmNearest(origin[0], origin[1]);\n                if(rid!==requestId || !snappedOrigin) return;\n\n                const chunks=[]; for(let i=0;i<candidates.length;i+=35) chunks.push(candidates.slice(i,i+35));\n\n                for(const chunk of chunks){\n                    if(rid!==requestId) return;\n\n                    const snapped = await Promise.all(chunk.map(it=>osrmNearest(it.lat,it.lng)));\n                    if(rid!==requestId) return;\n\n                    const valid = [];\n                    snapped.forEach((coord,i)=>{\n                        if(coord) valid.push({item:chunk[i], coord:coord});\n                    });\n                    if(!valid.length) continue;\n\n                    const coords=[snappedOrigin,...valid.map(x=>x.coord)].map(c=>c[0]+','+c[1]).join(';');\n                    const dest=valid.map((_,i)=>i+1).join(';');\n                    const url='https:\/\/router.project-osrm.org\/table\/v1\/driving\/'+coords+'?sources=0&destinations='+dest+'&annotations=distance,duration';\n\n                    try{\n                        const j=await fetch(url,{mode:'cors'}).then(r=>r.json());\n                        if(rid!==requestId) return;\n                        valid.forEach((row,i)=>{\n                            const d=j.distances&&j.distances[0]?j.distances[0][i]:null;\n                            const t=j.durations&&j.durations[0]?j.durations[0][i]:null;\n                            if(d!==null&&Number.isFinite(Number(d))){\n                                row.item.road_distance=Math.round((d\/1000)*10)\/10;\n                                row.item.duration_min=t?Math.max(1,Math.round(t\/60)):null;\n                            }\n                        });\n                    }catch(e){}\n                }\n            }\n            function visibleItems(){\n                if (homeMapMode || broadSearchMode) {\n                    const term = (q.value || '').trim().toLowerCase();\n                    return allItems.filter(it=>matches(it)).filter(it=>{\n                        if(!term) return true;\n                        return String((it.title||'')+' '+(it.village||'')+' '+(it.address||'')).toLowerCase().includes(term);\n                    }).slice(0,1000);\n                }\n                if (archiveMode) {\n                    const term = (q.value || '').trim().toLowerCase();\n                    return allItems.filter(it=>matches(it)).filter(it=>{\n                        if(!term) return true;\n                        return String((it.title||'')+' '+(it.village||'')+' '+(it.address||'')).toLowerCase().includes(term);\n                    }).slice(0,300);\n                }\n                return allItems.filter(it=>matches(it)).filter(it=>roadKm(it)!==null && roadKm(it)<=LOCAL_KM).sort((a,b)=>roadKm(a)-roadKm(b)).slice(0,120);\n            }\n            function render(){\n                clearMap();\n                let items = visibleItems();\n\n                \/\/ Se la localit\u00e0 cercata \u00e8 un borgo presente nel sito, il pin del borgo deve esserci SEMPRE.\n                \/\/ Non deve sparire dietro al pin nero della posizione n\u00e9 dipendere dalla distanza OSRM.\n                if (originIsIndexedVillage && originVillageItem && activeTypes().includes('borghi')) {\n                    const oid = Number(originVillageItem.id);\n                    const exists = items.some(x => Number(x.id) === oid && x.type === 'borghi');\n                    if (!exists) {\n                        const v = Object.assign({}, originVillageItem, {road_distance:0, duration_min:0, air_distance:0, origin_position:1});\n                        items.unshift(v);\n                    }\n                }\n\n                const hasExactVillage = items.some(it => it.type === 'borghi' && Math.abs(Number(it.lat)-origin[0]) < 0.00035 && Math.abs(Number(it.lng)-origin[1]) < 0.00035);\n                setOrigin(!archiveMode && !homeMapMode);\n                countEl.textContent = items.length;\n                list.innerHTML = '';\n                status.textContent = onlyHomeVillages() ? homeVillagesText(items.length) : ((homeMapMode || broadSearchMode) ? (items.length ? items.length + (lang()==='en' ? ' results on the map.' : ' risultati sulla mappa.') : (lang()==='en' ? 'No results found.' : 'Nessun risultato trovato.')) : (archiveMode ? (items.length ? items.length+I18N.region_results_suffix : I18N.no_region_results) : (items.length ? items.length+I18N.road_results_prefix+LOCAL_KM+I18N.road_results_mid+(originLabel||I18N.origin_label) : I18N.no_road_results_prefix+LOCAL_KM+I18N.no_road_results_mid+(originLabel||I18N.origin_label)+I18N.with_filters)));\n                if(!items.length){\n                    const canExtend = contextActive && !archiveMode && !homeMapMode && !broadSearchMode;\n                    list.innerHTML='<div class=\"ebm0-empty\">'+esc(I18N.empty_results)+(canExtend ? '<br><button type=\"button\" class=\"ebm0-extend-search\">'+esc(lang()==='en'?'Extend search':'Estendi la ricerca')+'<\/button>' : '')+'<\/div>';\n                    const eb = list.querySelector('.ebm0-extend-search');\n                    if(eb){ eb.onclick=()=>{ contextActive=false; broadSearchMode=true; homeMapMode=false; search(); }; }\n                    if(!archiveMode && !homeMapMode && !broadSearchMode) map.setView(origin,11);\n                    return;\n                }\n\n                const group = L.featureGroup(originMarker ? [originMarker] : []);\n                items.forEach(it=>{\n                    const dt=displayType(it), badge=(it.origin_position?I18N.position:(labels[dt]||dt)), p=place(it), a=addr(it), de=desc(it), ed=eventDate(it), d=distText(it);\n                    const rec=isRecommended(it)?'<span class=\"ebm0-rec\">'+esc(I18N.recommended)+'<\/span>':'';\n                    const imageHtml = img(itemImage(it),'ebm0-popup-img');\n                    const popup='<div class=\"ebm0-popup\">'+imageHtml+'<div class=\"ebm0-popup-body\"><span class=\"ebm0-badge\">'+esc(badge)+'<\/span>'+rec+'<strong>'+esc(it.title)+'<\/strong>'+(ed?'<small class=\"dist\">\ud83d\udcc5 '+esc(ed)+'<\/small>':'')+(p?'<small class=\"place\">\ud83d\udccd '+esc(p)+'<\/small>':'')+(a?'<small>'+esc(a)+'<\/small>':'')+(de?'<small class=\"desc\">'+esc(de)+'<\/small>':'')+(d?'<small class=\"dist\">'+esc(d)+'<\/small>':'')+'<div class=\"ebm0-actions\"><a class=\"ebm0-cta\" href=\"'+esc(it.url)+'\">'+esc(I18N.discover)+'<\/a>'+productButton(it)+'<\/div><\/div><\/div>';\n                    const marker=L.marker([it.lat,it.lng],{icon:iconFor(dt)}).bindPopup(popup);\n                    cluster.addLayer(marker);\n                    group.addLayer(marker);\n\n                    const card=document.createElement('article');\n                    card.className='ebm0-card'+(it.origin_position?' ebm0-card-origin':'');\n                    card.innerHTML=img(itemImage(it),'ebm0-img')+'<div><span class=\"ebm0-badge\">'+esc(badge)+'<\/span>'+(isRecommended(it)?'<span class=\"ebm0-rec\">'+esc(I18N.recommended)+'<\/span>':'')+'<h3>'+esc(it.title)+'<\/h3>'+(ed?'<span class=\"ebm0-dist\">\ud83d\udcc5 '+esc(ed)+'<\/span>':'')+(p?'<span class=\"ebm0-place\">\ud83d\udccd '+esc(p)+'<\/span>':'')+(a?'<span class=\"ebm0-address\">'+esc(a)+'<\/span>':'')+(de?'<span class=\"ebm0-desc\">'+esc(de)+'<\/span>':'')+(d?'<span class=\"ebm0-dist\">'+esc(d)+'<\/span>':'')+'<\/div>';\n                    card.onclick=(ev)=>{\n                        ev.preventDefault();\n                        \/\/ Il contesto si attiva solo cliccando una card dei risultati sotto la mappa.\n                        \/\/ Aprire un marker\/popup sulla mappa resta semplice esplorazione e non cambia contesto.\n                        contextActive=true;\n                        broadSearchMode=false;\n                        homeMapMode=false;\n                        origin=[parseFloat(it.lat),parseFloat(it.lng)];\n                        originLabel=decodeHtml(it.title||I18N.origin_label);\n                        originIsIndexedVillage=(it.type==='borghi');\n                        originVillageItem=(it.type==='borghi')?it:null;\n                        document.querySelectorAll('.ebm0-card').forEach(c=>c.classList.remove('active'));\n                        card.classList.add('active');\n                        const mapEl=document.getElementById('ebm0-map');\n                        if(mapEl){ mapEl.scrollIntoView({behavior:'smooth',block:'center'}); }\n                        const openMarker=()=>{\n                            if(cluster && typeof cluster.zoomToShowLayer==='function'){\n                                cluster.zoomToShowLayer(marker, ()=>setTimeout(()=>marker.openPopup(),160));\n                            }else{\n                                setTimeout(()=>marker.openPopup(),160);\n                            }\n                        };\n                        map.setView([it.lat,it.lng],17,{animate:true});\n                        setTimeout(openMarker, 280);\n                    };\n                    list.appendChild(card);\n                });\n\n                const bounds = group.getBounds && group.getBounds().isValid() ? group.getBounds() : null;\n                if(homeMapMode || broadSearchMode){ map.fitBounds(ITALY_BOUNDS, {animate:false, padding:[18,18], maxZoom:6}); }\n                else if(bounds){ map.fitBounds(bounds.pad(0.15), {animate:false, maxZoom:13}); }\n                else { map.setView(origin, 11, {animate:false}); }\n            }\n            function perfEnabled(){ return \/[?&]ebm_perf=1(?:&|$)\/.test(window.location.search); }\n            function perfPanel(data){\n                if(!perfEnabled() || !data) return;\n                let box=document.getElementById('ebm-perf-panel');\n                if(!box){\n                    box=document.createElement('pre');\n                    box.id='ebm-perf-panel';\n                    box.style.cssText='position:fixed;right:12px;bottom:12px;z-index:999999;background:#111;color:#0f0;padding:12px;max-width:420px;max-height:45vh;overflow:auto;font:12px\/1.35 monospace;border-radius:10px;box-shadow:0 10px 30px rgba(0,0,0,.35)';\n                    document.body.appendChild(box);\n                }\n                box.textContent='EB Mappa performance\\n'+JSON.stringify(data,null,2);\n            }\n            async function search(){\n                const perfClient={};\n                const perfStart=performance.now();\n                const rid=++requestId;\n                list.innerHTML='<div class=\"ebm0-empty\">'+esc(I18N.calculating)+'<\/div>';\n                status.textContent=I18N.loading_prefix+(originLabel||I18N.origin_label)+'\u2026';\n                countEl.textContent='0';\n                const url=fastAjax+'?ebm_fast=1&_ebm_ts='+(Date.now())+'&lat='+origin[0]+'&lng='+origin[1]+'&radius='+LOCAL_KM+'&types='+encodeURIComponent(activeTypes().join(','))+'&lang='+lang()+(homeMapMode?'&home=1':'')+(broadSearchMode?'&global=1':'')+(archiveRegion?'&region='+encodeURIComponent(archiveRegion):'')+(root.dataset.villageSlug?'&village='+encodeURIComponent(root.dataset.villageSlug):'')+(perfEnabled()?'&ebm_perf=1':'');\n                const perfFetchStart=performance.now();\n                const j=await fetch(url).then(r=>r.json()).catch(()=>null);\n                perfClient.ajax_ms=Number((performance.now()-perfFetchStart).toFixed(2));\n                perfClient.server=j&&j.data&&j.data.perf?j.data.perf:null;\n                if(rid!==requestId)return;\n                allItems=j&&j.success?(j.data.items||[]):[];\n\n                \/\/ Inserisce subito il borgo cercato, cos\u00ec esiste nel calcolo\/render anche se la query radius non lo restituisce.\n                if(originIsIndexedVillage && originVillageItem && activeTypes().includes('borghi')){\n                    const oid=Number(originVillageItem.id);\n                    if(!allItems.some(x=>Number(x.id)===oid && x.type==='borghi')){\n                        allItems.unshift(Object.assign({}, originVillageItem, {road_distance:0, duration_min:0, air_distance:0, origin_position:1}));\n                    }\n                }\n\n                const perfRoadStart=performance.now();\n                if(!archiveMode && !homeMapMode && !broadSearchMode){ await computeRoadDistances(allItems,rid); }\n                perfClient.road_ms=Number((performance.now()-perfRoadStart).toFixed(2));\n                if(rid!==requestId)return;\n                if(originIsIndexedVillage && originVillageItem && activeTypes().includes('borghi')){\n                    const oid=Number(originVillageItem.id);\n                    if(!allItems.some(x=>Number(x.id)===oid && x.type==='borghi')){\n                        allItems.unshift(Object.assign({}, originVillageItem, {road_distance:0, duration_min:0, air_distance:0, origin_position:1}));\n                    }\n                    allItems.forEach(x=>{ if(Number(x.id)===oid && x.type==='borghi'){ x.road_distance=0; x.duration_min=0; x.air_distance=0; x.origin_position=1; }});\n                }\n                const perfRenderStart=performance.now();\n                render();\n                perfClient.render_ms=Number((performance.now()-perfRenderStart).toFixed(2));\n                perfClient.total_client_ms=Number((performance.now()-perfStart).toFixed(2));\n                perfClient.items=allItems.length;\n                perfClient.archiveMode=!!archiveMode;\n                perfClient.homeMapMode=!!homeMapMode;\n                perfClient.broadSearchMode=!!broadSearchMode;\n                perfClient.archiveRegion=archiveRegion||'';\n                perfClient.activeTypes=activeTypes();\n                perfPanel(perfClient);\n            }\n            function normalizePlaceText(text){ return decodeHtml(String(text||'')).trim().replace(\/\\s+\/g,' '); }\n            function scorePlace(x, wanted){\n                const name = String((x.namedetails && (x.namedetails.name || x.namedetails['name:it'])) || x.name || '').toLowerCase();\n                const disp = String(x.display_name || '').toLowerCase();\n                const cls = String(x.class || '');\n                const typ = String(x.type || '');\n                const add = String(x.addresstype || '');\n                const w = normalizePlaceText(wanted).toLowerCase();\n                let score = 0;\n                const wantedExact = name === w || disp.startsWith(w + ',');\n                if (wantedExact) score += 130;\n                if (name === w) score += 90;\n                if (disp.startsWith(w + ',')) score += 50;\n                if (['city','town','village','municipality','hamlet'].includes(add)) score += 110;\n                if (cls === 'place' && ['city','town','village','municipality','hamlet'].includes(typ)) score += 90;\n                if (cls === 'boundary' && typ === 'administrative' && ['city','town','village','municipality'].includes(add)) score += 60;\n                if (\/road|street|strada|highway|route|postcode|railway|station|industrial|commercial\/.test(add + ' ' + typ + ' ' + cls)) score -= 500;\n                if (\/provincia|province|metropolitan city|citt\u00e0 metropolitana|regione|region|county\/.test(add + ' ' + disp)) score -= 180;\n                if (!\/italia|italy\/.test(disp)) score -= 100;\n                return score;\n            }\n            async function fetchPlaces(url){ try{return await fetch(url).then(r=>r.json());}catch(e){return [];} }\n\n            async function resolveIndexedVillage(text){\n                try{\n                    const u = ajax+'?action=ebm_resolve_place&q='+encodeURIComponent(text)+'&lang='+lang();\n                    const j = await fetch(u).then(r=>r.json());\n                    if(j && j.success && j.data && j.data.lat && j.data.lng){\n                        return j.data;\n                    }\n                }catch(e){}\n                return null;\n            }\n            async function geocode(text){\n                text = normalizePlaceText(text);\n                originLabel = text;\n                originIsIndexedVillage = false; originVillageItem = null;\n                const indexed = await resolveIndexedVillage(text);\n                homeMapMode=false; broadSearchMode=false; contextActive=false;\n                if(indexed){\n                    origin=[parseFloat(indexed.lat),parseFloat(indexed.lng)];\n                    originLabel=decodeHtml(indexed.title||text);\n                    \/\/ I Luoghi manuali sono solo punto di partenza\/centro mappa: non devono creare una card vuota \u201cPOSIZIONE\u201d.\n                    if(indexed.kind === 'manual_place'){\n                        originIsIndexedVillage=false;\n                        originVillageItem=null;\n                    } else {\n                        originIsIndexedVillage=true;\n                        originVillageItem=indexed;\n                    }\n                    q.value=originLabel;\n                    return search();\n                }\n                const base = 'https:\/\/nominatim.openstreetmap.org\/search?format=jsonv2&addressdetails=1&namedetails=1&limit=8&countrycodes=it&accept-language='+lang();\n                const urls = [\n                    base + '&city=' + encodeURIComponent(text) + '&country=' + encodeURIComponent('Italia'),\n                    base + '&q=' + encodeURIComponent('Comune di ' + text + ', Italia'),\n                    base + '&q=' + encodeURIComponent(text + ', Italia')\n                ];\n                let candidates = [];\n                for (const u of urls) {\n                    const got = await fetchPlaces(u);\n                    if (Array.isArray(got) && got.length) candidates = candidates.concat(got);\n                }\n                candidates = candidates.filter(x => x && x.lat && x.lon)\n                    .sort((a,b)=>scorePlace(b,text)-scorePlace(a,text));\n                const good = candidates.find(x => scorePlace(x,text) > -20) || candidates[0];\n                if (good) {\n                    origin=[parseFloat(good.lat),parseFloat(good.lon)];\n                    originIsIndexedVillage = false; originVillageItem = null; window.ebmDebugOrigin = {query:text, picked:good, origin:origin, score:scorePlace(good,text)};\n                }\n                return search();\n            }\n            function ebmSlug(text){\n                return decodeHtml(text||'').toString().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'').toLowerCase().replace(\/[^a-z0-9]+\/g,'-').replace(\/^-+|-+$\/g,'');\n            }\n            async function goCleanSearch(text){\n                text = normalizePlaceText(text);\n                if(!text) return;\n                const indexed = await resolveIndexedVillage(text);\n                if(indexed && indexed.map_url){ window.location.href = indexed.map_url; return; }\n                const slug = ebmSlug(text);\n                if(slug){\n                    const base = (lang()==='en') ? 'https:\/\/www.e-borghi.com\/en\/villages-near-' : 'https:\/\/www.e-borghi.com\/en\/borghi-vicino-\/';\n                    window.location.href = base + slug + '\/';\n                }\n            }\n            root.querySelector('.ebm0-find').onclick=()=>{const v=normalizePlaceText(q.value); if(v){ goCleanSearch(v); } else { search(); }};\n            function useNearMe(){\n                const path = window.location.pathname.replace(\/\\\/+$\/,'\/');\n                const isBaseMap = (lang()==='en') ? (path.endsWith('\/en\/interactive-map\/') || path.endsWith('\/en\/map\/')) : (path.endsWith('\/mappa-interattiva\/') || path.endsWith('\/mappa\/'));\n                const isNearMePage = (lang()==='en') ? path.endsWith('\/en\/villages-near-me\/') : path.endsWith('\/borghi-vicino-a-me\/');\n                if(!isBaseMap && !isNearMePage){\n                    window.location.href = (lang()==='en') ? 'https:\/\/www.e-borghi.com\/en\/villages-near-me\/' : 'https:\/\/www.e-borghi.com\/en\/borghi-vicino-a-me\/';\n                    return;\n                }\n                homeMapMode=false; broadSearchMode=false; contextActive=false;\n                if(!navigator.geolocation)return search();\n                navigator.geolocation.getCurrentPosition(p=>{origin=[p.coords.latitude,p.coords.longitude]; originLabel=I18N.near_label; originIsIndexedVillage=false; originVillageItem=null; q.value=I18N.near_input; search();}, search, {enableHighAccuracy:true,timeout:8000});\n            }\n            root.querySelector('.ebm0-near').onclick=useNearMe;\n            checks.forEach(c=>c.addEventListener('change',()=>{ if(contextActive){ homeMapMode=false; broadSearchMode=false; } else { broadSearchMode=false; homeMapMode = initialHomeMap && activeTypes().length === 1 && activeTypes()[0] === 'borghi' && !q.value.trim(); } search(); }));\n            q.addEventListener('keydown', function(e){ if(e.key==='Enter'){ e.preventDefault(); const v=normalizePlaceText(q.value); if(v){ goCleanSearch(v); } else { search(); } }});\n            if(startNearMe){ useNearMe(); }\n            else if(archiveMode){ search(); }\n            else if(root.dataset.startVillage==='1' && root.dataset.startLat && root.dataset.startLng){\n                origin=[parseFloat(root.dataset.startLat), parseFloat(root.dataset.startLng)];\n                originLabel=decodeHtml(root.dataset.startQ||I18N.this_village);\n                q.value=originLabel;\n                search();\n            }\n            else if(root.dataset.startVillage==='1' && root.dataset.startQ){ geocode(root.dataset.startQ); }\n            else if(root.dataset.startQ && !(root.dataset.startLat&&root.dataset.startLng)) geocode(root.dataset.startQ); else search();\n        });\n        <\/script>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-386299","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/pages\/386299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/comments?post=386299"}],"version-history":[{"count":4,"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/pages\/386299\/revisions"}],"predecessor-version":[{"id":386305,"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/pages\/386299\/revisions\/386305"}],"wp:attachment":[{"href":"https:\/\/www.e-borghi.com\/en\/wp-json\/wp\/v2\/media?parent=386299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}