{"id":10740,"date":"2026-10-31T00:03:24","date_gmt":"2026-10-31T05:03:24","guid":{"rendered":"https:\/\/www.ezcalculatoronline.com\/?page_id=10740"},"modified":"2026-10-31T00:12:56","modified_gmt":"2026-10-31T05:12:56","slug":"kml-nearby-finder","status":"publish","type":"page","link":"https:\/\/www.ezcalculatoronline.com\/online-tools\/kml-nearby-finder\/","title":{"rendered":"KML Nearby Finder"},"content":{"rendered":"<div id=\"tdi_1\" class=\"tdc-zone\"><div class=\"tdc_zone tdi_2  wpb_row td-pb-row\"  >\n<style scoped>\n\n\/* custom css *\/\n.tdi_2{\r\n                    min-height: 0;\r\n                }\n<\/style><div id=\"tdi_3\" class=\"tdc-row\"><div class=\"vc_row tdi_4  wpb_row td-pb-row\" >\n<style scoped>\n\n\/* custom css *\/\n.tdi_4,\r\n                .tdi_4 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_4,\r\n\t\t\t\t.tdi_4 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_4 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_6  wpb_column vc_column_container tdc-column td-pb-span12\">\n<style scoped>\n\n\/* custom css *\/\n.tdi_6{\r\n                    vertical-align: baseline;\r\n                }.tdi_6 > .wpb_wrapper,\r\n\t\t\t\t.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" ><div class=\"wpb_wrapper td_block_wrap vc_raw_html tdi_8 \"><div class=\"td-fix-index\"><!-- KML Nearby Finder & Route Planner \u2014 paste into a WordPress \"Custom HTML\" block -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.css\">\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.9.4\/leaflet.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\r\n<style>\r\n\/* ===== KML Nearby Finder \u2013 WordPress-safe, all rules scoped to #kmlnf ===== *\/\r\n#kmlnf{box-sizing:border-box;\r\n  --bg:#f6f7fb; --card:#fff; --ink:#1d2433; --muted:#6b7385; --line:#e4e7ef;\r\n  --accent:#ff6a13; --accent-2:#7c3aed; --radius:14px; --shadow:0 6px 24px rgba(20,30,60,.08);\r\n  \/* break out of narrow theme content columns, but never wider than the screen *\/\r\n  width:min(1200px, calc(100vw - 32px)); max-width:none!important;\r\n  margin:24px 0 24px calc(50% - min(600px, 50vw - 16px))!important;\r\n  padding:16px; background:var(--bg); color:var(--ink); border-radius:18px;\r\n  font:15px\/1.45 system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif; text-align:left;\r\n  letter-spacing:normal; word-break:normal; position:relative; clear:both;\r\n}\r\n#kmlnf *,#kmlnf *::before,#kmlnf *::after{box-sizing:border-box}\r\n\/* reset what themes like to style *\/\r\n#kmlnf h1,#kmlnf h2,#kmlnf h3,#kmlnf p,#kmlnf ul,#kmlnf ol,#kmlnf li,#kmlnf summary,#kmlnf label{font-family:inherit;letter-spacing:normal;text-transform:none;line-height:1.45;color:inherit;background:none;border:0;box-shadow:none;margin:0;padding:0}\r\n#kmlnf ul,#kmlnf ol{list-style:disc}\r\n#kmlnf li{margin:2px 0}\r\n#kmlnf a{box-shadow:none;border:0;text-decoration:none}\r\n#kmlnf button,#kmlnf input,#kmlnf select{font-family:inherit;font-size:inherit;line-height:1.3;letter-spacing:normal;text-transform:none;text-shadow:none;margin:0;min-height:0;height:auto;width:auto;box-shadow:none;background-image:none;vertical-align:middle}\r\n#kmlnf input[type=range]{padding:0;border:0;background:none;height:auto}\r\n#kmlnf input[type=checkbox]{width:auto;height:auto;margin:0;appearance:auto;-webkit-appearance:checkbox}\r\n#kmlnf .kn-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}\r\n#kmlnf .kn-title{font-size:22px;font-weight:800;margin:0;display:flex;align-items:center;gap:8px;line-height:1.2}\r\n#kmlnf .kn-title .dot{flex:none;width:12px;height:12px;border-radius:50%;background:linear-gradient(135deg,var(--accent),var(--accent-2))}\r\n#kmlnf .subtitle{margin:4px 0 0;color:var(--muted);font-size:14px;max-width:640px}\r\n#kmlnf .grid{display:grid;grid-template-columns:minmax(0,370px) minmax(0,1fr);gap:14px}\r\n@media(max-width:900px){#kmlnf .grid{grid-template-columns:minmax(0,1fr)}}\r\n#kmlnf .card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px}\r\n#kmlnf .card .kn-h2{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:0 0 10px}\r\n#kmlnf .row{display:flex;gap:8px;flex-wrap:wrap}\r\n#kmlnf input[type=text],#kmlnf select{flex:1 1 160px;min-width:0;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);font-size:15px}\r\n#kmlnf input[type=text]:focus,#kmlnf select:focus{outline:2px solid var(--accent);border-color:transparent}\r\n#kmlnf .btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;border:0;border-radius:10px;padding:10px 14px;font-weight:600;font-size:15px;cursor:pointer;background:var(--accent);color:#fff;white-space:nowrap;text-decoration:none;transition:filter .15s}\r\n#kmlnf .btn:hover{filter:brightness(1.07);color:#fff;background:var(--accent)}\r\n#kmlnf .btn.ghost{background:#fff;color:var(--ink);border:1px solid var(--line)}\r\n#kmlnf .btn.ghost:hover{background:#f6f7fb;color:var(--ink)}\r\n#kmlnf .btn.purple,#kmlnf .btn.purple:hover{background:var(--accent-2);color:#fff}\r\n#kmlnf .btn:disabled{opacity:.5;cursor:not-allowed;filter:none}\r\n#kmlnf .btn.sm{padding:7px 10px;font-size:13px}\r\n#kmlnf .muted{color:var(--muted);font-size:13px}\r\n#kmlnf .stack>*+*{margin-top:12px}\r\n#kmlnf .drop{border:2px dashed var(--line);border-radius:12px;padding:14px;text-align:center;cursor:pointer;transition:.15s;background:#fff}\r\n#kmlnf .drop.over{border-color:var(--accent);background:#fff5ee}\r\n#kmlnf .status{font-size:13px;padding:8px 10px;border-radius:8px;background:#f1f3f8}\r\n#kmlnf .status.ok{background:#e9f9ef;color:#166534}\r\n#kmlnf .status.err{background:#fdecec;color:#991b1b}\r\n#kmlnf .geo-results{display:flex;flex-direction:column;gap:6px;margin-top:8px}\r\n#kmlnf .geo-results button{text-align:left;border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:8px;padding:8px;cursor:pointer;font-size:13px;white-space:normal}\r\n#kmlnf .geo-results button:hover{border-color:var(--accent);background:#fff}\r\n#kmlnf .slider{display:flex;align-items:center;gap:10px}\r\n#kmlnf .slider input{flex:1;accent-color:var(--accent)}\r\n#kmlnf .slider b{min-width:64px;text-align:right}\r\n#kmlnf .chips{display:flex;flex-wrap:wrap;gap:6px}\r\n#kmlnf .chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:999px;padding:5px 10px;font-size:13px;cursor:pointer;user-select:none;background:#fff;color:var(--ink)}\r\n#kmlnf .chip input{accent-color:var(--accent)}\r\n#kmlnf .kn-map{height:520px;width:100%;border-radius:var(--radius);border:1px solid var(--line);z-index:0;background:#e9eef3}\r\n@media(max-width:900px){#kmlnf .kn-map{height:380px}}\r\n#kmlnf .list{display:flex;flex-direction:column;gap:8px;max-height:520px;overflow:auto;padding-right:2px}\r\n#kmlnf .item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid var(--line);border-radius:12px;padding:10px;background:#fff;transition:.15s}\r\n#kmlnf .item:hover{border-color:#cfd5e3}\r\n#kmlnf .item.sel{border-color:var(--accent);background:#fff8f3}\r\n#kmlnf .item .n{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-weight:700;font-size:13px;background:#f1f3f8}\r\n#kmlnf .item.sel .n{background:var(--accent);color:#fff}\r\n#kmlnf .item .t{font-weight:600;overflow-wrap:anywhere}\r\n#kmlnf .item .d{font-size:12.5px;color:var(--muted);white-space:pre-line;max-height:3.9em;overflow:hidden;overflow-wrap:anywhere}\r\n#kmlnf .item .km{font-weight:700;font-size:13px;text-align:right}\r\n#kmlnf .item .km small{display:block;color:var(--muted);font-weight:500}\r\n#kmlnf .item .acts{grid-column:2\/4;display:flex;gap:6px;flex-wrap:wrap}\r\n#kmlnf .tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:999px;background:#eef0f6;color:var(--muted);margin-left:4px;font-weight:500}\r\n#kmlnf .route-bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}\r\n#kmlnf .empty{text-align:center;padding:24px 10px;color:var(--muted)}\r\n#kmlnf .steps{margin:6px 0 0;padding-left:18px;font-size:13px;color:var(--muted)}\r\n#kmlnf details>summary.muted{cursor:pointer;list-style:revert}\r\n#kmlnf .kn-foot{margin-top:14px;text-align:center}\r\n#kmlnf .guide{margin-bottom:14px;padding:0}\r\n#kmlnf .guide>summary{list-style:none;cursor:pointer;padding:14px 16px;font-weight:700;display:flex;align-items:center;gap:8px}\r\n#kmlnf .guide>summary::-webkit-details-marker{display:none}\r\n#kmlnf .guide>summary::after{content:\"\u25be\";margin-left:auto;color:var(--muted);transition:.2s}\r\n#kmlnf .guide[open]>summary::after{transform:rotate(180deg)}\r\n#kmlnf .guide-body{padding:0 16px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}\r\n#kmlnf .g-step{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fcfcfe}\r\n#kmlnf .g-step .g-n{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;background:var(--accent);color:#fff;font-weight:700;font-size:12px;margin-right:6px}\r\n#kmlnf .g-step b{font-size:14.5px}\r\n#kmlnf .g-step p,#kmlnf .g-step ul{margin:6px 0 0;font-size:13.5px;color:#3b4356}\r\n#kmlnf .g-step ul{padding-left:18px}\r\n#kmlnf .g-tips{grid-column:1\/-1;font-size:13px;color:var(--muted);background:#f1f3f8;border-radius:10px;padding:10px 12px}\r\n\/* markers *\/\r\n#kmlnf .home-pin{background:var(--ink);color:#fff;border-radius:50%;width:30px;height:30px;display:grid;place-items:center;font-size:16px;border:3px solid #fff;box-shadow:0 2px 8px rgba(0,0,0,.3)}\r\n#kmlnf .num-pin{background:#fff;color:var(--ink);border:2px solid var(--accent);border-radius:50%;width:26px;height:26px;display:grid;place-items:center;font-weight:700;font-size:12px;box-shadow:0 2px 6px rgba(0,0,0,.25)}\r\n#kmlnf .num-pin.sel{background:var(--accent);color:#fff;border-color:#fff}\r\n#kmlnf .dim-pin{width:10px;height:10px;border-radius:50%;background:#9aa3b5;border:2px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,.3)}\r\n\/* Leaflet vs. WordPress themes: themes set img{max-width:100%;height:auto}, which breaks map tiles *\/\r\n#kmlnf .leaflet-container img,#kmlnf .leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:256px;height:256px;padding:0!important;margin:0!important;border:0!important;box-shadow:none!important;border-radius:0!important}\r\n#kmlnf .leaflet-container .leaflet-marker-icon,#kmlnf .leaflet-container .leaflet-marker-shadow{width:auto;height:auto}\r\n#kmlnf .leaflet-container{font:13px\/1.4 system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif}\r\n#kmlnf .leaflet-bar a,#kmlnf .leaflet-bar a:hover{color:#1d2433;text-decoration:none;box-shadow:none;border-bottom:1px solid #ccc;line-height:30px}\r\n#kmlnf .leaflet-control-attribution a{color:#0078a8}\r\n#kmlnf .leaflet-popup-content{margin:10px 14px}\r\n#kmlnf .leaflet-popup-content p{margin:4px 0}\r\n#kmlnf .leaflet-pane,#kmlnf .leaflet-top,#kmlnf .leaflet-bottom{z-index:auto}\r\n#kmlnf .leaflet-tile-pane{z-index:200}#kmlnf .leaflet-overlay-pane{z-index:400}#kmlnf .leaflet-marker-pane{z-index:600}#kmlnf .leaflet-popup-pane{z-index:700}\r\n#kmlnf .leaflet-top,#kmlnf .leaflet-bottom{z-index:800}\r\n<\/style>\r\n<div id=\"kmlnf\">\r\n  <div class=\"kn-head\">\r\n    <div><div class=\"kn-title\"><span class=\"dot\"><\/span><span data-i=\"title\"><\/span><\/div><p class=\"subtitle\">Download your Google My Maps as KML, drop it here, enter your address \u2014 get the nearest stops and the shortest route.<\/p><\/div>\r\n    <button class=\"btn ghost sm\" id=\"kn-helpBtn\">\u2753 How to use<\/button>\r\n  <\/div>\r\n  <details class=\"card guide\" id=\"kn-guide\" open>\r\n    <summary>\ud83d\udcd8 How to use this tool<\/summary>\r\n    <div class=\"guide-body\">\r\n      <div class=\"g-step\"><span class=\"g-n\">1<\/span><b>Load the map data<\/b>\r\n        <p>Export the points from the Google My Maps map:<\/p>\r\n        <ul><li>Open the map and click <b>\u22ee<\/b> next to its title.<\/li>\r\n        <li>Choose <b>Download KML\/KMZ<\/b> \u2192 <b>Entire map<\/b>.<\/li>\r\n        <li>Tick <b>\u201cExport to a .KML file\u201d<\/b>, then <b>Download<\/b>.<\/li>\r\n        <li>Drag the file into the <b>Map data<\/b> box (or click it to browse).<\/li><\/ul>\r\n        <p>The data is remembered in this browser, so you only do this once.<\/p><\/div>\r\n      <div class=\"g-step\"><span class=\"g-n\">2<\/span><b>Set your home<\/b>\r\n        <ul><li>Type your address (e.g. <i>123 Portage Ave, Winnipeg<\/i>) and press <b>Find<\/b>.<\/li>\r\n        <li>Or tap <b>\ud83d\udccd Use my location<\/b>.<\/li>\r\n        <li>Or simply click anywhere on the map.<\/li><\/ul>\r\n        <p>If several matches appear, pick the right one from the list.<\/p><\/div>\r\n      <div class=\"g-step\"><span class=\"g-n\">3<\/span><b>Find stops near you<\/b>\r\n        <ul><li>Drag <b>Radius<\/b> to widen or narrow the search area (orange circle).<\/li>\r\n        <li><b>Show up to<\/b> limits how many stops are listed.<\/li>\r\n        <li>Use the <b>Layers<\/b> chips to show or hide categories.<\/li>\r\n        <li>Stops are numbered from nearest to farthest; tap a name to zoom to it.<\/li><\/ul><\/div>\r\n      <div class=\"g-step\"><span class=\"g-n\">4<\/span><b>Plan your route<\/b>\r\n        <ul><li>Click <b>+ Add to route<\/b> on the stops you want, or <b>Pick 8 nearest<\/b>.<\/li>\r\n        <li>The tool orders them into the shortest loop (purple dashed line).<\/li>\r\n        <li>Choose <b>Walking \/ Cycling \/ Driving<\/b> and toggle <b>Return home<\/b>.<\/li>\r\n        <li>Press <b>Open route in Google Maps<\/b> for turn-by-turn directions.<\/li><\/ul><\/div>\r\n      <div class=\"g-tips\">\ud83d\udca1 <b>Tips:<\/b> Distances and times are straight-line estimates \u2014 real routes are a little longer. Google Maps accepts up to 9 stops per route, so for longer trips split them into two routes. Use <b>Directions \u2197<\/b> on any stop to go straight there.<\/div>\r\n    <\/div>\r\n  <\/details>\r\n  <div class=\"grid\">\r\n    <!-- LEFT -->\r\n    <div class=\"stack\">\r\n      <div class=\"card stack\" id=\"kn-dataCard\">\r\n        <div class=\"kn-h2\" data-i=\"data\"><\/div>\r\n        <div class=\"drop\" id=\"kn-drop\">\r\n          <div style=\"font-size:26px\">\ud83d\uddfa\ufe0f<\/div>\r\n          <div><b data-i=\"dropTitle\"><\/b><\/div>\r\n          <div class=\"muted\" data-i=\"dropSub\"><\/div>\r\n          <input type=\"file\" id=\"kn-file\" accept=\".kml,.kmz\" style=\"display:none\">\r\n        <\/div>\r\n        <div id=\"kn-dataStatus\" class=\"status\" data-i=\"noData\"><\/div>\r\n        <details>\r\n          <summary class=\"muted\" style=\"cursor:pointer\" data-i=\"howTo\"><\/summary>\r\n          <ol class=\"steps\" id=\"kn-howSteps\"><\/ol>\r\n        <\/details>\r\n      <\/div>\r\n      <div class=\"card stack\">\r\n        <div class=\"kn-h2\" data-i=\"home\"><\/div>\r\n        <div class=\"row\">\r\n          <input type=\"text\" id=\"kn-addr\" autocomplete=\"street-address\">\r\n          <button class=\"btn\" id=\"kn-findBtn\" data-i=\"find\"><\/button>\r\n        <\/div>\r\n        <div class=\"row\">\r\n          <button class=\"btn ghost sm\" id=\"kn-gpsBtn\" data-i=\"gps\"><\/button>\r\n          <span class=\"muted\" style=\"align-self:center\" data-i=\"orClick\"><\/span>\r\n        <\/div>\r\n        <div class=\"geo-results\" id=\"kn-geoResults\"><\/div>\r\n        <div id=\"kn-homeStatus\" class=\"muted\"><\/div>\r\n      <\/div>\r\n      <div class=\"card stack\">\r\n        <div class=\"kn-h2\" data-i=\"filters\"><\/div>\r\n        <div class=\"slider\">\r\n          <span data-i=\"radius\"><\/span>\r\n          <input type=\"range\" id=\"kn-radius\" min=\"0.2\" max=\"10\" step=\"0.1\" value=\"1.5\">\r\n          <b id=\"kn-radiusVal\"><\/b>\r\n        <\/div>\r\n        <div class=\"slider\">\r\n          <span data-i=\"maxShow\"><\/span>\r\n          <input type=\"range\" id=\"kn-maxN\" min=\"5\" max=\"100\" step=\"5\" value=\"25\">\r\n          <b id=\"kn-maxNVal\"><\/b>\r\n        <\/div>\r\n        <div class=\"row\">\r\n          <span class=\"muted\" style=\"align-self:center\" data-i=\"mode\"><\/span>\r\n          <select id=\"kn-mode\">\r\n            <option value=\"walking\" data-i=\"walk\"><\/option>\r\n            <option value=\"driving\" data-i=\"drive\"><\/option>\r\n            <option value=\"bicycling\" data-i=\"bike\"><\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div>\r\n          <div class=\"muted\" style=\"margin-bottom:6px\" data-i=\"layers\"><\/div>\r\n          <div class=\"chips\" id=\"kn-layers\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <!-- RIGHT -->\r\n    <div class=\"stack\">\r\n      <div id=\"kn-map\" class=\"kn-map\"><\/div>\r\n      <div class=\"card stack\">\r\n        <div class=\"route-bar\">\r\n          <div class=\"kn-h2\" style=\"margin:0;flex:1\" id=\"kn-listTitle\"><\/div>\r\n          <button class=\"btn ghost sm\" id=\"kn-pickNear\" data-i=\"pickNear\"><\/button>\r\n          <button class=\"btn ghost sm\" id=\"kn-clearSel\" data-i=\"clear\"><\/button>\r\n          <label class=\"chip\"><input type=\"checkbox\" id=\"kn-roundTrip\" checked> <span data-i=\"roundTrip\"><\/span><\/label>\r\n          <button class=\"btn purple\" id=\"kn-routeBtn\" disabled><\/button>\r\n        <\/div>\r\n        <div id=\"kn-routeInfo\" class=\"muted\"><\/div>\r\n        <div class=\"list\" id=\"kn-list\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"kn-foot muted\" data-i=\"footer\"><\/div>\r\n<\/div>\r\n<script>\r\n(function boot(){\r\nif(!window.L){ return setTimeout(boot,150); }\r\n\/* ===== CONFIG =====\r\n * Optional: host your exported .kml\/.kmz on your own site and put the URL here,\r\n * so visitors never need to upload anything. Leave \"\" to use upload mode.\r\n * (The URL must be on the same domain or allow CORS.) *\/\r\nconst KML_URL = \"\";\r\nconst DEFAULT_CENTER = [49.8691, -97.1481]; \/\/ Winnipeg\r\nconst GEO_BIAS = { countrycodes:\"ca\", viewbox:\"-97.55,50.05,-96.80,49.70\" };\r\nconst MAX_GMAPS_STOPS = 9; \/\/ Google Maps link allows ~9 waypoints + destination\r\n\/* ===== i18n ===== *\/\r\nconst T = {\r\n vi:{title:\"T\u00ecm \u0111i\u1ec3m g\u1ea7n nh\u00e0\",data:\"D\u1eef li\u1ec7u b\u1ea3n \u0111\u1ed3\",dropTitle:\"K\u00e9o th\u1ea3 file KML\/KMZ v\u00e0o \u0111\u00e2y\",dropSub:\"ho\u1eb7c b\u1ea5m \u0111\u1ec3 ch\u1ecdn file xu\u1ea5t t\u1eeb Google My Maps\",\r\n  noData:\"Ch\u01b0a c\u00f3 d\u1eef li\u1ec7u \u0111i\u1ec3m.\",howTo:\"C\u00e1ch l\u1ea5y file KML t\u1eeb Google My Maps\",\r\n  steps:[\"M\u1edf b\u1ea3n \u0111\u1ed3 Google My Maps.\",\"B\u1ea5m \u22ee (ba ch\u1ea5m) c\u1ea1nh t\u00ean b\u1ea3n \u0111\u1ed3 \u2192 \u201cT\u1ea3i xu\u1ed1ng KML\/KMZ\u201d.\",\"Ch\u1ecdn \u201cTo\u00e0n b\u1ed9 b\u1ea3n \u0111\u1ed3\u201d, tick \u201cXu\u1ea5t sang t\u1ec7p .KML\u201d, b\u1ea5m T\u1ea3i xu\u1ed1ng.\",\"K\u00e9o file v\u1eeba t\u1ea3i v\u00e0o \u00f4 \u1edf tr\u00ean.\"],\r\n  home:\"\u0110\u1ecba ch\u1ec9 nh\u00e0 b\u1ea1n\",find:\"T\u00ecm\",gps:\"\ud83d\udccd D\u00f9ng v\u1ecb tr\u00ed c\u1ee7a t\u00f4i\",orClick:\"ho\u1eb7c b\u1ea5m l\u00ean b\u1ea3n \u0111\u1ed3\",\r\n  addrPh:\"VD: 123 Portage Ave, Winnipeg\",filters:\"B\u1ed9 l\u1ecdc\",radius:\"B\u00e1n k\u00ednh\",maxShow:\"Hi\u1ec3n th\u1ecb t\u1ed1i \u0111a\",mode:\"Di chuy\u1ec3n\",\r\n  walk:\"\u0110i b\u1ed9\",drive:\"L\u00e1i xe\",bike:\"Xe \u0111\u1ea1p\",layers:\"L\u1edbp (layer)\",pickNear:\"Ch\u1ecdn 8 \u0111i\u1ec3m g\u1ea7n nh\u1ea5t\",clear:\"B\u1ecf ch\u1ecdn\",roundTrip:\"Quay v\u1ec1 nh\u00e0\",\r\n  route:n=>`M\u1edf l\u1ed9 tr\u00ecnh (${n}) trong Google Maps`,routeNone:\"Ch\u1ecdn \u0111i\u1ec3m \u0111\u1ec3 t\u1ea1o l\u1ed9 tr\u00ecnh\",\r\n  listTitle:(a,b)=>`${a} \u0111i\u1ec3m trong b\u00e1n k\u00ednh \u00b7 ${b} \u0111i\u1ec3m t\u1ed5ng`,listNoHome:\"Danh s\u00e1ch \u0111i\u1ec3m\",\r\n  emptyNoData:\"T\u1ea3i file KML \u1edf khung b\u00ean tr\u00e1i \u0111\u1ec3 b\u1eaft \u0111\u1ea7u.\",emptyNoHome:\"Nh\u1eadp \u0111\u1ecba ch\u1ec9 nh\u00e0 \u0111\u1ec3 xem c\u00e1c \u0111i\u1ec3m g\u1ea7n nh\u1ea5t.\",emptyNone:\"Kh\u00f4ng c\u00f3 \u0111i\u1ec3m n\u00e0o trong b\u00e1n k\u00ednh n\u00e0y \u2014 th\u1eed t\u0103ng b\u00e1n k\u00ednh.\",\r\n  add:\"+ Th\u00eam v\u00e0o l\u1ed9 tr\u00ecnh\",remove:\"\u2212 B\u1ecf kh\u1ecfi l\u1ed9 tr\u00ecnh\",dir:\"Ch\u1ec9 \u0111\u01b0\u1eddng\",\r\n  loaded:(n,f)=>`\u0110\u00e3 t\u1ea3i ${n} \u0111i\u1ec3m t\u1eeb ${f} l\u1edbp.`,loadErr:\"Kh\u00f4ng \u0111\u1ecdc \u0111\u01b0\u1ee3c file. H\u00e3y d\u00f9ng file .kml ho\u1eb7c .kmz t\u1eeb My Maps.\",\r\n  searching:\"\u0110ang t\u00ecm\u2026\",notFound:\"Kh\u00f4ng t\u00ecm th\u1ea5y \u0111\u1ecba ch\u1ec9. Th\u1eed ghi r\u00f5 h\u01a1n (s\u1ed1 nh\u00e0, t\u00ean \u0111\u01b0\u1eddng, Winnipeg).\",homeSet:\"Nh\u00e0: \",\r\n  gpsErr:\"Kh\u00f4ng l\u1ea5y \u0111\u01b0\u1ee3c v\u1ecb tr\u00ed. H\u00e3y cho ph\u00e9p quy\u1ec1n v\u1ecb tr\u00ed ho\u1eb7c nh\u1eadp \u0111\u1ecba ch\u1ec9.\",myLoc:\"V\u1ecb tr\u00ed hi\u1ec7n t\u1ea1i\",pinned:\"\u0110i\u1ec3m \u0111\u00e3 ch\u1ecdn tr\u00ean b\u1ea3n \u0111\u1ed3\",\r\n  routeInfo:(km,n)=>`L\u1ed9 tr\u00ecnh t\u1ed1i \u01b0u ${n} \u0111i\u1ec3m \u00b7 kho\u1ea3ng ${km} (\u0111\u01b0\u1eddng chim bay)`,tooMany:`Google Maps ch\u1ec9 nh\u1eadn t\u1ed1i \u0111a ${MAX_GMAPS_STOPS} \u0111i\u1ec3m\/l\u1ea7n.`,\r\n  footer:\"Kho\u1ea3ng c\u00e1ch t\u00ednh theo \u0111\u01b0\u1eddng chim bay. \u0110\u1ecba ch\u1ec9 \u0111\u01b0\u1ee3c tra b\u1eb1ng OpenStreetMap Nominatim.\",untitled:\"(kh\u00f4ng t\u00ean)\"},\r\n en:{title:\"KML Nearby Finder & Route Planner\",data:\"Map data\",dropTitle:\"Drop a KML\/KMZ file here\",dropSub:\"or click to choose the file exported from Google My Maps\",\r\n  noData:\"No points loaded yet.\",howTo:\"Where do I get the KML file?\",\r\n  steps:[\"Open the Google My Maps map.\",\"Click \u22ee next to the map title \u2192 \u201cDownload KML\/KMZ\u201d.\",\"Choose \u201cEntire map\u201d, tick \u201cExport to a .KML file\u201d, click Download.\",\"Drop that file into the box above.\"],\r\n  home:\"Your home address\",find:\"Find\",gps:\"\ud83d\udccd Use my location\",orClick:\"or click on the map\",\r\n  addrPh:\"e.g. 123 Portage Ave, Winnipeg\",filters:\"Filters\",radius:\"Radius\",maxShow:\"Show up to\",mode:\"Travel\",\r\n  walk:\"Walking\",drive:\"Driving\",bike:\"Cycling\",layers:\"Layers\",pickNear:\"Pick 8 nearest\",clear:\"Clear\",roundTrip:\"Return home\",\r\n  route:n=>`Open route (${n}) in Google Maps`,routeNone:\"Select stops to build a route\",\r\n  listTitle:(a,b)=>`${a} stops within radius \u00b7 ${b} total`,listNoHome:\"Stops\",\r\n  emptyNoData:\"Load a KML file on the left to get started.\",emptyNoHome:\"Enter your home address to see the nearest stops.\",emptyNone:\"No stops within this radius \u2014 try widening it.\",\r\n  add:\"+ Add to route\",remove:\"\u2212 Remove\",dir:\"Directions\",\r\n  loaded:(n,f)=>`Loaded ${n} points from ${f} layer(s).`,loadErr:\"Couldn't read that file. Use a .kml or .kmz exported from My Maps.\",\r\n  searching:\"Searching\u2026\",notFound:\"Address not found. Try being more specific (number, street, Winnipeg).\",homeSet:\"Home: \",\r\n  gpsErr:\"Couldn't get your location. Allow location access or type an address.\",myLoc:\"Current location\",pinned:\"Point picked on map\",\r\n  routeInfo:(km,n)=>`Optimized route through ${n} stops \u00b7 about ${km} (straight-line)`,tooMany:`Google Maps accepts at most ${MAX_GMAPS_STOPS} stops per link.`,\r\n  footer:\"Distances are straight-line. Address lookup by OpenStreetMap Nominatim.\",untitled:\"(untitled)\"}\r\n};\r\nlet lang = \"en\";\r\nconst t = k => T[lang][k];\r\n\/* ===== state ===== *\/\r\nlet points = [];          \/\/ {id,name,desc,layer,lat,lng}\r\nlet layersOn = new Set();\r\nlet home = null;          \/\/ {lat,lng,label}\r\nlet selected = new Set(); \/\/ ids\r\nlet shown = [];           \/\/ currently listed (with dist)\r\n\/* ===== map ===== *\/\r\nconst map = L.map(\"kn-map\",{zoomControl:true}).setView(DEFAULT_CENTER,12);\r\nL.tileLayer(\"https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png\",{maxZoom:19,attribution:\"&copy; OpenStreetMap\"}).addTo(map);\r\nconst ptLayer = L.layerGroup().addTo(map);\r\nconst routeLayer = L.layerGroup().addTo(map);\r\nlet homeMarker=null, radiusCircle=null;\r\nmap.on(\"click\",e=>setHome(e.latlng.lat,e.latlng.lng,t(\"pinned\")));\r\nconst fixSize=()=>map.invalidateSize();\r\nwindow.addEventListener(\"load\",fixSize); window.addEventListener(\"resize\",fixSize);\r\n[300,1000,2500].forEach(ms=>setTimeout(fixSize,ms));\r\nif(window.ResizeObserver){ new ResizeObserver(fixSize).observe(document.getElementById(\"kn-map\")); }\r\n\/* ===== helpers ===== *\/\r\nconst $ = id=>document.getElementById(id);\r\nconst esc = s=>String(s).replace(\/[&<>\"']\/g,c=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]));\r\nfunction hav(a,b){const R=6371,r=x=>x*Math.PI\/180;const dLa=r(b.lat-a.lat),dLo=r(b.lng-a.lng);\r\n  const h=Math.sin(dLa\/2)**2+Math.cos(r(a.lat))*Math.cos(r(b.lat))*Math.sin(dLo\/2)**2;return 2*R*Math.asin(Math.sqrt(h));}\r\nconst fmtKm = km => km<1 ? Math.round(km*1000)+\" m\" : km.toFixed(km<10?2:1)+\" km\";\r\nfunction eta(km){const sp={walking:4.8,bicycling:15,driving:35}[$(\"kn-mode\").value];const m=Math.round(km*1.3\/sp*60);return m<60?m+\" min\":Math.floor(m\/60)+\"h \"+(m%60)+\"m\";}\r\nfunction htmlToText(h){if(!h)return\"\";const d=new DOMParser().parseFromString(String(h).replace(\/<br\\s*\\\/?>\/gi,\"\\n\"),\"text\/html\");return (d.body.textContent||\"\").trim();}\r\nfunction setStatus(el,msg,cls){el.className=\"status\"+(cls?\" \"+cls:\"\");el.textContent=msg;}\r\n\/* ===== KML ===== *\/\r\nfunction parseKML(text){\r\n  const doc=new DOMParser().parseFromString(text,\"text\/xml\");\r\n  if(doc.getElementsByTagName(\"parsererror\").length) throw new Error(\"bad xml\");\r\n  const out=[]; let i=0;\r\n  for(const pm of doc.getElementsByTagName(\"Placemark\")){\r\n    const coordEl=pm.getElementsByTagName(\"coordinates\")[0]; if(!coordEl) continue;\r\n    const pairs=coordEl.textContent.trim().split(\/\\s+\/).map(s=>s.split(\",\").map(Number)).filter(p=>p.length>=2&&!isNaN(p[0])&&!isNaN(p[1]));\r\n    if(!pairs.length) continue;\r\n    let lng=0,lat=0; pairs.forEach(p=>{lng+=p[0];lat+=p[1]}); lng\/=pairs.length; lat\/=pairs.length; \/\/ point or centroid\r\n    const nameEl=[...pm.children].find(c=>c.tagName===\"name\");\r\n    const descEl=[...pm.children].find(c=>c.tagName===\"description\");\r\n    let desc=htmlToText(descEl?descEl.textContent:\"\");\r\n    if(!desc){ \/\/ My Maps sometimes keeps fields only in ExtendedData\r\n      const ds=[...pm.getElementsByTagName(\"Data\")].map(d=>{const v=d.getElementsByTagName(\"value\")[0];return v&&v.textContent.trim()?`${d.getAttribute(\"name\")}: ${v.textContent.trim()}`:\"\"}).filter(Boolean);\r\n      desc=ds.join(\"\\n\");\r\n    }\r\n    let folder=pm.parentElement, layer=\"\";\r\n    while(folder&&folder.tagName!==\"Folder\"&&folder.tagName!==\"Document\") folder=folder.parentElement;\r\n    if(folder){const fn=[...folder.children].find(c=>c.tagName===\"name\"); layer=fn?fn.textContent.trim():\"\";}\r\n    out.push({id:i++,name:(nameEl&&nameEl.textContent.trim())||\"\",desc,layer:layer||\"Layer\",lat,lng});\r\n  }\r\n  return out;\r\n}\r\nasync function readFile(file){\r\n  let text;\r\n  if(\/\\.kmz$\/i.test(file.name)||file.type===\"application\/vnd.google-earth.kmz\"){\r\n    const zip=await JSZip.loadAsync(file);\r\n    const k=Object.keys(zip.files).find(n=>\/\\.kml$\/i.test(n)); if(!k) throw new Error(\"no kml\");\r\n    text=await zip.files[k].async(\"string\");\r\n  } else text=await file.text();\r\n  return text;\r\n}\r\nfunction loadPoints(list,sourceText){\r\n  points=list; selected.clear();\r\n  layersOn=new Set(points.map(p=>p.layer));\r\n  const n=layersOn.size;\r\n  setStatus($(\"kn-dataStatus\"),t(\"loaded\")(points.length,n),\"ok\");\r\n  try{ if(sourceText && sourceText.length<4.5e6) localStorage.setItem(\"nsf-kml\",sourceText);}catch(e){}\r\n  renderLayers();\r\n  if(points.length && !home){ map.fitBounds(L.latLngBounds(points.map(p=>[p.lat,p.lng])).pad(.1)); }\r\n  refresh();\r\n}\r\nasync function handleFile(file){\r\n  try{const txt=await readFile(file); const pts=parseKML(txt); if(!pts.length) throw new Error(\"empty\"); loadPoints(pts,txt);}\r\n  catch(e){setStatus($(\"kn-dataStatus\"),t(\"loadErr\"),\"err\");}\r\n}\r\nconst drop=$(\"kn-drop\");\r\ndrop.onclick=()=>$(\"kn-file\").click();\r\n$(\"kn-file\").onchange=e=>e.target.files[0]&&handleFile(e.target.files[0]);\r\n[\"dragenter\",\"dragover\"].forEach(ev=>drop.addEventListener(ev,e=>{e.preventDefault();drop.classList.add(\"over\")}));\r\n[\"dragleave\",\"drop\"].forEach(ev=>drop.addEventListener(ev,e=>{e.preventDefault();drop.classList.remove(\"over\")}));\r\ndrop.addEventListener(\"drop\",e=>{const f=e.dataTransfer.files[0]; if(f) handleFile(f);});\r\n\/* ===== layers ===== *\/\r\nfunction renderLayers(){\r\n  const box=$(\"kn-layers\"); box.innerHTML=\"\";\r\n  const counts={}; points.forEach(p=>counts[p.layer]=(counts[p.layer]||0)+1);\r\n  Object.keys(counts).forEach(name=>{\r\n    const lab=document.createElement(\"label\"); lab.className=\"chip\";\r\n    lab.innerHTML=`<input type=\"checkbox\" ${layersOn.has(name)?\"checked\":\"\"}> ${esc(name)} <span class=\"tag\">${counts[name]}<\/span>`;\r\n    lab.querySelector(\"input\").onchange=e=>{e.target.checked?layersOn.add(name):layersOn.delete(name);refresh();};\r\n    box.appendChild(lab);\r\n  });\r\n}\r\n\/* ===== home ===== *\/\r\nfunction setHome(lat,lng,label){\r\n  home={lat,lng,label};\r\n  $(\"kn-homeStatus\").textContent=t(\"homeSet\")+label;\r\n  $(\"kn-geoResults\").innerHTML=\"\";\r\n  try{localStorage.setItem(\"nsf-home\",JSON.stringify(home))}catch(e){}\r\n  refresh(true);\r\n}\r\nasync function geocode(){\r\n  const q=$(\"kn-addr\").value.trim(); if(!q) return;\r\n  const box=$(\"kn-geoResults\"); box.innerHTML=`<div class=\"muted\">${t(\"searching\")}<\/div>`;\r\n  try{\r\n    const u=`https:\/\/nominatim.openstreetmap.org\/search?format=json&limit=5&addressdetails=0&countrycodes=${GEO_BIAS.countrycodes}&viewbox=${GEO_BIAS.viewbox}&q=${encodeURIComponent(q)}`;\r\n    const r=await fetch(u,{headers:{\"Accept-Language\":lang}}); const js=await r.json();\r\n    if(!js.length){box.innerHTML=`<div class=\"status err\">${t(\"notFound\")}<\/div>`;return;}\r\n    if(js.length===1){setHome(+js[0].lat,+js[0].lon,js[0].display_name);return;}\r\n    box.innerHTML=\"\";\r\n    js.forEach(g=>{const b=document.createElement(\"button\");b.textContent=g.display_name;b.onclick=()=>setHome(+g.lat,+g.lon,g.display_name);box.appendChild(b);});\r\n  }catch(e){box.innerHTML=`<div class=\"status err\">${t(\"notFound\")}<\/div>`;}\r\n}\r\n$(\"kn-findBtn\").onclick=geocode;\r\n$(\"kn-addr\").addEventListener(\"keydown\",e=>{if(e.key===\"Enter\")geocode();});\r\n$(\"kn-gpsBtn\").onclick=()=>{\r\n  if(!navigator.geolocation){$(\"kn-homeStatus\").textContent=t(\"gpsErr\");return;}\r\n  navigator.geolocation.getCurrentPosition(p=>setHome(p.coords.latitude,p.coords.longitude,t(\"myLoc\")),()=>$(\"kn-homeStatus\").textContent=t(\"gpsErr\"),{enableHighAccuracy:true,timeout:10000});\r\n};\r\n\/* ===== filters ===== *\/\r\nfunction syncSliders(){ $(\"kn-radiusVal\").textContent=(+$(\"kn-radius\").value).toFixed(1)+\" km\"; $(\"kn-maxNVal\").textContent=$(\"kn-maxN\").value; }\r\n[\"kn-radius\",\"kn-maxN\"].forEach(id=>$(id).addEventListener(\"input\",()=>{syncSliders();refresh();}));\r\n$(\"kn-mode\").onchange=()=>refresh();\r\n$(\"kn-roundTrip\").onchange=()=>drawRoute();\r\n\/* ===== render ===== *\/\r\nfunction refresh(fit){\r\n  ptLayer.clearLayers();\r\n  const visible=points.filter(p=>layersOn.has(p.layer));\r\n  const rad=+$(\"kn-radius\").value, maxN=+$(\"kn-maxN\").value;\r\n  if(homeMarker){map.removeLayer(homeMarker);homeMarker=null;}\r\n  if(radiusCircle){map.removeLayer(radiusCircle);radiusCircle=null;}\r\n  if(home){\r\n    homeMarker=L.marker([home.lat,home.lng],{icon:L.divIcon({className:\"\",html:'<div class=\"home-pin\">\ud83c\udfe0<\/div>',iconSize:[30,30],iconAnchor:[15,15]}),zIndexOffset:1000}).addTo(map).bindPopup(esc(home.label));\r\n    radiusCircle=L.circle([home.lat,home.lng],{radius:rad*1000,color:\"#ff6a13\",weight:1.5,fillOpacity:.06}).addTo(map);\r\n    shown=visible.map(p=>({...p,dist:hav(home,p)})).filter(p=>p.dist<=rad).sort((a,b)=>a.dist-b.dist).slice(0,maxN);\r\n  } else shown=[];\r\n  const shownIds=new Set(shown.map(p=>p.id));\r\n  \/\/ background dots for everything else\r\n  visible.forEach(p=>{ if(shownIds.has(p.id)) return;\r\n    L.marker([p.lat,p.lng],{icon:L.divIcon({className:\"\",html:'<div class=\"dim-pin\"><\/div>',iconSize:[10,10],iconAnchor:[5,5]})})\r\n     .addTo(ptLayer).bindPopup(`<b>${esc(p.name||t(\"untitled\"))}<\/b>${p.desc?\"<br>\"+esc(p.desc).replace(\/\\n\/g,\"<br>\"):\"\"}`);\r\n  });\r\n  shown.forEach((p,i)=>{\r\n    const sel=selected.has(p.id);\r\n    L.marker([p.lat,p.lng],{icon:L.divIcon({className:\"\",html:`<div class=\"num-pin ${sel?\"sel\":\"\"}\">${i+1}<\/div>`,iconSize:[26,26],iconAnchor:[13,13]}),zIndexOffset:500})\r\n     .addTo(ptLayer).bindPopup(`<b>${esc(p.name||t(\"untitled\"))}<\/b><br>${fmtKm(p.dist)}${p.desc?\"<br>\"+esc(p.desc).replace(\/\\n\/g,\"<br>\"):\"\"}`)\r\n     .on(\"click\",()=>scrollToItem(p.id));\r\n  });\r\n  if(fit && home){\r\n    const b=L.latLngBounds([[home.lat,home.lng],...shown.map(p=>[p.lat,p.lng])]);\r\n    if(shown.length) map.fitBounds(b.pad(.15)); else map.fitBounds(radiusCircle.getBounds());\r\n  }\r\n  renderList(visible.length);\r\n  drawRoute();\r\n}\r\nfunction renderList(total){\r\n  const list=$(\"kn-list\"); list.innerHTML=\"\";\r\n  $(\"kn-listTitle\").textContent = home ? t(\"listTitle\")(shown.length,total) : t(\"listNoHome\");\r\n  if(!points.length){list.innerHTML=`<div class=\"empty\">${t(\"emptyNoData\")}<\/div>`;return;}\r\n  if(!home){list.innerHTML=`<div class=\"empty\">${t(\"emptyNoHome\")}<\/div>`;return;}\r\n  if(!shown.length){list.innerHTML=`<div class=\"empty\">${t(\"emptyNone\")}<\/div>`;return;}\r\n  const mode=$(\"kn-mode\").value;\r\n  shown.forEach((p,i)=>{\r\n    const sel=selected.has(p.id);\r\n    const el=document.createElement(\"div\"); el.className=\"item\"+(sel?\" sel\":\"\"); el.id=\"kn-it-\"+p.id;\r\n    const gdir=`https:\/\/www.google.com\/maps\/dir\/?api=1&origin=${home.lat},${home.lng}&destination=${p.lat},${p.lng}&travelmode=${mode}`;\r\n    el.innerHTML=`<div class=\"n\">${i+1}<\/div>\r\n      <div><div class=\"t\">${esc(p.name||t(\"untitled\"))}${layersOn.size>1?`<span class=\"tag\">${esc(p.layer)}<\/span>`:\"\"}<\/div>${p.desc?`<div class=\"d\">${esc(p.desc)}<\/div>`:\"\"}<\/div>\r\n      <div class=\"km\">${fmtKm(p.dist)}<small>~${eta(p.dist)}<\/small><\/div>\r\n      <div class=\"acts\"><button class=\"btn sm ${sel?\"ghost\":\"\"}\" data-a=\"tog\">${sel?t(\"remove\"):t(\"add\")}<\/button>\r\n      <a class=\"btn ghost sm\" style=\"text-decoration:none\" target=\"_blank\" rel=\"noopener\" href=\"${gdir}\">${t(\"dir\")} \u2197<\/a><\/div>`;\r\n    el.querySelector('[data-a=\"tog\"]').onclick=()=>{sel?selected.delete(p.id):selected.add(p.id);refresh();};\r\n    el.querySelector(\".t\").style.cursor=\"pointer\";\r\n    el.querySelector(\".t\").onclick=()=>map.setView([p.lat,p.lng],Math.max(map.getZoom(),16));\r\n    list.appendChild(el);\r\n  });\r\n}\r\nfunction scrollToItem(id){const el=$(\"kn-it-\"+id); if(el) el.scrollIntoView({behavior:\"smooth\",block:\"nearest\"});}\r\n\/* ===== route (nearest-neighbour + 2-opt) ===== *\/\r\nfunction orderStops(stops,round){\r\n  let rest=[...stops], cur=home, order=[];\r\n  while(rest.length){let bi=0,bd=Infinity;rest.forEach((s,i)=>{const d=hav(cur,s);if(d<bd){bd=d;bi=i}});cur=rest.splice(bi,1)[0];order.push(cur);}\r\n  const len=o=>{let d=0,c=home;o.forEach(s=>{d+=hav(c,s);c=s});if(round)d+=hav(c,home);return d;};\r\n  let improved=true;\r\n  while(improved){improved=false;\r\n    for(let i=0;i<order.length-1;i++)for(let j=i+1;j<order.length;j++){\r\n      const n=[...order.slice(0,i),...order.slice(i,j+1).reverse(),...order.slice(j+1)];\r\n      if(len(n)+1e-9<len(order)){order=n;improved=true;}\r\n    }}\r\n  return {order,km:len(order)};\r\n}\r\nfunction drawRoute(){\r\n  routeLayer.clearLayers();\r\n  const btn=$(\"kn-routeBtn\");\r\n  const stops=points.filter(p=>selected.has(p.id)&&layersOn.has(p.layer));\r\n  if(!home||!stops.length){btn.disabled=true;btn.textContent=t(\"routeNone\");$(\"kn-routeInfo\").textContent=\"\";return;}\r\n  const round=$(\"kn-roundTrip\").checked;\r\n  const {order,km}=orderStops(stops,round);\r\n  const path=[[home.lat,home.lng],...order.map(s=>[s.lat,s.lng])]; if(round) path.push([home.lat,home.lng]);\r\n  L.polyline(path,{color:\"#7c3aed\",weight:4,opacity:.8,dashArray:\"8 8\"}).addTo(routeLayer);\r\n  btn.disabled=false; btn.textContent=t(\"route\")(order.length);\r\n  $(\"kn-routeInfo\").textContent=t(\"routeInfo\")(fmtKm(km),order.length)+(order.length>MAX_GMAPS_STOPS?\" \u00b7 \"+t(\"tooMany\"):\"\");\r\n  btn.onclick=()=>{\r\n    const o=order.slice(0,MAX_GMAPS_STOPS);\r\n    const dest=round?`${home.lat},${home.lng}`:`${o[o.length-1].lat},${o[o.length-1].lng}`;\r\n    const wps=(round?o:o.slice(0,-1)).map(s=>`${s.lat},${s.lng}`).join(\"|\");\r\n    const url=`https:\/\/www.google.com\/maps\/dir\/?api=1&origin=${home.lat},${home.lng}&destination=${dest}${wps?\"&waypoints=\"+encodeURIComponent(wps):\"\"}&travelmode=${$(\"kn-mode\").value}`;\r\n    window.open(url,\"_blank\",\"noopener\");\r\n  };\r\n}\r\n$(\"kn-pickNear\").onclick=()=>{shown.slice(0,8).forEach(p=>selected.add(p.id));refresh();};\r\n$(\"kn-clearSel\").onclick=()=>{selected.clear();refresh();};\r\n\/* ===== language ===== *\/\r\nfunction applyLang(){\r\n  document.documentElement.lang=lang;\r\n  document.querySelectorAll(\"[data-i]\").forEach(el=>{const v=t(el.dataset.i); if(typeof v===\"string\") el.textContent=v;});\r\n  $(\"kn-addr\").placeholder=t(\"addrPh\");\r\n  $(\"kn-howSteps\").innerHTML=t(\"steps\").map(s=>`<li>${esc(s)}<\/li>`).join(\"\");\r\n  if(points.length) setStatus($(\"kn-dataStatus\"),t(\"loaded\")(points.length,new Set(points.map(p=>p.layer)).size),\"ok\");\r\n  if(home) $(\"kn-homeStatus\").textContent=t(\"homeSet\")+home.label;\r\n  refresh();\r\n}\r\n$(\"kn-helpBtn\").onclick=()=>{const g=$(\"kn-guide\");g.open=true;window.scrollTo({top:g.getBoundingClientRect().top+window.scrollY-90,behavior:\"smooth\"});};\r\n\/* ===== boot ===== *\/\r\nsyncSliders();\r\nif(window.innerWidth<700){ try{ if(!localStorage.getItem(\"nsf-kml\")) {} else $(\"kn-guide\").open=false; }catch(e){} }\r\ntry{const h=JSON.parse(localStorage.getItem(\"nsf-home\")||\"null\"); if(h&&isFinite(h.lat)) home=h;}catch(e){}\r\napplyLang();\r\n(async()=>{\r\n  if(KML_URL){\r\n    try{const r=await fetch(KML_URL); const blob=await r.blob(); const f=new File([blob],KML_URL.split(\"?\")[0].split(\"\/\").pop()||\"map.kml\");\r\n      const txt=await readFile(f); loadPoints(parseKML(txt),null); $(\"kn-dataCard\").style.display=\"none\"; return;}catch(e){}\r\n  }\r\n  try{const saved=localStorage.getItem(\"nsf-kml\"); if(saved){const p=parseKML(saved); if(p.length) loadPoints(p,null);}}catch(e){}\r\n})();\r\n})();\r\n<\/script><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":10744,"parent":4298,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10740","page","type-page","status-publish","has-post-thumbnail"],"rankMath":{"parentDomain":"ezcalculatoronline.com","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"kml-nearby-finder","permalinkFormat":"https:\/\/www.ezcalculatoronline.com\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/www.ezcalculatoronline.com\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"Find Nearest Points from Google My Maps \u2013 KML Nearby Finder","description":"Turn any Google My Maps into a \u201cnear me\u201d search. Drop in a KML file, type your address, and get nearby stops sorted by distance with a ready-made route.","focusKeywords":"KML Nearby Finder","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"Thien Nguyen","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/www.ezcalculatoronline.com","objectID":10740,"objectType":"post","locale":"en","localeFull":"en_US","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/dh_7btfqe\/ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/11\/EZCALCULATORONLINE-LOGO-2.png","customPermalinks":true,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fwww.ezcalculatoronline.com&r=https%3A%2F%2Fwww.ezcalculatoronline.com%2Fso%2Fwp-json%2Fwp%2Fv2%2Fpages%2F10740%3Fnonce%3De580bde76d","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/www.ezcalculatoronline.com\/wp-content\/uploads\/2025\/05\/cropped-ezcaculator-32x32.webp","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/www.ezcalculatoronline.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %sep% %sitedesc%","description":"%sitedesc%","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/10740","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/comments?post=10740"}],"version-history":[{"count":3,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/10740\/revisions"}],"predecessor-version":[{"id":10743,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/10740\/revisions\/10743"}],"up":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/pages\/4298"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media\/10744"}],"wp:attachment":[{"href":"https:\/\/www.ezcalculatoronline.com\/wp-json\/wp\/v2\/media?parent=10740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}