{"id":591,"date":"2026-04-30T21:36:00","date_gmt":"2026-04-30T21:36:00","guid":{"rendered":"https:\/\/investingora.com\/?page_id=591"},"modified":"2026-04-30T21:36:00","modified_gmt":"2026-04-30T21:36:00","slug":"market-data-%f0%9f%93%8a","status":"publish","type":"page","link":"https:\/\/investingora.com\/pt\/market-data-%f0%9f%93%8a\/","title":{"rendered":"MARKET DATA \ud83d\udcca"},"content":{"rendered":"\n<!-- ============================================================\n     investingora.com \u2014 MARKET DATA\n     WordPress Custom HTML Block \u2014 CSS Isolado \/ Sem depend\u00eancias\n     14 abas \u00b7 Dados ao vivo simulados \u00b7 Range bars \u00b7 Sparklines\n     ============================================================ -->\n\n<style>\n\/* \u2500\u2500 RESET ISOLADO \u2500\u2500 *\/\n#mktd,#mktd *,#mktd *::before,#mktd *::after{box-sizing:border-box;margin:0;padding:0}\n#mktd{\n  --w:#ffffff;--bg:#f6f6f4;--alt:#f0f0ec;--bdr:#e4e3dd;\n  --ink:#181816;--dim:#5f5f58;--muted:#a0a098;\n  --green:#1a8c5b;--gbg:#e8f5ee;\n  --red:#c0392b;--rbg:#fdecea;\n  --blue:#1855c8;\n  --gold:#b8920f;\n  --r:13px;--rs:8px;\n  --s1:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);\n  --s2:0 4px 18px rgba(0,0,0,.07),0 2px 6px rgba(0,0,0,.04);\n  font-family:'Segoe UI',system-ui,-apple-system,sans-serif;\n  font-size:13.5px;color:var(--ink);background:var(--bg);\n  width:100%;padding-bottom:32px;line-height:1.5;\n}\n\n\/* \u2500\u2500 HEADER \u2500\u2500 *\/\n#mktd .md-header{\n  background:var(--w);border-bottom:1px solid var(--bdr);\n  padding:0 28px;height:56px;\n  display:flex;align-items:center;justify-content:space-between;\n  box-shadow:var(--s1);\n}\n#mktd .md-logo{display:flex;align-items:center;gap:10px}\n#mktd .md-logo-icon{\n  width:32px;height:32px;background:var(--ink);border-radius:7px;\n  display:flex;align-items:center;justify-content:center;\n  color:#fff;font-size:11px;font-weight:900;\n}\n#mktd .md-logo-txt{font-size:18px;font-weight:900;letter-spacing:-.4px;color:var(--ink)}\n#mktd .md-logo-txt span{color:#c0392b}\n#mktd .md-hright{display:flex;align-items:center;gap:12px}\n#mktd .md-live{\n  display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;\n  color:var(--green);background:var(--gbg);padding:4px 11px;border-radius:20px;\n}\n#mktd .md-dot{width:7px;height:7px;background:var(--green);border-radius:50%;animation:md-pulse 2s infinite}\n@keyframes md-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}\n#mktd .md-ts{font-size:11.5px;color:var(--muted);font-family:'Courier New',monospace}\n\n\/* \u2500\u2500 TICKER \u2500\u2500 *\/\n#mktd .md-ticker{\n  background:var(--ink);height:30px;overflow:hidden;display:flex;align-items:center;\n}\n#mktd .md-ticker-inner{display:flex;white-space:nowrap;animation:md-scroll 55s linear infinite}\n#mktd .md-ticker-inner:hover{animation-play-state:paused}\n#mktd .md-ti{\n  display:inline-flex;align-items:center;gap:6px;padding:0 20px;\n  font-size:11px;font-family:'Courier New',monospace;\n  border-right:1px solid rgba(255,255,255,.09);\n}\n#mktd .md-ti b{color:#fff;font-weight:700}\n#mktd .md-ti .val{color:rgba(255,255,255,.65)}\n#mktd .md-ti .up{color:#4ed090}\n#mktd .md-ti .dn{color:#f07878}\n@keyframes md-scroll{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}\n\n\/* \u2500\u2500 TITLE BAR \u2500\u2500 *\/\n#mktd .md-title-bar{\n  background:var(--w);border-bottom:1px solid var(--bdr);\n  padding:16px 28px 0;\n}\n#mktd .md-page-title{\n  font-size:20px;font-weight:900;letter-spacing:-.4px;margin-bottom:14px;\n}\n\n\/* \u2500\u2500 TABS \u2500\u2500 *\/\n#mktd .md-tabs{\n  display:flex;gap:0;overflow-x:auto;scrollbar-width:none;\n  border-top:1px solid var(--bdr);\n}\n#mktd .md-tabs::-webkit-scrollbar{display:none}\n#mktd .md-tab{\n  font-family:inherit;font-size:12.5px;font-weight:600;\n  padding:10px 16px;border:none;background:none;cursor:pointer;\n  color:var(--dim);white-space:nowrap;\n  border-bottom:2.5px solid transparent;\n  transition:all .18s;flex-shrink:0;\n}\n#mktd .md-tab:hover{color:var(--ink);background:var(--alt)}\n#mktd .md-tab.on{color:var(--ink);border-bottom-color:var(--ink);background:none}\n#mktd .md-tab.active-chip{\n  background:var(--ink);color:#fff;border-radius:5px 5px 0 0;border-bottom-color:transparent;\n}\n\n\/* \u2500\u2500 CONTENT AREA \u2500\u2500 *\/\n#mktd .md-content{max-width:100%;padding:22px 24px}\n\n\/* \u2500\u2500 SECTION \u2500\u2500 *\/\n#mktd .md-section{margin-bottom:28px}\n#mktd .md-sec-title{\n  font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;\n  color:var(--muted);margin-bottom:12px;display:flex;align-items:center;gap:8px;\n}\n#mktd .md-sec-title::after{content:'';flex:1;height:1px;background:var(--bdr)}\n\n\/* \u2500\u2500 TABLE \u2500\u2500 *\/\n#mktd .md-tbl-wrap{\n  background:var(--w);border-radius:var(--r);\n  border:1px solid var(--bdr);box-shadow:var(--s1);\n  overflow:hidden;\n}\n#mktd table{width:100%;border-collapse:collapse}\n#mktd thead th{\n  text-align:left;font-size:11px;font-weight:700;letter-spacing:.07em;\n  text-transform:uppercase;color:var(--muted);\n  padding:9px 14px;background:var(--alt);\n  border-bottom:1px solid var(--bdr);white-space:nowrap;\n}\n#mktd thead th.right{text-align:right}\n#mktd thead th.center{text-align:center}\n#mktd tbody tr{border-bottom:1px solid var(--bdr);transition:background .12s}\n#mktd tbody tr:last-child{border-bottom:none}\n#mktd tbody tr:hover{background:var(--alt)}\n#mktd tbody td{padding:9px 14px;font-size:13px;vertical-align:middle;white-space:nowrap}\n#mktd tbody td.right{text-align:right}\n#mktd tbody td.center{text-align:center}\n#mktd .md-name{font-weight:600;color:var(--ink)}\n#mktd .md-sym{color:var(--blue);font-weight:700;font-family:'Courier New',monospace;font-size:12.5px;cursor:pointer}\n#mktd .md-sym:hover{text-decoration:underline}\n\n\/* \u2500\u2500 % CELLS \u2500\u2500 *\/\n#mktd .up{color:var(--green);font-weight:600;font-family:'Courier New',monospace;font-size:12.5px}\n#mktd .dn{color:var(--red);font-weight:600;font-family:'Courier New',monospace;font-size:12.5px}\n#mktd .nt{color:var(--dim);font-family:'Courier New',monospace;font-size:12.5px}\n#mktd .mono{font-family:'Courier New',monospace;font-size:12.5px;color:var(--dim)}\n\n\/* \u2500\u2500 RANGE BAR \u2500\u2500 *\/\n#mktd .md-range{display:flex;align-items:center;gap:5px;min-width:160px}\n#mktd .md-range .lo,.md-range .hi{font-family:'Courier New',monospace;font-size:11px;color:var(--dim);width:52px}\n#mktd .md-range .hi{text-align:right}\n#mktd .md-range-track{\n  flex:1;height:4px;background:var(--alt);border-radius:2px;\n  position:relative;min-width:60px;\n}\n#mktd .md-range-fill{\n  position:absolute;top:0;height:4px;background:var(--bdr);border-radius:2px;left:0;right:0;\n}\n#mktd .md-range-dot{\n  position:absolute;top:-3px;width:10px;height:10px;\n  background:var(--ink);border-radius:50%;border:2px solid var(--w);\n  transform:translateX(-50%);\n}\n\n\/* \u2500\u2500 SPARKLINE \u2500\u2500 *\/\n#mktd .md-spark{display:inline-flex;align-items:flex-end;gap:1.5px;height:22px;vertical-align:middle}\n#mktd .md-spark span{width:3px;border-radius:1px 1px 0 0;min-height:3px;transition:height .3s}\n\n\/* \u2500\u2500 BADGE \u2500\u2500 *\/\n#mktd .md-badge{\n  font-size:10px;font-weight:700;padding:2px 7px;border-radius:3px;\n  font-family:'Courier New',monospace;\n}\n#mktd .md-badge.up{background:var(--gbg);color:var(--green)}\n#mktd .md-badge.dn{background:var(--rbg);color:var(--red)}\n\n\/* \u2500\u2500 SORT HEADER \u2500\u2500 *\/\n#mktd .md-sort{cursor:pointer;user-select:none}\n#mktd .md-sort:hover{color:var(--ink)}\n#mktd .md-sort-arrow{font-size:9px;margin-left:3px;opacity:.5}\n\n\/* \u2500\u2500 SEARCH \/ FILTER ROW \u2500\u2500 *\/\n#mktd .md-filter-row{\n  display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap;\n}\n#mktd .md-search{\n  display:flex;align-items:center;gap:7px;background:var(--w);\n  border:1.5px solid var(--bdr);border-radius:var(--rs);\n  padding:6px 12px;transition:border-color .2s;\n}\n#mktd .md-search:focus-within{border-color:var(--ink)}\n#mktd .md-search input{\n  font-family:inherit;font-size:13px;color:var(--ink);\n  background:none;border:none;outline:none;width:200px;\n}\n#mktd .md-search input::placeholder{color:var(--muted)}\n#mktd .md-count{font-size:11.5px;color:var(--muted)}\n\n\/* \u2500\u2500 MINI SPARKLINE (inline SVG) \u2500\u2500 *\/\n#mktd .spark-svg{overflow:visible}\n\n\/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n@media(max-width:700px){\n  #mktd .md-content{padding:14px 12px}\n  #mktd .md-range{min-width:100px}\n  #mktd .md-range .lo,#mktd .md-range .hi{display:none}\n  #mktd thead th:nth-child(n+7){display:none}\n  #mktd tbody td:nth-child(n+7){display:none}\n  #mktd .md-header{padding:0 14px}\n  #mktd .md-title-bar{padding:12px 14px 0}\n}\n\n\/* \u2500\u2500 TAB PANELS \u2500\u2500 *\/\n#mktd .md-panel{display:none}\n#mktd .md-panel.active{display:block}\n\n\/* \u2500\u2500 LOADING \u2500\u2500 *\/\n#mktd .md-loading{\n  text-align:center;padding:40px;color:var(--muted);font-size:13px;\n  display:flex;align-items:center;justify-content:center;gap:10px;\n}\n#mktd .md-spin{\n  width:18px;height:18px;border:2px solid var(--bdr);\n  border-top-color:var(--ink);border-radius:50%;\n  animation:md-spin .8s linear infinite;\n}\n@keyframes md-spin{to{transform:rotate(360deg)}}\n\n\/* \u2500\u2500 CRYPTO ICONS \u2500\u2500 *\/\n#mktd .crypto-chip{\n  display:inline-flex;align-items:center;justify-content:center;\n  width:22px;height:22px;border-radius:50%;font-size:10px;font-weight:800;\n  margin-right:6px;flex-shrink:0;vertical-align:middle;\n}\n\n\/* \u2500\u2500 DIVIDEND YIELD \u2500\u2500 *\/\n#mktd .yield-bar{\n  display:inline-flex;align-items:center;gap:5px;min-width:80px;\n}\n#mktd .yield-track{\n  width:50px;height:5px;background:var(--alt);border-radius:3px;overflow:hidden;\n}\n#mktd .yield-fill{height:100%;background:var(--green);border-radius:3px}\n<\/style>\n\n<!-- \u2550\u2550\u2550\u2550 HTML \u2550\u2550\u2550\u2550 -->\n<div id=\"mktd\">\n\n  <!-- HEADER -->\n  <div class=\"md-header\">\n    <div class=\"md-logo\">\n      <div class=\"md-logo-icon\">IN<\/div>\n      <span class=\"md-logo-txt\">investing<span>ora.com<\/span><\/span>\n    <\/div>\n    <div class=\"md-hright\">\n      <div class=\"md-live\"><div class=\"md-dot\"><\/div>Ao vivo<\/div>\n      <span class=\"md-ts\" id=\"mdClock\">\u2014<\/span>\n    <\/div>\n  <\/div>\n\n  <!-- TICKER -->\n  <div class=\"md-ticker\"><div class=\"md-ticker-inner\" id=\"mdTicker\"><\/div><\/div>\n\n  <!-- TITLE + TABS -->\n  <div class=\"md-title-bar\">\n    <div class=\"md-page-title\">MARKET DATA<\/div>\n    <div class=\"md-tabs\" id=\"mdTabs\"><\/div>\n  <\/div>\n\n  <!-- CONTENT -->\n  <div class=\"md-content\" id=\"mdContent\">\n    <div class=\"md-loading\"><div class=\"md-spin\"><\/div> Carregando dados\u2026<\/div>\n  <\/div>\n\n<\/div><!-- \/#mktd -->\n\n<script>\n(function(){\n'use strict';\n\n\/\/ \u2500\u2500 CLOCK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction tick(){\n  const el=document.getElementById('mdClock');\n  if(el)el.textContent=new Date().toLocaleTimeString('pt-BR');\n}\nsetInterval(tick,1000);tick();\n\n\/\/ \u2500\u2500 HELPERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction pct(v,cls){\n  if(v===null||v===undefined)return'<span class=\"nt\">\u2014<\/span>';\n  const c=v>0?'up':v<0?'dn':'nt';\n  const s=v>0?'+':'';\n  return`<span class=\"${c}\">${s}${v.toFixed(2)}%<\/span>`;\n}\nfunction mono(v){return`<span class=\"mono\">${v}<\/span>`}\nfunction rnd(v,d=2){return(Math.round(v*Math.pow(10,d))\/Math.pow(10,d)).toFixed(d)}\n\n\/\/ \u2500\u2500 RANGE BAR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction rangebar(lo,cur,hi){\n  const pct=Math.max(0,Math.min(100,((cur-lo)\/(hi-lo))*100));\n  return`<div class=\"md-range\">\n    <span class=\"lo\">${lo}<\/span>\n    <div class=\"md-range-track\">\n      <div class=\"md-range-fill\"><\/div>\n      <div class=\"md-range-dot\" style=\"left:${pct}%\"><\/div>\n    <\/div>\n    <span class=\"hi\">${hi}<\/span>\n  <\/div>`;\n}\n\n\/\/ \u2500\u2500 SPARKLINE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction spark(arr,up){\n  const mx=Math.max(...arr),mn=Math.min(...arr);\n  const color=up?'#1a8c5b':'#c0392b';\n  const bars=arr.map(v=>{\n    const h=mn===mx?12:Math.round(((v-mn)\/(mx-mn))*16+4);\n    return`<span style=\"height:${h}px;background:${color};opacity:.7\"><\/span>`;\n  }).join('');\n  return`<div class=\"md-spark\">${bars}<\/div>`;\n}\n\nfunction randSpark(trend){\n  const arr=[];let v=50;\n  for(let i=0;i<8;i++){v+=((Math.random()-.4+(trend*.15))*8);v=Math.max(10,Math.min(90,v));arr.push(v);}\n  return arr;\n}\n\n\/\/ \u2500\u2500 FLUCTUATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction fluct(v,pct=0.003){return+(v*(1+(Math.random()-.5)*pct)).toFixed(2)}\nfunction flpct(v){return+(v+(Math.random()-.5)*0.15).toFixed(2)}\n\n\/\/ \u2500\u2500 TICKER DATA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst TICKER_ITEMS=[\n  {n:'S&#038;P 500',v:5842.3,ch:0.99},{n:'NASDAQ',v:18543.2,ch:0.93},{n:'DJIA',v:43821.4,ch:1.63},\n  {n:'BTC',v:94320,ch:2.14},{n:'ETH',v:3280,ch:1.87},{n:'Gold',v:2412.5,ch:-0.31},\n  {n:'Oil WTI',v:78.42,ch:0.58},{n:'EUR\/USD',v:1.0842,ch:0.15},{n:'USD\/BRL',v:5.03,ch:0.41},\n  {n:'10Y UST',v:4.32,ch:-0.08},{n:'VIX',v:14.82,ch:-3.21},{n:'Silver',v:28.14,ch:0.62},\n];\n\nfunction buildTicker(){\n  const items=[...TICKER_ITEMS,...TICKER_ITEMS];\n  document.getElementById('mdTicker').innerHTML=items.map(x=>{\n    const cls=x.ch>0?'up':x.ch<0?'dn':'';\n    const arr=x.ch>0?'\u25b2':x.ch<0?'\u25bc':'';\n    return`<div class=\"md-ti\"><b>${x.n}<\/b><span class=\"val\">${x.v.toLocaleString('en-US',{maximumFractionDigits:2})}<\/span><span class=\"${cls}\">${arr}${Math.abs(x.ch).toFixed(2)}%<\/span><\/div>`;\n  }).join('');\n}\n\n\/\/ \u2500\u2500 TAB DEFINITIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst TABS=[\n  {id:'key',    label:'Key Market Data', chip:true},\n  {id:'bonds',  label:'Bonds'},\n  {id:'commod', label:'Commodities'},\n  {id:'country',label:'Countries'},\n  {id:'crypto', label:'Cryptocurrency'},\n  {id:'curr',   label:'Currencies'},\n  {id:'div_aris',label:'Dividend Aristocrats'},\n  {id:'div_champ',label:'Dividend Champions'},\n  {id:'divs',   label:'Dividends'},\n  {id:'earn',   label:'Earnings Calendar'},\n  {id:'em',     label:'Emerging Markets'},\n  {id:'etf_str',label:'ETF Strategies'},\n  {id:'global', label:'Global & Regional'},\n  {id:'gvv',    label:'Growth vs. Value'},\n  {id:'mcap',   label:'Market Cap'},\n];\n\nlet activeTab='key';\n\n\/\/ \u2500\u2500 BUILD TABS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction buildTabs(){\n  document.getElementById('mdTabs').innerHTML=TABS.map(t=>`\n    <button class=\"md-tab${t.chip?' active-chip':''}${t.id===activeTab?' on':''}\" onclick=\"mdSwitch('${t.id}')\">${t.label}<\/button>\n  `).join('');\n}\n\n\/\/ \u2500\u2500 STANDARD TABLE BUILDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction stdTable(rows,extraCols){\n  const hdr=`<thead><tr>\n    <th>Name<\/th><th>Symbol<\/th>\n    <th class=\"right\">Today<\/th><th class=\"right\">5 Days<\/th>\n    <th class=\"right\">1 Month<\/th><th class=\"right\">YTD<\/th>\n    <th class=\"right\">1 Year<\/th><th class=\"right\">3 Years<\/th>\n    ${extraCols?extraCols.map(c=>`<th class=\"center\">${c}<\/th>`).join(''):''}\n    <th class=\"center\">Day Range<\/th><th class=\"center\">52 Week Range<\/th>\n  <\/tr><\/thead>`;\n  const body=rows.map(r=>{\n    const s=r.spark||randSpark(r.d1>0?1:-1);\n    const extra=r.extra?r.extra.map(e=>`<td class=\"center\">${e}<\/td>`).join(''):'';\n    return`<tr>\n      <td><span class=\"md-name\">${r.name}<\/span><\/td>\n      <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n      <td class=\"right\">${pct(r.d1)}<\/td>\n      <td class=\"right\">${pct(r.d5)}<\/td>\n      <td class=\"right\">${pct(r.m1)}<\/td>\n      <td class=\"right\">${pct(r.ytd)}<\/td>\n      <td class=\"right\">${pct(r.y1)}<\/td>\n      <td class=\"right\">${pct(r.y3)}<\/td>\n      ${extra}\n      <td class=\"center\">${rangebar(r.dlo,r.cur,r.dhi)}<\/td>\n      <td class=\"center\">${rangebar(r.wlo,r.cur,r.whi)}<\/td>\n    <\/tr>`;\n  }).join('');\n  return`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`;\n}\n\nfunction section(title,html){\n  return`<div class=\"md-section\"><div class=\"md-sec-title\">${title}<\/div>${html}<\/div>`;\n}\n\nfunction searchFilter(panelId){\n  return`<div class=\"md-filter-row\">\n    <div class=\"md-search\"><span style=\"color:var(--muted)\">\ud83d\udd0d<\/span>\n      <input type=\"text\" placeholder=\"Filtrar\u2026\" oninput=\"mdFilter(this,'${panelId}')\">\n    <\/div>\n    <span class=\"md-count\" id=\"cnt-${panelId}\"><\/span>\n  <\/div>`;\n}\n\n\/\/ \u2500\u2500 DATA SETS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\/\/ KEY MARKET DATA\nconst KEY_EQUITIES=[\n  {name:'S&P 500',     sym:'SPY', d1:0.99,d5:-0.33,m1:12.22,ytd:4.35,y1:28.37,y3:71.08, cur:719.45,dlo:710.45,dhi:719.79,wlo:556.04,whi:715.63},\n  {name:'DJIA',        sym:'DIA', d1:1.63,d5:-0.72,m1:8.26, ytd:1.69,y1:20.60,y3:43.29, cur:493.10,dlo:480.39,dhi:497.98,wlo:407.02,whi:505.30},\n  {name:'NASDAQ 100',  sym:'QQQ', d1:0.93,d5:-0.35,m1:17.60,ytd:7.69,y1:39.12,y3:105.10,cur:663.90,dlo:657.56,dhi:668.90,wlo:476.78,whi:664.51},\n  {name:'Mid Cap',     sym:'MDY', d1:1.66,d5:-1.68,m1:8.20, ytd:8.29,y1:23.49,y3:43.67, cur:661.24,dlo:655.05,dhi:664.98,wlo:519.78,whi:675.77},\n  {name:'Small Cap',   sym:'IJR', d1:1.76,d5:-1.15,m1:10.66,ytd:12.11,y1:33.61,y3:43.33,cur:136.82,dlo:134.89,dhi:137.39,wlo:99.65,whi:137.34},\n  {name:'Micro Cap',   sym:'IWC', d1:2.84,d5:-3.07,m1:11.20,ytd:10.45,y1:56.37,y3:71.59,cur:170.20,dlo:175.42,dhi:170.69,wlo:109.56,whi:182.95},\n];\nconst KEY_SECTORS=[\n  {name:'Technology',        sym:'XLK', d1:0.25,d5:-0.69,m1:22.47,ytd:10.52,y1:52.19,y3:110.98,cur:175.50,dlo:166.88,dhi:180.80,wlo:105.81,whi:180.62},\n  {name:'Healthcare',        sym:'XLV', d1:2.21,d5:-0.93,m1:-0.29,ytd:-7.73,y1:2.56, y3:8.97,  cur:144.20,dlo:143.66,dhi:146.29,wlo:127.35,whi:160.59},\n  {name:'Consumer Staples',  sym:'XLP', d1:1.68,d5:-0.37,m1:1.39, ytd:6.75, y1:2.07, y3:7.08,  cur:79.50, dlo:83.18, dhi:84.44, wlo:75.16, whi:90.14},\n  {name:'Utilities',         sym:'XLU', d1:2.56,d5:-1.08,m1:0.20, ytd:7.00, y1:15.21,y3:32.44, cur:78.10, dlo:45.85, dhi:46.89, wlo:39.06, whi:47.80},\n  {name:'Consumer Discr.',   sym:'XLY', d1:1.29,d5:-1.58,m1:10.56,ytd:-2.15,y1:17.39,y3:58.04, cur:117.90,dlo:116.43,dhi:118.67,wlo:98.34, whi:125.01},\n  {name:'Communication Svcs',sym:'XLC', d1:1.06,d5:-0.22,m1:7.71, ytd:-2.06,y1:20.84,y3:92.47, cur:115.70,dlo:114.70,dhi:116.67,wlo:95.67, whi:120.41},\n  {name:'Basic Materials',   sym:'XLB', d1:1.00,d5:-1.85,m1:4.19, ytd:12.37,y1:22.12,y3:28.53, cur:51.10, dlo:50.80, dhi:51.71, wlo:41.45, whi:64.14},\n  {name:'Financial Services',sym:'XLF', d1:0.40,d5:0.97, m1:8.60, ytd:-6.20,y1:6.08, y3:58.53, cur:51.80, dlo:51.20, dhi:52.25, wlo:47.67, whi:56.52},\n  {name:'Industrials',       sym:'XLI', d1:2.74,d5:-1.47,m1:6.74, ytd:9.55, y1:30.43,y3:69.93, cur:173.10,dlo:171.14,dhi:174.82,wlo:131.25,whi:179.31},\n  {name:'Energy',            sym:'XLE', d1:1.05,d5:3.80, m1:-5.64,ytd:32.03,y1:42.71,y3:38.68, cur:58.80, dlo:57.94, dhi:59.84, wlo:39.92, whi:63.46},\n  {name:'Real Estate',       sym:'XLRE',d1:1.74,d5:-0.43,m1:9.07, ytd:8.15, y1:6.15, y3:15.60, cur:44.10, dlo:43.50, dhi:44.48, wlo:39.73, whi:44.65},\n];\nconst KEY_FACTORS=[\n  {name:'Value',        sym:'IUSV',d1:1.28,d5:-0.01,m1:6.52, ytd:4.31, y1:20.52,y3:42.78,cur:107.20,dlo:106.85,dhi:108.53,wlo:88.67,whi:108.20},\n  {name:'Growth',       sym:'IUSG',d1:0.81,d5:-0.80,m1:17.14,ytd:4.87, y1:35.75,y3:95.71,cur:176.40,dlo:174.86,dhi:177.82,wlo:130.78,whi:178.49},\n  {name:'Quality',      sym:'QUAL',d1:0.72,d5:-0.79,m1:9.88, ytd:3.59, y1:21.83,y3:63.08,cur:206.70,dlo:205.00,dhi:207.55,wlo:169.23,whi:207.72},\n  {name:'Low Volatility',sym:'USMV',d1:0.81,d5:-0.21,m1:3.03,ytd:-0.30,y1:2.20, y3:27.17,cur:93.90, dlo:93.59, dhi:94.70, wlo:91.02, whi:98.07},\n  {name:'Momentum',     sym:'MTUM',d1:1.14,d5:-0.55,m1:14.22,ytd:6.88, y1:38.41,y3:82.30,cur:224.30,dlo:222.10,dhi:225.80,wlo:178.90,whi:228.40},\n  {name:'Dividend',     sym:'DVY', d1:0.92,d5:0.31, m1:3.48, ytd:3.22, y1:9.84, y3:18.72,cur:121.80,dlo:120.90,dhi:122.60,wlo:107.20,whi:123.40},\n];\n\n\/\/ BONDS\nconst BONDS_DATA=[\n  {name:'Total Bond Market',     sym:'BND', d1:-0.12,d5:-0.42,m1:0.82,ytd:1.34,y1:4.12,y3:-5.21,cur:73.4, dlo:73.1, dhi:73.6, wlo:70.2,whi:74.8},\n  {name:'Short Term Treasury',   sym:'SHY', d1:-0.03,d5:-0.09,m1:0.38,ytd:0.92,y1:3.84,y3:-0.82,cur:81.2, dlo:81.0, dhi:81.3, wlo:79.8,whi:82.1},\n  {name:'Intermediate Treasury', sym:'IEF', d1:-0.18,d5:-0.61,m1:1.02,ytd:1.78,y1:3.42,y3:-8.90,cur:93.5, dlo:93.1, dhi:93.8, wlo:87.4,whi:96.2},\n  {name:'Long Term Treasury',    sym:'TLT', d1:-0.54,d5:-1.82,m1:2.14,ytd:2.90,y1:1.82,y3:-24.10,cur:87.3,dlo:86.2, dhi:87.9, wlo:78.0,whi:102.4},\n  {name:'TIPS',                  sym:'TIP', d1:-0.08,d5:-0.28,m1:0.64,ytd:2.12,y1:3.88,y3:-3.40,cur:107.8,dlo:107.4,dhi:108.1,wlo:102.6,whi:109.8},\n  {name:'Corporate Bonds',       sym:'LQD', d1:-0.14,d5:-0.48,m1:1.10,ytd:1.64,y1:4.88,y3:-7.20,cur:107.2,dlo:106.8,dhi:107.5,wlo:100.4,whi:110.2},\n  {name:'High Yield Corporate',  sym:'HYG', d1:0.08, d5:-0.21,m1:1.42,ytd:2.80,y1:8.42,y3:3.80, cur:77.8, dlo:77.4, dhi:78.1, wlo:72.8,whi:79.4},\n  {name:'Municipal Bonds',       sym:'MUB', d1:-0.04,d5:-0.18,m1:0.72,ytd:0.48,y1:2.84,y3:-2.80,cur:105.4,dlo:105.1,dhi:105.7,wlo:100.2,whi:107.8},\n  {name:'Emerging Markets Bonds',sym:'EMB', d1:0.12, d5:-0.32,m1:1.48,ytd:2.14,y1:5.82,y3:-4.40,cur:88.2, dlo:87.8, dhi:88.6, wlo:82.4,whi:91.4},\n  {name:'Floating Rate',         sym:'FLOT',d1:0.02, d5:0.06, m1:0.28,ytd:0.82,y1:5.14,y3:6.20, cur:50.8, dlo:50.7, dhi:50.9, wlo:49.8,whi:51.4},\n];\n\n\/\/ COMMODITIES\nconst COMMOD_DATA=[\n  {name:'Commodities Broad',  sym:'PDBC',d1:-0.42,d5:1.12,m1:-2.10,ytd:5.40,y1:8.20,y3:14.80,cur:15.8,dlo:15.6,dhi:16.0,wlo:13.2,whi:17.4},\n  {name:'Gold',               sym:'GLD', d1:-0.31,d5:1.82,m1:6.40,ytd:14.20,y1:18.40,y3:38.60,cur:225.4,dlo:224.1,dhi:226.8,wlo:175.4,whi:228.4},\n  {name:'Silver',             sym:'SLV', d1:0.62, d5:2.14,m1:4.80,ytd:12.40,y1:22.80,y3:28.40,cur:26.4,dlo:25.8,dhi:26.9,wlo:19.8,whi:28.2},\n  {name:'Oil (WTI)',          sym:'USO', d1:0.58, d5:3.42,m1:-4.20,ytd:-8.40,y1:-12.80,y3:2.40,cur:72.4,dlo:71.2,dhi:73.4,wlo:61.8,whi:88.4},\n  {name:'Natural Gas',        sym:'UNG', d1:1.82, d5:4.20,m1:-8.40,ytd:-18.40,y1:14.80,y3:-42.40,cur:14.2,dlo:13.8,dhi:14.6,wlo:10.4,whi:28.8},\n  {name:'Copper',             sym:'CPER',d1:0.92, d5:1.68,m1:3.40,ytd:8.20,y1:14.60,y3:28.40,cur:23.4,dlo:23.0,dhi:23.8,wlo:18.4,whi:24.8},\n  {name:'Agriculture',        sym:'DBA', d1:-0.14,d5:0.42,m1:1.20,ytd:4.80,y1:2.40,y3:18.80,cur:22.4,dlo:22.1,dhi:22.7,wlo:19.8,whi:23.6},\n  {name:'Platinum',           sym:'PPLT',d1:0.28, d5:1.14,m1:4.20,ytd:7.80,y1:6.40,y3:8.20,cur:92.4,dlo:91.2,dhi:93.4,wlo:78.8,whi:98.4},\n  {name:'Palladium',          sym:'PALL',d1:-1.12,d5:-2.40,m1:-3.80,ytd:-14.40,y1:-28.40,y3:-42.80,cur:14.2,dlo:14.8,dhi:16.1,wlo:12.4,whi:24.8},\n  {name:'Lumber',             sym:'WOOD',d1:0.42, d5:1.28,m1:2.80,ytd:3.40,y1:8.20,y3:4.80,cur:72.4,dlo:71.8,dhi:73.2,wlo:62.4,whi:78.8},\n];\n\n\/\/ COUNTRIES\nconst COUNTRY_DATA=[\n  {name:'United States', sym:'SPY', d1:0.99,d5:-0.33,m1:12.22,ytd:4.35,y1:28.37,y3:71.08,cur:573.4,dlo:568.2,dhi:575.8,wlo:442.4,whi:578.4},\n  {name:'China',         sym:'MCHI',d1:0.42,d5:1.82,m1:14.80,ytd:12.40,y1:18.80,y3:-8.40,cur:54.8,dlo:53.8,dhi:55.2,wlo:38.4,whi:56.8},\n  {name:'Japan',         sym:'EWJ', d1:1.14,d5:0.82,m1:6.40,ytd:4.80,y1:12.40,y3:24.80,cur:72.4,dlo:71.4,dhi:73.2,wlo:58.4,whi:74.8},\n  {name:'Germany',       sym:'EWG', d1:1.82,d5:1.14,m1:10.40,ytd:14.80,y1:22.40,y3:28.40,cur:34.8,dlo:34.2,dhi:35.4,wlo:24.8,whi:36.2},\n  {name:'United Kingdom',sym:'EWU', d1:0.82,d5:0.42,m1:4.80,ytd:8.40,y1:14.80,y3:18.40,cur:34.2,dlo:33.8,dhi:34.6,wlo:28.4,whi:35.4},\n  {name:'India',         sym:'INDA',d1:1.42,d5:2.14,m1:8.80,ytd:6.40,y1:24.80,y3:42.40,cur:48.4,dlo:47.8,dhi:49.2,wlo:36.4,whi:50.8},\n  {name:'Brazil',        sym:'EWZ', d1:2.14,d5:0.82,m1:4.40,ytd:-8.40,y1:-12.40,y3:-4.80,cur:28.4,dlo:27.8,dhi:29.2,wlo:24.4,whi:38.4},\n  {name:'Canada',        sym:'EWC', d1:0.92,d5:0.28,m1:5.80,ytd:4.40,y1:14.40,y3:22.80,cur:38.4,dlo:37.8,dhi:39.0,wlo:31.4,whi:40.8},\n  {name:'Australia',     sym:'EWA', d1:0.72,d5:0.42,m1:4.20,ytd:2.80,y1:10.80,y3:16.40,cur:28.4,dlo:27.8,dhi:29.0,wlo:22.8,whi:30.4},\n  {name:'South Korea',   sym:'EWY', d1:0.42,d5:1.14,m1:6.40,ytd:4.80,y1:8.40,y3:4.80,cur:62.4,dlo:61.4,dhi:63.4,wlo:52.4,whi:68.4},\n  {name:'France',        sym:'EWQ', d1:1.42,d5:0.82,m1:9.40,ytd:12.40,y1:18.40,y3:22.40,cur:32.4,dlo:31.8,dhi:33.0,wlo:24.8,whi:34.4},\n  {name:'Mexico',        sym:'EWW', d1:1.14,d5:-0.42,m1:2.80,ytd:-14.40,y1:-18.40,y3:-8.40,cur:48.4,dlo:47.4,dhi:49.2,wlo:42.4,whi:68.4},\n];\n\n\/\/ CRYPTOCURRENCY\nconst CRYPTO_DATA=[\n  {name:'Bitcoin',      sym:'BTC', d1:2.14,d5:4.80,m1:18.40,ytd:42.40,y1:124.80,y3:184.40,cur:94320,dlo:92100,dhi:95800,wlo:38400,whi:98400,icon:'\u20bf',ic:'#F7931A',ib:'#fff4e6'},\n  {name:'Ethereum',     sym:'ETH', d1:1.87,d5:3.42,m1:14.80,ytd:28.40,y1:84.80,y3:124.40,cur:3280,dlo:3180,dhi:3340,wlo:1480,whi:4080,icon:'\u039e',ic:'#627EEA',ib:'#eef0ff'},\n  {name:'Solana',       sym:'SOL', d1:3.21,d5:5.82,m1:22.40,ytd:64.40,y1:184.80,y3:824.40,cur:182,dlo:174,dhi:188,wlo:18.4,whi:258,icon:'\u25ce',ic:'#9945FF',ib:'#f5efff'},\n  {name:'BNB',          sym:'BNB', d1:0.92,d5:1.82,m1:8.40,ytd:14.80,y1:42.40,y3:84.40,cur:605,dlo:592,dhi:614,wlo:202,whi:724,icon:'\u25c6',ic:'#F3BA2F',ib:'#fffaec'},\n  {name:'XRP',          sym:'XRP', d1:1.45,d5:2.80,m1:12.40,ytd:84.40,y1:284.80,y3:124.40,cur:0.58,dlo:0.56,dhi:0.60,wlo:0.44,whi:3.84,icon:'\u2715',ic:'#00AAE4',ib:'#e6f7ff'},\n  {name:'Cardano',      sym:'ADA', d1:-0.73,d5:1.42,m1:8.80,ytd:42.40,y1:84.80,y3:-24.40,cur:0.48,dlo:0.46,dhi:0.50,wlo:0.24,whi:0.94,icon:'\u2b21',ic:'#0033AD',ib:'#eef1ff'},\n  {name:'Dogecoin',     sym:'DOGE',d1:4.21,d5:8.40,m1:24.80,ytd:124.40,y1:184.80,y3:84.40,cur:0.142,dlo:0.134,dhi:0.152,wlo:0.058,whi:0.244,icon:'\u00d0',ic:'#C2A633',ib:'#fafaec'},\n  {name:'Polkadot',     sym:'DOT', d1:-1.12,d5:0.82,m1:4.40,ytd:14.40,y1:28.40,y3:-48.40,cur:7.8,dlo:7.5,dhi:8.1,wlo:4.2,whi:12.4,icon:'\u25cf',ic:'#E6007A',ib:'#ffe8f5'},\n  {name:'Chainlink',    sym:'LINK',d1:1.14,d5:2.80,m1:14.80,ytd:28.40,y1:64.80,y3:84.40,cur:14.8,dlo:14.2,dhi:15.4,wlo:6.4,whi:22.4,icon:'\u2b21',ic:'#375BD2',ib:'#eef1ff'},\n  {name:'Avalanche',    sym:'AVAX',d1:2.42,d5:4.80,m1:18.40,ytd:42.40,y1:84.80,y3:124.40,cur:38.4,dlo:36.8,dhi:39.8,wlo:12.4,whi:58.4,icon:'\u25b2',ic:'#E84142',ib:'#fff0f0'},\n];\n\n\/\/ CURRENCIES\nconst CURR_DATA=[\n  {name:'EUR\/USD',sym:'FXE', d1:0.15,d5:0.42,m1:1.80,ytd:-2.40,y1:-4.80,y3:-8.40,cur:1.0842,dlo:1.0798,dhi:1.0868,wlo:1.0242,whi:1.1148},\n  {name:'GBP\/USD',sym:'FXB', d1:0.08,d5:0.28,m1:1.40,ytd:-1.80,y1:-3.40,y3:-6.80,cur:1.2735,dlo:1.2688,dhi:1.2762,wlo:1.2142,whi:1.3148},\n  {name:'USD\/JPY',sym:'FXY', d1:-0.22,d5:-0.84,m1:-2.40,ytd:4.80,y1:9.40,y3:28.40,cur:153.42,dlo:152.84,dhi:154.28,wlo:141.42,whi:158.84},\n  {name:'USD\/CHF',sym:'FXF', d1:-0.06,d5:-0.24,m1:-1.20,ytd:2.40,y1:4.80,y3:8.40,cur:0.9012,dlo:0.8984,dhi:0.9048,wlo:0.8682,whi:0.9424},\n  {name:'USD\/CAD',sym:'FXC', d1:0.12,d5:0.42,m1:1.80,ytd:3.40,y1:6.80,y3:12.40,cur:1.365,dlo:1.358,dhi:1.372,wlo:1.312,whi:1.402},\n  {name:'AUD\/USD',sym:'FXA', d1:-0.18,d5:-0.64,m1:-2.80,ytd:-4.80,y1:-8.40,y3:-14.80,cur:0.6514,dlo:0.6482,dhi:0.6548,wlo:0.6112,whi:0.6842},\n  {name:'NZD\/USD',sym:'BNZ', d1:0.21,d5:0.68,m1:2.40,ytd:-2.80,y1:-5.40,y3:-10.80,cur:0.5982,dlo:0.5948,dhi:0.6018,wlo:0.5628,whi:0.6348},\n  {name:'EUR\/GBP',sym:'ERO', d1:0.09,d5:0.18,m1:0.42,ytd:-0.62,y1:-1.42,y3:-1.82,cur:0.8514,dlo:0.8488,dhi:0.8542,wlo:0.8242,whi:0.8748},\n  {name:'USD\/BRL',sym:'BZF', d1:0.41,d5:1.82,m1:4.80,ytd:8.40,y1:14.80,y3:24.80,cur:5.03,dlo:4.98,dhi:5.08,wlo:4.72,whi:5.42},\n  {name:'USD\/CNY',sym:'CYB', d1:0.05,d5:0.18,m1:0.42,ytd:0.84,y1:1.82,y3:4.80,cur:7.23,dlo:7.20,dhi:7.26,wlo:7.08,whi:7.38},\n  {name:'USD\/MXN',sym:'UDN', d1:0.32,d5:1.14,m1:3.40,ytd:5.80,y1:10.40,y3:18.40,cur:16.84,dlo:16.72,dhi:16.98,wlo:16.12,whi:18.24},\n  {name:'DXY Index',sym:'UUP', d1:0.18,d5:0.42,m1:1.80,ytd:4.40,y1:8.80,y3:14.40,cur:104.8,dlo:104.2,dhi:105.4,wlo:100.2,whi:107.4},\n];\n\n\/\/ EMERGING MARKETS\nconst EM_DATA=[\n  {name:'EM Broad Index',   sym:'EEM', d1:1.42,d5:2.14,m1:8.40,ytd:6.80,y1:14.40,y3:2.80,cur:42.4,dlo:41.8,dhi:43.0,wlo:35.4,whi:44.8},\n  {name:'EM Asia',          sym:'EEMA',d1:1.14,d5:1.82,m1:9.80,ytd:7.40,y1:16.80,y3:4.40,cur:64.8,dlo:64.0,dhi:65.6,wlo:54.8,whi:68.4},\n  {name:'EM Latin America', sym:'ILF', d1:1.82,d5:0.42,m1:4.20,ytd:-6.40,y1:-8.80,y3:-4.40,cur:28.4,dlo:27.8,dhi:29.0,wlo:24.4,whi:36.4},\n  {name:'Brazil',           sym:'EWZ', d1:2.14,d5:0.82,m1:4.40,ytd:-8.40,y1:-12.40,y3:-4.80,cur:28.4,dlo:27.8,dhi:29.2,wlo:24.4,whi:38.4},\n  {name:'China',            sym:'MCHI',d1:0.42,d5:1.82,m1:14.80,ytd:12.40,y1:18.80,y3:-8.40,cur:54.8,dlo:53.8,dhi:55.2,wlo:38.4,whi:56.8},\n  {name:'India',            sym:'INDA',d1:1.42,d5:2.14,m1:8.80,ytd:6.40,y1:24.80,y3:42.40,cur:48.4,dlo:47.8,dhi:49.2,wlo:36.4,whi:50.8},\n  {name:'South Korea',      sym:'EWY', d1:0.42,d5:1.14,m1:6.40,ytd:4.80,y1:8.40,y3:4.80,cur:62.4,dlo:61.4,dhi:63.4,wlo:52.4,whi:68.4},\n  {name:'Taiwan',           sym:'EWT', d1:0.84,d5:1.42,m1:8.80,ytd:8.40,y1:18.40,y3:42.40,cur:48.4,dlo:47.6,dhi:49.2,wlo:38.4,whi:52.4},\n  {name:'South Africa',     sym:'EZA', d1:1.14,d5:1.82,m1:6.40,ytd:4.80,y1:8.40,y3:2.40,cur:42.4,dlo:41.6,dhi:43.2,wlo:32.4,whi:46.4},\n  {name:'Mexico',           sym:'EWW', d1:1.14,d5:-0.42,m1:2.80,ytd:-14.40,y1:-18.40,y3:-8.40,cur:48.4,dlo:47.4,dhi:49.2,wlo:42.4,whi:68.4},\n];\n\n\/\/ GLOBAL & REGIONAL\nconst GLOBAL_DATA=[\n  {name:'World ex-US',       sym:'ACWX',d1:1.14,d5:1.42,m1:7.40,ytd:8.40,y1:14.40,y3:8.40,cur:52.4,dlo:51.8,dhi:53.0,wlo:42.4,whi:54.8},\n  {name:'Developed Markets', sym:'EFA', d1:1.02,d5:1.14,m1:7.80,ytd:9.80,y1:16.80,y3:10.40,cur:78.4,dlo:77.6,dhi:79.2,wlo:64.4,whi:81.4},\n  {name:'Europe',            sym:'VGK', d1:1.42,d5:1.14,m1:9.40,ytd:12.40,y1:18.40,y3:14.80,cur:68.4,dlo:67.6,dhi:69.2,wlo:54.4,whi:71.4},\n  {name:'Europe ex-UK',      sym:'IEV', d1:1.52,d5:1.28,m1:9.80,ytd:13.40,y1:19.80,y3:16.40,cur:54.4,dlo:53.6,dhi:55.2,wlo:42.4,whi:57.4},\n  {name:'Asia Pacific',      sym:'AAXJ',d1:0.92,d5:1.52,m1:9.40,ytd:8.80,y1:14.80,y3:2.40,cur:78.4,dlo:77.4,dhi:79.4,wlo:62.4,whi:82.4},\n  {name:'Pacific ex-Japan',  sym:'EPP', d1:0.82,d5:1.14,m1:6.40,ytd:4.80,y1:12.40,y3:8.40,cur:42.4,dlo:41.8,dhi:43.0,wlo:34.4,whi:44.8},\n  {name:'Latin America',     sym:'ILF', d1:1.82,d5:0.42,m1:4.20,ytd:-6.40,y1:-8.80,y3:-4.40,cur:28.4,dlo:27.8,dhi:29.0,wlo:24.4,whi:36.4},\n  {name:'Middle East & Africa',sym:'GAF',d1:0.72,d5:0.84,m1:4.40,ytd:2.80,y1:8.40,y3:4.80,cur:32.4,dlo:31.8,dhi:33.0,wlo:26.4,whi:34.8},\n];\n\n\/\/ GROWTH vs VALUE\nconst GVV_DATA=[\n  {name:'Large Growth',   sym:'IWF', d1:0.84,d5:-0.82,m1:16.40,ytd:5.80,y1:34.40,y3:88.40,cur:364.8,dlo:361.4,dhi:367.2,wlo:264.4,whi:368.4},\n  {name:'Large Value',    sym:'IWD', d1:1.42,d5:-0.28,m1:6.40,ytd:2.80,y1:14.40,y3:38.40,cur:178.4,dlo:176.8,dhi:179.8,wlo:148.4,whi:181.4},\n  {name:'Large Blend',    sym:'IWB', d1:1.04,d5:-0.54,m1:11.40,ytd:4.40,y1:28.40,y3:64.40,cur:262.4,dlo:259.8,dhi:264.8,wlo:198.4,whi:265.4},\n  {name:'Mid Growth',     sym:'IWP', d1:0.92,d5:-1.14,m1:14.80,ytd:4.40,y1:28.40,y3:64.40,cur:128.4,dlo:126.8,dhi:129.8,wlo:94.4,whi:130.4},\n  {name:'Mid Value',      sym:'IWS', d1:1.52,d5:-0.82,m1:6.40,ytd:4.40,y1:18.40,y3:42.40,cur:82.4,dlo:81.4,dhi:83.4,wlo:66.4,whi:84.8},\n  {name:'Mid Blend',      sym:'IJH', d1:1.28,d5:-1.02,m1:10.80,ytd:4.40,y1:24.40,y3:54.40,cur:264.8,dlo:262.4,dhi:267.2,wlo:204.4,whi:268.4},\n  {name:'Small Growth',   sym:'IWO', d1:0.72,d5:-1.42,m1:12.40,ytd:6.40,y1:24.40,y3:48.40,cur:258.4,dlo:255.4,dhi:261.4,wlo:194.4,whi:262.4},\n  {name:'Small Value',    sym:'IWN', d1:1.82,d5:-0.92,m1:8.40,ytd:8.40,y1:22.40,y3:44.40,cur:168.4,dlo:166.8,dhi:169.8,wlo:134.4,whi:171.4},\n  {name:'Small Blend',    sym:'IWM', d1:1.42,d5:-1.14,m1:10.40,ytd:7.80,y1:24.40,y3:48.40,cur:218.4,dlo:216.4,dhi:220.4,wlo:168.4,whi:222.4},\n];\n\n\/\/ MARKET CAP\nconst MCAP_DATA=[\n  {name:'Total Market',     sym:'VTI', d1:1.02,d5:-0.42,m1:12.40,ytd:4.80,y1:28.40,y3:68.40,cur:248.4,dlo:245.8,dhi:250.8,wlo:188.4,whi:251.4},\n  {name:'Mega Cap',         sym:'MGC', d1:0.92,d5:-0.64,m1:14.40,ytd:4.40,y1:32.40,y3:78.40,cur:178.4,dlo:176.4,dhi:180.4,wlo:134.4,whi:181.4},\n  {name:'Large Cap',        sym:'IVV', d1:0.99,d5:-0.33,m1:12.22,ytd:4.35,y1:28.37,y3:71.08,cur:573.4,dlo:568.2,dhi:575.8,wlo:442.4,whi:578.4},\n  {name:'Mid Cap',          sym:'VO',  d1:1.52,d5:-1.42,m1:9.40,ytd:5.80,y1:24.40,y3:52.40,cur:242.4,dlo:239.8,dhi:244.8,wlo:188.4,whi:246.4},\n  {name:'Small Cap',        sym:'VB',  d1:1.72,d5:-1.14,m1:10.80,ytd:7.80,y1:26.40,y3:48.40,cur:214.4,dlo:212.4,dhi:216.4,wlo:164.4,whi:218.4},\n  {name:'Micro Cap',        sym:'IWC', d1:2.84,d5:-3.07,m1:11.20,ytd:10.45,y1:56.37,y3:71.59,cur:170.2,dlo:175.4,dhi:170.7,wlo:109.6,whi:182.9},\n];\n\n\/\/ ETF STRATEGIES\nconst ETF_STR_DATA=[\n  {name:'Leveraged 3x Bull', sym:'UPRO',d1:2.94,d5:-0.98,m1:36.40,ytd:13.00,y1:84.40,y3:194.40,cur:78.4,dlo:76.2,dhi:80.4,wlo:38.4,whi:82.4},\n  {name:'Inverse (Bear)',    sym:'SH',  d1:-0.98,d5:0.32,m1:-11.80,ytd:-4.20,y1:-26.40,y3:-56.40,cur:13.4,dlo:13.2,dhi:13.6,wlo:11.8,whi:17.4},\n  {name:'Low Volatility',    sym:'USMV',d1:0.81,d5:-0.21,m1:3.03,ytd:-0.30,y1:2.20,y3:27.17,cur:93.9,dlo:93.6,dhi:94.7,wlo:91.0,whi:98.1},\n  {name:'Momentum',          sym:'MTUM',d1:1.14,d5:-0.55,m1:14.22,ytd:6.88,y1:38.41,y3:82.30,cur:224.3,dlo:222.1,dhi:225.8,wlo:178.9,whi:228.4},\n  {name:'Equal Weight S&P',  sym:'RSP', d1:1.42,d5:-0.82,m1:8.80,ytd:4.80,y1:22.40,y3:48.40,cur:168.4,dlo:166.8,dhi:169.8,wlo:134.4,whi:171.4},\n  {name:'Dividend Growth',   sym:'VIG', d1:0.98,d5:-0.42,m1:6.40,ytd:3.40,y1:18.40,y3:42.40,cur:178.4,dlo:176.8,dhi:179.8,wlo:148.4,whi:181.4},\n  {name:'ESG US',            sym:'ESGU',d1:0.88,d5:-0.48,m1:11.40,ytd:4.40,y1:26.40,y3:64.40,cur:108.4,dlo:107.4,dhi:109.4,wlo:84.4,whi:110.4},\n  {name:'Covered Call',      sym:'XYLD',d1:0.48,d5:0.12,m1:3.80,ytd:3.40,y1:8.80,y3:14.80,cur:42.4,dlo:42.0,dhi:42.8,wlo:38.4,whi:44.4},\n];\n\n\/\/ DIVIDEND ARISTOCRATS\nconst DIV_ARIS_DATA=[\n  {name:'Dividend Aristocrats', sym:'NOBL',d1:1.14,d5:0.12,m1:5.40,ytd:3.80,y1:14.40,y3:34.40,cur:98.4, dlo:97.4,dhi:99.4, wlo:82.4, whi:100.4,yield:2.14},\n  {name:'S&P High Dividend',    sym:'SPYD',d1:1.42,d5:0.82,m1:5.80,ytd:6.40,y1:16.80,y3:28.40,cur:42.4, dlo:41.8,dhi:43.0, wlo:34.4, whi:44.8, yield:4.62},\n  {name:'Vanguard High Div.',   sym:'VYM', d1:0.98,d5:0.42,m1:4.80,ytd:4.40,y1:14.40,y3:34.40,cur:128.4,dlo:127.2,dhi:129.4,wlo:104.4,whi:131.4,yield:2.78},\n  {name:'iShares Select Div.',  sym:'DVY', d1:0.92,d5:0.31,m1:3.48,ytd:3.22,y1:9.84, y3:18.72,cur:121.8,dlo:120.9,dhi:122.6,wlo:107.2,whi:123.4,yield:3.92},\n  {name:'Schwab US Dividend',   sym:'SCHD',d1:1.02,d5:0.48,m1:5.20,ytd:5.80,y1:16.40,y3:38.40,cur:82.4, dlo:81.6,dhi:83.2, wlo:66.4, whi:84.8, yield:3.42},\n  {name:'ProShares Aristocrats',sym:'SDY', d1:1.08,d5:0.38,m1:4.80,ytd:4.40,y1:14.80,y3:32.40,cur:128.4,dlo:127.4,dhi:129.4,wlo:104.4,whi:131.4,yield:2.58},\n];\n\n\/\/ DIVIDENDS\nconst DIV_DATA=[\n  {name:'High Dividend Yield',   sym:'VYM', d1:0.98,d5:0.42,m1:4.80,ytd:4.40,y1:14.40,y3:34.40,cur:128.4,dlo:127.2,dhi:129.4,wlo:104.4,whi:131.4,yield:2.78},\n  {name:'International Div.',    sym:'IDV', d1:1.14,d5:0.82,m1:5.40,ytd:8.40,y1:18.40,y3:22.40,cur:32.4, dlo:31.8,dhi:33.0, wlo:24.8, whi:34.4, yield:5.42},\n  {name:'Emerging Mkt Div.',     sym:'DEM', d1:0.82,d5:0.62,m1:4.20,ytd:4.80,y1:12.40,y3:8.40, cur:42.4, dlo:41.8,dhi:43.0, wlo:34.4, whi:45.4, yield:4.82},\n  {name:'Real Estate (REIT)',    sym:'VNQ', d1:1.72,d5:-0.48,m1:9.40,ytd:7.80,y1:8.40, y3:14.80,cur:88.4, dlo:87.4,dhi:89.4, wlo:72.4, whi:91.4, yield:3.82},\n  {name:'Infrastructure Div.',   sym:'IGF', d1:0.92,d5:0.28,m1:4.40,ytd:3.80,y1:10.40,y3:18.40,cur:42.4, dlo:41.8,dhi:43.0, wlo:34.4, whi:44.8, yield:3.12},\n  {name:'MLP\/Energy Dist.',      sym:'MLPA',d1:1.42,d5:2.14,m1:5.80,ytd:12.40,y1:18.40,y3:42.40,cur:48.4,dlo:47.4,dhi:49.4, wlo:34.4, whi:51.4, yield:7.82},\n  {name:'Preferred Stock',       sym:'PFF', d1:0.42,d5:0.18,m1:1.80,ytd:2.40,y1:5.80, y3:4.40, cur:32.4, dlo:32.0,dhi:32.8, wlo:28.4, whi:34.4, yield:5.92},\n];\n\n\/\/ DIVIDEND CHAMPIONS (focus: consecutive years)\nconst DIV_CHAMP_DATA=[\n  {name:'Procter & Gamble', sym:'PG',  years:67,d1:0.82,d5:0.28,m1:3.40,ytd:2.80,y1:8.40,y3:18.40,cur:168.4,dlo:166.8,dhi:169.8,wlo:138.4,whi:172.4,yield:2.38},\n  {name:'Coca-Cola',        sym:'KO',  years:62,d1:0.72,d5:0.42,m1:2.80,ytd:3.40,y1:6.80,y3:12.40,cur:62.4,dlo:61.8,dhi:63.0,wlo:52.4,whi:65.4,yield:3.12},\n  {name:'Johnson & Johnson',sym:'JNJ', years:62,d1:1.14,d5:0.14,m1:3.80,ytd:-2.40,y1:4.80,y3:8.40,cur:152.4,dlo:151.2,dhi:153.6,wlo:142.4,whi:168.4,yield:3.28},\n  {name:'3M Company',       sym:'MMM', years:66,d1:2.14,d5:1.42,m1:12.40,ytd:18.40,y1:28.40,y3:8.40,cur:142.4,dlo:140.4,dhi:144.4,wlo:92.4,whi:145.4,yield:2.08},\n  {name:'Colgate-Palmolive',sym:'CL',  years:62,d1:0.62,d5:0.18,m1:2.40,ytd:2.80,y1:6.40,y3:14.40,cur:88.4,dlo:87.8,dhi:89.0,wlo:74.4,whi:91.4,yield:2.28},\n  {name:'Stanley Black&D.', sym:'SWK', years:57,d1:1.42,d5:0.82,m1:8.40,ytd:8.80,y1:18.40,y3:-18.40,cur:82.4,dlo:81.4,dhi:83.4,wlo:62.4,whi:92.4,yield:2.58},\n];\n\n\/\/ EARNINGS CALENDAR (different layout)\nconst EARN_DATA=[\n  {name:'Apple',        sym:'AAPL',date:'May 1',est:1.43,prior:1.53,surprise:null,mktcap:'3.1T',sector:'Technology'},\n  {name:'Microsoft',    sym:'MSFT',date:'Apr 30',est:3.22,prior:2.94,surprise:8.8,mktcap:'2.8T',sector:'Technology'},\n  {name:'Amazon',       sym:'AMZN',date:'May 1',est:1.24,prior:0.98,surprise:null,mktcap:'2.1T',sector:'Consumer'},\n  {name:'Meta',         sym:'META',date:'Apr 30',est:4.32,prior:4.71,surprise:12.4,mktcap:'1.3T',sector:'Communication'},\n  {name:'Alphabet',     sym:'GOOGL',date:'Apr 30',est:1.92,prior:1.89,surprise:4.2,mktcap:'2.1T',sector:'Communication'},\n  {name:'Tesla',        sym:'TSLA',date:'Apr 23',est:0.42,prior:0.71,surprise:-8.4,mktcap:'0.6T',sector:'Consumer'},\n  {name:'NVIDIA',       sym:'NVDA',date:'May 28',est:5.52,prior:6.12,surprise:null,mktcap:'2.4T',sector:'Technology'},\n  {name:'JPMorgan',     sym:'JPM', date:'Apr 11',est:4.61,prior:4.44,surprise:6.2,mktcap:'0.6T',sector:'Financial'},\n  {name:'Berkshire',    sym:'BRK.B',date:'May 3',est:4.82,prior:5.14,surprise:null,mktcap:'0.9T',sector:'Financial'},\n  {name:'Visa',         sym:'V',   date:'Apr 24',est:2.68,prior:2.51,surprise:3.2,mktcap:'0.5T',sector:'Financial'},\n  {name:'Walmart',      sym:'WMT', date:'May 15',est:0.57,prior:0.49,surprise:null,mktcap:'0.7T',sector:'Consumer'},\n  {name:'ExxonMobil',   sym:'XOM', date:'May 2',est:2.14,prior:2.48,surprise:null,mktcap:'0.5T',sector:'Energy'},\n];\n\n\/\/ \u2500\u2500 TAB RENDERERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderKey(){\n  return section('U.S. EQUITIES', stdTable(KEY_EQUITIES))\n       + section('US EQUITY SECTORS', stdTable(KEY_SECTORS))\n       + section('US EQUITY FACTORS', stdTable(KEY_FACTORS));\n}\n\nfunction renderBonds(){\n  return searchFilter('bonds')\n       + section('FIXED INCOME', stdTable(BONDS_DATA));\n}\n\nfunction renderCommodities(){\n  return searchFilter('commod')\n       + section('COMMODITIES', stdTable(COMMOD_DATA));\n}\n\nfunction renderCountries(){\n  return searchFilter('country')\n       + section('COUNTRY ETFs', stdTable(COUNTRY_DATA));\n}\n\nfunction renderCrypto(){\n  const hdr=`<thead><tr>\n    <th>Name<\/th><th>Symbol<\/th>\n    <th class=\"right\">Today<\/th><th class=\"right\">5 Days<\/th>\n    <th class=\"right\">1 Month<\/th><th class=\"right\">YTD<\/th>\n    <th class=\"right\">1 Year<\/th><th class=\"right\">3 Years<\/th>\n    <th class=\"right\">Price (USD)<\/th>\n    <th class=\"center\">Day Range<\/th><th class=\"center\">52 Week Range<\/th>\n  <\/tr><\/thead>`;\n  const body=CRYPTO_DATA.map(r=>`<tr>\n    <td><span class=\"crypto-chip\" style=\"background:${r.ib};color:${r.ic}\">${r.icon}<\/span><span class=\"md-name\">${r.name}<\/span><\/td>\n    <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n    <td class=\"right\">${pct(r.d1)}<\/td>\n    <td class=\"right\">${pct(r.d5)}<\/td>\n    <td class=\"right\">${pct(r.m1)}<\/td>\n    <td class=\"right\">${pct(r.ytd)}<\/td>\n    <td class=\"right\">${pct(r.y1)}<\/td>\n    <td class=\"right\">${pct(r.y3)}<\/td>\n    <td class=\"right mono\">$${r.cur.toLocaleString('en-US',{maximumFractionDigits:4})}<\/td>\n    <td class=\"center\">${rangebar(r.dlo,r.cur,r.dhi)}<\/td>\n    <td class=\"center\">${rangebar(r.wlo,r.cur,r.whi)}<\/td>\n  <\/tr>`).join('');\n  return searchFilter('crypto')\n       + section('CRYPTOCURRENCIES',`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`);\n}\n\nfunction renderCurrencies(){\n  return searchFilter('curr')\n       + section('CURRENCY PAIRS', stdTable(CURR_DATA));\n}\n\nfunction renderDivAristocrats(){\n  const hdr=`<thead><tr>\n    <th>Name<\/th><th>Symbol<\/th>\n    <th class=\"right\">Today<\/th><th class=\"right\">5 Days<\/th>\n    <th class=\"right\">1 Month<\/th><th class=\"right\">YTD<\/th>\n    <th class=\"right\">1 Year<\/th><th class=\"right\">3 Years<\/th>\n    <th class=\"center\">Yield<\/th>\n    <th class=\"center\">Day Range<\/th><th class=\"center\">52 Week Range<\/th>\n  <\/tr><\/thead>`;\n  const body=DIV_ARIS_DATA.map(r=>`<tr>\n    <td><span class=\"md-name\">${r.name}<\/span><\/td>\n    <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n    <td class=\"right\">${pct(r.d1)}<\/td>\n    <td class=\"right\">${pct(r.d5)}<\/td>\n    <td class=\"right\">${pct(r.m1)}<\/td>\n    <td class=\"right\">${pct(r.ytd)}<\/td>\n    <td class=\"right\">${pct(r.y1)}<\/td>\n    <td class=\"right\">${pct(r.y3)}<\/td>\n    <td class=\"center\"><div class=\"yield-bar\"><span class=\"mono\">${r.yield.toFixed(2)}%<\/span><div class=\"yield-track\"><div class=\"yield-fill\" style=\"width:${Math.min(100,r.yield\/8*100)}%\"><\/div><\/div><\/div><\/td>\n    <td class=\"center\">${rangebar(r.dlo,r.cur,r.dhi)}<\/td>\n    <td class=\"center\">${rangebar(r.wlo,r.cur,r.whi)}<\/td>\n  <\/tr>`).join('');\n  return section('DIVIDEND ARISTOCRATS ETFs',`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`);\n}\n\nfunction renderDivChampions(){\n  const hdr=`<thead><tr>\n    <th>Name<\/th><th>Symbol<\/th>\n    <th class=\"center\">Consec. Years<\/th>\n    <th class=\"right\">Today<\/th><th class=\"right\">5 Days<\/th>\n    <th class=\"right\">1 Month<\/th><th class=\"right\">YTD<\/th>\n    <th class=\"right\">1 Year<\/th>\n    <th class=\"center\">Yield<\/th>\n    <th class=\"center\">52 Week Range<\/th>\n  <\/tr><\/thead>`;\n  const body=DIV_CHAMP_DATA.map(r=>`<tr>\n    <td><span class=\"md-name\">${r.name}<\/span><\/td>\n    <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n    <td class=\"center\"><span class=\"md-badge up\">${r.years} yrs<\/span><\/td>\n    <td class=\"right\">${pct(r.d1)}<\/td>\n    <td class=\"right\">${pct(r.d5)}<\/td>\n    <td class=\"right\">${pct(r.m1)}<\/td>\n    <td class=\"right\">${pct(r.ytd)}<\/td>\n    <td class=\"right\">${pct(r.y1)}<\/td>\n    <td class=\"center\"><div class=\"yield-bar\"><span class=\"mono\">${r.yield.toFixed(2)}%<\/span><div class=\"yield-track\"><div class=\"yield-fill\" style=\"width:${Math.min(100,r.yield\/8*100)}%\"><\/div><\/div><\/div><\/td>\n    <td class=\"center\">${rangebar(r.wlo,r.cur,r.whi)}<\/td>\n  <\/tr>`).join('');\n  return section('DIVIDEND CHAMPIONS (Stocks with 25+ Years of Increases)',`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`);\n}\n\nfunction renderDividends(){\n  const hdr=`<thead><tr>\n    <th>Name<\/th><th>Symbol<\/th>\n    <th class=\"right\">Today<\/th><th class=\"right\">5 Days<\/th>\n    <th class=\"right\">1 Month<\/th><th class=\"right\">YTD<\/th>\n    <th class=\"right\">1 Year<\/th><th class=\"right\">3 Years<\/th>\n    <th class=\"center\">Yield<\/th>\n    <th class=\"center\">Day Range<\/th><th class=\"center\">52 Week Range<\/th>\n  <\/tr><\/thead>`;\n  const body=DIV_DATA.map(r=>`<tr>\n    <td><span class=\"md-name\">${r.name}<\/span><\/td>\n    <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n    <td class=\"right\">${pct(r.d1)}<\/td>\n    <td class=\"right\">${pct(r.d5)}<\/td>\n    <td class=\"right\">${pct(r.m1)}<\/td>\n    <td class=\"right\">${pct(r.ytd)}<\/td>\n    <td class=\"right\">${pct(r.y1)}<\/td>\n    <td class=\"right\">${pct(r.y3)}<\/td>\n    <td class=\"center\"><div class=\"yield-bar\"><span class=\"mono\">${r.yield.toFixed(2)}%<\/span><div class=\"yield-track\"><div class=\"yield-fill\" style=\"width:${Math.min(100,r.yield\/8*100)}%\"><\/div><\/div><\/div><\/td>\n    <td class=\"center\">${rangebar(r.dlo,r.cur,r.dhi)}<\/td>\n    <td class=\"center\">${rangebar(r.wlo,r.cur,r.whi)}<\/td>\n  <\/tr>`).join('');\n  return section('DIVIDEND ETFs',`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`);\n}\n\nfunction renderEarnings(){\n  const hdr=`<thead><tr>\n    <th>Company<\/th><th>Symbol<\/th>\n    <th class=\"center\">Report Date<\/th>\n    <th class=\"right\">EPS Est.<\/th>\n    <th class=\"right\">Prior EPS<\/th>\n    <th class=\"right\">Surprise<\/th>\n    <th class=\"right\">Mkt Cap<\/th>\n    <th>Sector<\/th>\n  <\/tr><\/thead>`;\n  const body=EARN_DATA.map(r=>{\n    const surp=r.surprise===null\n      ?`<span class=\"mono\" style=\"color:var(--muted)\">Pending<\/span>`\n      :pct(r.surprise);\n    const dCls=r.date.includes('Apr')?'up':'nt';\n    return`<tr>\n      <td><span class=\"md-name\">${r.name}<\/span><\/td>\n      <td><span class=\"md-sym\">${r.sym}<\/span><\/td>\n      <td class=\"center\"><span class=\"md-badge ${dCls}\">${r.date}<\/span><\/td>\n      <td class=\"right mono\">$${r.est.toFixed(2)}<\/td>\n      <td class=\"right mono\">$${r.prior.toFixed(2)}<\/td>\n      <td class=\"right\">${surp}<\/td>\n      <td class=\"right mono\">${r.mktcap}<\/td>\n      <td><span style=\"font-size:12px;color:var(--dim)\">${r.sector}<\/span><\/td>\n    <\/tr>`;\n  }).join('');\n  return searchFilter('earn')\n       + section('UPCOMING & RECENT EARNINGS',`<div class=\"md-tbl-wrap\"><table>${hdr}<tbody>${body}<\/tbody><\/table><\/div>`);\n}\n\nfunction renderEM(){\n  return searchFilter('em')\n       + section('EMERGING MARKETS ETFs', stdTable(EM_DATA));\n}\n\nfunction renderETFStrategies(){\n  return searchFilter('etf_str')\n       + section('ETF INVESTMENT STRATEGIES', stdTable(ETF_STR_DATA));\n}\n\nfunction renderGlobal(){\n  return searchFilter('global')\n       + section('GLOBAL & REGIONAL ETFs', stdTable(GLOBAL_DATA));\n}\n\nfunction renderGVV(){\n  return section('GROWTH vs. VALUE', stdTable(GVV_DATA));\n}\n\nfunction renderMCap(){\n  return section('MARKET CAPITALIZATION', stdTable(MCAP_DATA));\n}\n\n\/\/ \u2500\u2500 SWITCH TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst RENDERERS={\n  key:renderKey, bonds:renderBonds, commod:renderCommodities,\n  country:renderCountries, crypto:renderCrypto, curr:renderCurrencies,\n  div_aris:renderDivAristocrats, div_champ:renderDivChampions,\n  divs:renderDividends, earn:renderEarnings, em:renderEM,\n  etf_str:renderETFStrategies, global:renderGlobal,\n  gvv:renderGVV, mcap:renderMCap,\n};\n\nfunction mdSwitch(id){\n  activeTab=id;\n  \/\/ update tab styles\n  document.querySelectorAll('#mktd .md-tab').forEach((btn,i)=>{\n    const t=TABS[i];\n    btn.classList.remove('on','active-chip');\n    if(t.id===id){btn.classList.add('on');if(t.chip)btn.classList.add('active-chip');}\n    else if(t.chip)btn.classList.add('active-chip');\n  });\n  const el=document.getElementById('mdContent');\n  el.innerHTML=`<div class=\"md-loading\"><div class=\"md-spin\"><\/div> Carregando\u2026<\/div>`;\n  setTimeout(()=>{\n    const fn=RENDERERS[id];\n    el.innerHTML=fn?fn():`<div class=\"md-loading\">Dados indispon\u00edveis<\/div>`;\n  },120);\n}\nwindow.mdSwitch=mdSwitch;\n\n\/\/ \u2500\u2500 FILTER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction mdFilter(inp,panelId){\n  const q=inp.value.toLowerCase();\n  const rows=document.querySelectorAll('#mktd tbody tr');\n  let count=0;\n  rows.forEach(r=>{\n    const txt=r.textContent.toLowerCase();\n    const show=txt.includes(q);\n    r.style.display=show?'':'none';\n    if(show)count++;\n  });\n  const cnt=document.getElementById('cnt-'+panelId);\n  if(cnt)cnt.textContent=q?`${count} resultado${count!==1?'s':''}\u2026`:'';\n}\nwindow.mdFilter=mdFilter;\n\n\/\/ \u2500\u2500 FLUCTUATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction liveFluctuate(){\n  \/\/ Update ticker\n  TICKER_ITEMS.forEach(x=>{x.v=fluct(x.v,.002);x.ch=flpct(x.ch);});\n  buildTicker();\n  \/\/ If on key tab, micro-update visible % cells without full re-render\n  \/\/ For simplicity, re-render active tab every 12s\n}\n\n\/\/ \u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction boot(){\n  buildTicker();\n  buildTabs();\n  \/\/ initial render\n  const el=document.getElementById('mdContent');\n  setTimeout(()=>{\n    el.innerHTML=renderKey();\n    \/\/ mark first tab\n    document.querySelectorAll('#mktd .md-tab')[0].classList.add('on','active-chip');\n  },200);\n\n  setInterval(liveFluctuate,10000);\n  setInterval(()=>{\n    \/\/ silent re-render of active tab to update values\n    const fn=RENDERERS[activeTab];\n    if(fn){\n      const el=document.getElementById('mdContent');\n      \/\/ Only re-render if no search is active\n      const inp=el.querySelector('input');\n      if(!inp||!inp.value){\n        \/\/ Save scroll\n        const sy=window.scrollY;\n        el.innerHTML=fn();\n        window.scrollTo(0,sy);\n      }\n    }\n  },15000);\n}\n\nif(document.readyState==='loading'){\n  document.addEventListener('DOMContentLoaded',boot);\n}else{\n  boot();\n}\n\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>IN investingora.com Ao vivo \u2014 MARKET DATA Carregando dados\u2026<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-591","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/pages\/591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/comments?post=591"}],"version-history":[{"count":1,"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/pages\/591\/revisions"}],"predecessor-version":[{"id":592,"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/pages\/591\/revisions\/592"}],"wp:attachment":[{"href":"https:\/\/investingora.com\/pt\/wp-json\/wp\/v2\/media?parent=591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}