Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
| <div class="d3-loss-curves"></div> | |
| <style> | |
| .d3-loss-curves { | |
| margin-top: 20px; | |
| width: 100%; | |
| height: 350px; | |
| padding: 0; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| /* Ghosting on hover */ | |
| .d3-loss-curves.hovering .lines path.ghost { | |
| opacity: .25 ; | |
| } | |
| .d3-loss-curves.hovering .legend-item.ghost { | |
| opacity: .25 ; | |
| } | |
| /* Tooltip styling */ | |
| .d3-loss-curves .d3-tooltip { | |
| z-index: var(--z-elevated); | |
| backdrop-filter: saturate(1.12) blur(8px); | |
| } | |
| .d3-loss-curves .d3-tooltip__inner { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 4px; | |
| min-width: 180px; | |
| } | |
| .d3-loss-curves .d3-tooltip__header { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .d3-loss-curves .d3-tooltip__color-swatch { | |
| width: 12px; | |
| height: 12px; | |
| border-radius: 2px; | |
| flex-shrink: 0; | |
| } | |
| .d3-loss-curves .d3-tooltip__title { | |
| font-weight: 800; | |
| letter-spacing: 0.1px; | |
| font-size: 13px; | |
| } | |
| .d3-loss-curves .d3-tooltip__subtitle { | |
| font-size: 11px; | |
| color: var(--muted-color); | |
| } | |
| .d3-loss-curves .d3-tooltip__divider { | |
| width: 100%; | |
| height: 1px; | |
| background: var(--border-color); | |
| margin: 2px 0; | |
| } | |
| .d3-loss-curves .d3-tooltip__data { | |
| font-size: 11px; | |
| line-height: 1.5; | |
| } | |
| /* Container styling with gradient background */ | |
| .d3-loss-curves { | |
| border: 1px solid var(--border-color); | |
| border-radius: 20px; | |
| background: radial-gradient(circle at 30% 50%, hsla(37, 99%, 67%, 0.035), transparent 40%), | |
| radial-gradient(circle at 60% 100%, hsla(316, 73%, 52%, 0.035), transparent 40%), | |
| radial-gradient(circle at 80% 40%, hsla(185, 100%, 57%, 0.035), transparent 40%), | |
| var(--surface-bg); | |
| } | |
| /* Hand-drawn annotation SVG */ | |
| .d3-loss-curves .annotation { | |
| position: absolute; | |
| top: 55px; | |
| right: 70px; | |
| width: 240px; | |
| height: 56px; | |
| pointer-events: none; | |
| } | |
| .d3-loss-curves .annotation svg { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| /* Text stroke styling for SVG paths */ | |
| /* .d3-loss-curves .annotation path { | |
| fill: var(--text-color); | |
| stroke: var(--page-bg); | |
| stroke-width: 3px; | |
| stroke-linejoin: round; | |
| stroke-linecap: round; | |
| paint-order: stroke fill; | |
| } */ | |
| /* Legend styling */ | |
| .d3-loss-curves .legend { | |
| position: absolute; | |
| bottom: 16px; | |
| left: 20px; | |
| max-width: 50%; | |
| font-size: 11px; | |
| line-height: 1.2; | |
| z-index: 10; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: flex-start; | |
| gap: 4px; | |
| } | |
| .d3-loss-curves .legend-title { | |
| font-weight: 700; | |
| font-size: 10px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| color: var(--muted-color); | |
| margin-bottom: 4px; | |
| } | |
| .d3-loss-curves .legend-items { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| } | |
| .d3-loss-curves .legend-row { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| flex-wrap: wrap; | |
| } | |
| .d3-loss-curves .legend-item { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| cursor: pointer; | |
| transition: opacity 0.2s ease; | |
| opacity: 1; | |
| } | |
| .d3-loss-curves .legend-swatch { | |
| width: 12px; | |
| height: 12px; | |
| border-radius: 2px; | |
| flex-shrink: 0; | |
| } | |
| .d3-loss-curves .legend-label { | |
| font-size: 11px; | |
| color: var(--text-color); | |
| white-space: nowrap; | |
| } | |
| /* Mobile: hide annotation and legend, reduce height */ | |
| @media (max-width: 768px) { | |
| .d3-loss-curves { | |
| height: 250px; | |
| } | |
| .d3-loss-curves .annotation { | |
| display: none; | |
| } | |
| .d3-loss-curves .legend { | |
| display: none; | |
| } | |
| } | |
| </style> | |
| <script> | |
| (() => { | |
| // Pretty label mapping for run names | |
| const prettyRunLabel = (key) => { | |
| if (!key) return ''; | |
| // Extract the meaningful part from run names like "attention_loss+22/09/2025_16:41:43_baseline" | |
| const parts = key.split('+'); | |
| if (parts.length > 1) { | |
| const runType = parts[0].replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); | |
| return runType; | |
| } | |
| return key.replace(/[_-]+/g, ' ').trim(); | |
| }; | |
| const ensureD3 = (cb) => { | |
| if (window.d3 && typeof window.d3.select === 'function') return cb(); | |
| let s = document.getElementById('d3-cdn-script'); | |
| if (!s) { s = document.createElement('script'); s.id = 'd3-cdn-script'; s.src = 'https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js'; document.head.appendChild(s); } | |
| const onReady = () => { if (window.d3 && typeof window.d3.select === 'function') cb(); }; | |
| s.addEventListener('load', onReady, { once: true }); if (window.d3) onReady(); | |
| }; | |
| const bootstrap = () => { | |
| const scriptEl = document.currentScript; | |
| let container = scriptEl ? scriptEl.previousElementSibling : null; | |
| if (!(container && container.classList && container.classList.contains('d3-loss-curves'))) { | |
| const cs = Array.from(document.querySelectorAll('.d3-loss-curves')).filter(el => !(el.dataset && el.dataset.mounted === 'true')); | |
| container = cs[cs.length - 1] || null; | |
| } | |
| if (!container) return; | |
| if (container.dataset) { if (container.dataset.mounted === 'true') return; container.dataset.mounted = 'true'; } | |
| // No controls needed for this visualization | |
| // Tooltip | |
| container.style.position = container.style.position || 'relative'; | |
| let tip = container.querySelector('.d3-tooltip'); let tipInner; | |
| if (!tip) { | |
| tip = document.createElement('div'); tip.className = 'd3-tooltip'; | |
| Object.assign(tip.style, { | |
| position: 'absolute', top: '0px', left: '0px', transform: 'translate(-9999px, -9999px)', pointerEvents: 'none', | |
| padding: '8px 10px', borderRadius: '8px', fontSize: '12px', lineHeight: '1.35', border: '1px solid var(--border-color)', | |
| background: 'var(--surface-bg)', color: 'var(--text-color)', boxShadow: '0 4px 24px rgba(0,0,0,.18)', opacity: '0', transition: 'opacity .12s ease' | |
| }); | |
| tipInner = document.createElement('div'); tipInner.className = 'd3-tooltip__inner'; tipInner.style.textAlign = 'left'; tip.appendChild(tipInner); container.appendChild(tip); | |
| } else { tipInner = tip.querySelector('.d3-tooltip__inner') || tip; } | |
| // Legend | |
| let legend = container.querySelector('.legend'); | |
| if (!legend) { | |
| legend = document.createElement('div'); | |
| legend.className = 'legend'; | |
| container.appendChild(legend); | |
| } | |
| // Hand-drawn annotation | |
| let annotation = container.querySelector('.annotation'); | |
| if (!annotation) { | |
| annotation = document.createElement('div'); | |
| annotation.className = 'annotation'; | |
| annotation.innerHTML = ` | |
| <svg width="383px" height="66px" viewBox="0 0 383 66" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | |
| <g id="hugging-science" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> | |
| <g id="Group-25" transform="translate(1.000000, 0.544667)"> | |
| <g id="Group-24" transform="translate(0.000000, 39.455333)" stroke="currentColor" stroke-linecap="round" stroke-width="2"> | |
| <g id="Group"> | |
| <path d="M24,0 C21.6105156,1.87410542 15.8506615,4.97797779 12,10.0084559 C7.79314603,15.5042613 5.54420624,22.9525368 4.5,25" id="Path" stroke-linejoin="round"></path> | |
| <path d="M4.5,25 L0,14.7058824 M4.5,25 L13.5,20.5882353" id="Shape"></path> | |
| </g> | |
| </g> | |
| <g id="just-one-more-yolo-r" transform="translate(37.647357, 0.000000)" fill="currentColor" fill-rule="nonzero"> | |
| <path d="M6.41864286,38.3793333 C5.74397619,39.054 4.87764286,39.3836667 3.81964286,39.3683333 C2.76164286,39.353 1.86464286,38.962 1.12864286,38.1953333 C0.760642857,37.6126667 0.47697619,36.984 0.277642857,36.3093333 C0.0783095238,35.6346667 -0.0136904762,35.0443333 0.00164285714,34.5383333 C0.0169761905,34.0323333 0.17797619,33.7793333 0.484642857,33.7793333 C0.63797619,33.7793333 0.77597619,33.8253333 0.898642857,33.9173333 C1.02130952,34.0093333 1.12864286,34.1396667 1.22064286,34.3083333 C1.31264286,34.477 1.35864286,34.684 1.35864286,34.9293333 C1.35864286,35.3893333 1.46597619,35.8033333 1.68064286,36.1713333 C1.89530952,36.5393333 2.20197619,36.7233333 2.60064286,36.7233333 C2.93797619,36.846 3.39030952,36.754 3.95764286,36.4473333 C4.52497619,36.1406667 4.97730952,35.7113333 5.31464286,35.1593333 C5.62130952,34.7606667 5.99697619,34.132 6.44164286,33.2733333 C6.88630952,32.4146667 7.33097619,31.5176667 7.77564286,30.5823333 C8.22030952,29.647 8.54997619,28.888 8.76464286,28.3053333 C9.13264286,27.048 9.46230952,25.76 9.75364286,24.4413333 C10.0449762,23.1226667 10.3439762,21.712 10.6506429,20.2093333 C10.7733095,19.3813333 10.9189762,18.6683333 11.0876429,18.0703333 C11.2563095,17.4723333 11.3406429,17.112 11.3406429,16.9893333 C11.3406429,16.8666667 11.3559762,16.6136667 11.3866429,16.2303333 C11.4173095,15.847 11.5093095,15.502 11.6626429,15.1953333 C11.6626429,14.7353333 11.7009762,14.329 11.7776429,13.9763333 C11.8543095,13.6236667 11.8926429,13.386 11.8926429,13.2633333 C11.9846429,13.1713333 12.1149762,13.1406667 12.2836429,13.1713333 C12.4523095,13.202 12.6363095,13.2633333 12.8356429,13.3553333 C13.0349762,13.4473333 13.2113095,13.57 13.3646429,13.7233333 C13.6099762,13.9686667 13.7709762,14.214 13.8476429,14.4593333 C13.9243095,14.7046667 13.9396429,15.088 13.8936429,15.6093333 C13.8476429,16.1306667 13.7479762,16.9586667 13.5946429,18.0933333 C13.5946429,18.2773333 13.5486429,18.653 13.4566429,19.2203333 C13.3646429,19.7876667 13.2419762,20.424 13.0886429,21.1293333 C12.9353095,21.8346667 12.7819762,22.517 12.6286429,23.1763333 C12.4753095,23.8356667 12.3526429,24.38 12.2606429,24.8093333 C12.1379762,25.2693333 11.9999762,25.7753333 11.8466429,26.3273333 C11.6933095,26.8793333 11.6013095,27.2626667 11.5706429,27.4773333 C11.5399762,27.6613333 11.4326429,28.0216667 11.2486429,28.5583333 C11.0646429,29.095 10.8729762,29.624 10.6736429,30.1453333 C10.4743095,30.6666667 10.3593095,31.0346667 10.3286429,31.2493333 C10.2979762,31.372 10.2136429,31.6633333 10.0756429,32.1233333 C9.93764286,32.5833333 9.65397619,33.2886667 9.22464286,34.2393333 C9.07130952,34.6073333 8.81830952,35.0826667 8.46564286,35.6653333 C8.11297619,36.248 7.75264286,36.7923333 7.38464286,37.2983333 C7.01664286,37.8043333 6.69464286,38.1646667 6.41864286,38.3793333 Z M13.6866429,7.14533333 C13.3493095,6.74666667 13.2343095,6.22533333 13.3416429,5.58133333 C13.4489762,4.93733333 13.7479762,4.29333333 14.2386429,3.64933333 C14.6373095,3.18933333 15.0666429,2.92866667 15.5266429,2.86733333 C15.9866429,2.806 16.4159762,2.944 16.8146429,3.28133333 C17.1519762,3.80266667 17.3206429,4.22433333 17.3206429,4.54633333 C17.3206429,4.86833333 17.1519762,5.27466667 16.8146429,5.76533333 C16.0479762,6.624 15.4346429,7.153 14.9746429,7.35233333 C14.5146429,7.55166667 14.0853095,7.48266667 13.6866429,7.14533333 Z" id="j"></path> | |
| <path d="M28.1766429,29.3633333 C27.8699762,29.0566667 27.5633095,28.635 27.2566429,28.0983333 C26.9499762,27.5616667 26.7046429,26.9406667 26.5206429,26.2353333 C26.4593095,25.99 26.4363095,25.6526667 26.4516429,25.2233333 C26.4669762,24.794 26.4593095,24.4873333 26.4286429,24.3033333 C26.3366429,24.518 26.1909762,24.7403333 25.9916429,24.9703333 C25.7923095,25.2003333 25.6006429,25.392 25.4166429,25.5453333 C25.2939762,25.668 25.0179762,25.9056667 24.5886429,26.2583333 C24.1593095,26.611 23.7299762,26.8946667 23.3006429,27.1093333 C22.2886429,27.7533333 21.4529762,28.106 20.7936429,28.1673333 C20.1343095,28.2286667 19.5133095,27.8913333 18.9306429,27.1553333 C18.4399762,26.7566667 18.0949762,26.312 17.8956429,25.8213333 C17.6963095,25.3306667 17.6886429,24.656 17.8726429,23.7973333 C17.9339762,22.724 18.0873095,21.6736667 18.3326429,20.6463333 C18.5779762,19.619 19.0839762,18.2466667 19.8506429,16.5293333 C20.4946429,15.272 20.9853095,14.3443333 21.3226429,13.7463333 C21.6599762,13.1483333 21.8746429,12.788 21.9666429,12.6653333 C22.4266429,12.512 22.8099762,12.5196667 23.1166429,12.6883333 C23.4233095,12.857 23.6073095,13.156 23.6686429,13.5853333 C23.8526429,13.892 23.8296429,14.4133333 23.5996429,15.1493333 C23.3696429,15.8853333 22.9786429,16.79 22.4266429,17.8633333 C21.9973095,18.906 21.6063095,19.9486667 21.2536429,20.9913333 C20.9009762,22.034 20.6939762,22.9233333 20.6326429,23.6593333 C20.5713095,24.3953333 20.7553095,24.84 21.1846429,24.9933333 C21.4606429,25.1466667 21.9436429,25.1006667 22.6336429,24.8553333 C23.3236429,24.61 24.1056429,23.9966667 24.9796429,23.0153333 C25.8536429,22.034 26.7046429,20.5466667 27.5326429,18.5533333 C27.7779762,17.94 27.9619762,17.3956667 28.0846429,16.9203333 C28.2073095,16.445 28.2839762,15.916 28.3146429,15.3333333 C28.2533095,14.9653333 28.2763095,14.6356667 28.3836429,14.3443333 C28.4909762,14.053 28.7286429,13.8 29.0966429,13.5853333 C29.2193095,13.432 29.3879762,13.2863333 29.6026429,13.1483333 C29.8173095,13.0103333 29.9553095,13.018 30.0166429,13.1713333 L30.7526429,13.1253333 C30.8753095,13.0946667 30.9596429,13.1636667 31.0056429,13.3323333 C31.0516429,13.501 31.1513095,13.6466667 31.3046429,13.7693333 C31.6419762,14.0453333 31.7339762,14.6433333 31.5806429,15.5633333 C31.4273095,16.4833333 30.9979762,17.7713333 30.2926429,19.4273333 C29.7099762,20.6846667 29.3189762,21.6353333 29.1196429,22.2793333 C28.9203095,22.9233333 28.8053095,23.552 28.7746429,24.1653333 C28.7746429,24.7173333 28.8819762,25.2386667 29.0966429,25.7293333 C29.3113095,26.22 29.6486429,26.6646667 30.1086429,27.0633333 C30.4459762,27.278 30.6376429,27.5233333 30.6836429,27.7993333 C30.7296429,28.0753333 30.7373095,28.3973333 30.7066429,28.7653333 C30.6453095,29.0413333 30.4689762,29.2636667 30.1776429,29.4323333 C29.8863095,29.601 29.5566429,29.6853333 29.1886429,29.6853333 C28.8206429,29.6853333 28.4833095,29.578 28.1766429,29.3633333 Z" id="u"></path> | |
| <path d="M38.5726429,29.0413333 C37.8059762,29.1026667 37.0776429,29.0566667 36.3876429,28.9033333 C35.6976429,28.75 35.1149762,28.4816667 34.6396429,28.0983333 C34.1643095,27.715 33.8346429,27.2473333 33.6506429,26.6953333 C33.4359762,26.266 33.3286429,25.967 33.3286429,25.7983333 C33.3286429,25.6296667 33.4359762,25.484 33.6506429,25.3613333 C33.8959762,25.3613333 34.1183095,25.4303333 34.3176429,25.5683333 C34.5169762,25.7063333 34.7853095,25.852 35.1226429,26.0053333 C35.5826429,26.404 36.1423095,26.6186667 36.8016429,26.6493333 C37.4609762,26.68 38.0666429,26.5726667 38.6186429,26.3273333 C39.1706429,26.082 39.4773095,25.7753333 39.5386429,25.4073333 C39.5386429,25.2846667 39.4926429,25.07 39.4006429,24.7633333 C39.3086429,24.4566667 39.2013095,24.1346667 39.0786429,23.7973333 C38.2506429,22.632 37.6449762,21.4743333 37.2616429,20.3243333 C36.8783095,19.1743333 36.6866429,18.2313333 36.6866429,17.4953333 C36.6866429,16.9433333 36.8553095,16.353 37.1926429,15.7243333 C37.5299762,15.0956667 37.9899762,14.5666667 38.5726429,14.1373333 C39.1246429,13.5546667 39.7379762,13.0333333 40.4126429,12.5733333 C41.0873095,12.1133333 41.7696429,11.7146667 42.4596429,11.3773333 C43.1496429,11.04 43.7706429,10.7946667 44.3226429,10.6413333 C44.6599762,10.6413333 45.1046429,10.6873333 45.6566429,10.7793333 C46.2086429,10.8713333 46.5919762,10.9786667 46.8066429,11.1013333 C47.1439762,11.224 47.4659762,11.5536667 47.7726429,12.0903333 C48.0793095,12.627 48.2326429,13.156 48.2326429,13.6773333 C48.2326429,13.892 48.1713095,14.168 48.0486429,14.5053333 C47.9259762,14.8426667 47.7266429,15.2413333 47.4506429,15.7013333 C47.3279762,16.0386667 47.1899762,16.353 47.0366429,16.6443333 C46.8833095,16.9356667 46.8066429,17.1426667 46.8066429,17.2653333 C46.6533095,17.6026667 46.4463095,17.7636667 46.1856429,17.7483333 C45.9249762,17.733 45.6643095,17.595 45.4036429,17.3343333 C45.1429762,17.0736667 44.9359762,16.7593333 44.7826429,16.3913333 C44.6599762,15.9313333 44.6139762,15.5556667 44.6446429,15.2643333 C44.6753095,14.973 44.7979762,14.6586667 45.0126429,14.3213333 C45.3499762,13.984 45.5186429,13.754 45.5186429,13.6313333 C45.5186429,13.5086667 45.3499762,13.4473333 45.0126429,13.4473333 C44.7979762,13.4473333 44.4069762,13.5776667 43.8396429,13.8383333 C43.2723095,14.099 42.6743095,14.4363333 42.0456429,14.8503333 C41.4169762,15.2643333 40.8726429,15.7013333 40.4126429,16.1613333 C39.8299762,16.7133333 39.4849762,17.112 39.3776429,17.3573333 C39.2703095,17.6026667 39.2166429,17.986 39.2166429,18.5073333 C39.2166429,18.9366667 39.3163095,19.4733333 39.5156429,20.1173333 C39.7149762,20.7613333 39.9219762,21.1906667 40.1366429,21.4053333 C40.1366429,21.4053333 40.2439762,21.6123333 40.4586429,22.0263333 C40.6733095,22.4403333 40.9339762,22.8773333 41.2406429,23.3373333 C42.1299762,25.3 42.3599762,26.7106667 41.9306429,27.5693333 C41.5013095,28.428 40.3819762,28.9186667 38.5726429,29.0413333 Z" id="s"></path> | |
| <path d="M54.0286429,31.7553333 C53.0166429,31.602 52.3343095,31.2263333 51.9816429,30.6283333 C51.6289762,30.0303333 51.5446429,29.118 51.7286429,27.8913333 C51.9126429,27.3086667 52.0276429,26.7796667 52.0736429,26.3043333 C52.1196429,25.829 52.2499762,25.53 52.4646429,25.4073333 C52.4646429,25.4073333 52.4876429,25.3613333 52.5336429,25.2693333 C52.5796429,25.1773333 52.5566429,25.0853333 52.4646429,24.9933333 C52.4646429,24.5946667 52.6026429,24.0426667 52.8786429,23.3373333 C52.9399762,23.1533333 53.0243095,22.931 53.1316429,22.6703333 C53.2389762,22.4096667 53.2926429,22.2793333 53.2926429,22.2793333 C53.1393095,22.034 53.1393095,21.8346667 53.2926429,21.6813333 C53.4459762,21.528 53.6069762,21.3823333 53.7756429,21.2443333 C53.9443095,21.1063333 53.9519762,20.9453333 53.7986429,20.7613333 C53.7373095,20.6386667 53.8139762,20.355 54.0286429,19.9103333 C54.2433095,19.4656667 54.4886429,18.998 54.7646429,18.5073333 C55.0406429,18.0166667 55.2246429,17.6333333 55.3166429,17.3573333 C55.3166429,17.296 55.3933095,17.0813333 55.5466429,16.7133333 C55.6999762,16.3453333 55.8839762,15.916 56.0986429,15.4253333 C56.3133095,14.9346667 56.5203095,14.49 56.7196429,14.0913333 C56.9189762,13.6926667 57.0493095,13.432 57.1106429,13.3093333 C57.4173095,13.156 57.2946429,13.0486667 56.7426429,12.9873333 C56.1906429,12.926 55.6079762,12.9106667 54.9946429,12.9413333 C54.0439762,12.9106667 53.2849762,12.8646667 52.7176429,12.8033333 C52.1503095,12.742 51.6826429,12.604 51.3146429,12.3893333 C50.9466429,11.96 50.8163095,11.6456667 50.9236429,11.4463333 C51.0309762,11.247 51.3913095,11.132 52.0046429,11.1013333 C52.4033095,11.0706667 52.7176429,11.0553333 52.9476429,11.0553333 C53.1776429,11.0553333 53.4843095,11.0323333 53.8676429,10.9863333 C54.2509762,10.9403333 54.8566429,10.8713333 55.6846429,10.7793333 L58.0306429,10.5953333 L58.1686429,9.81333333 C58.4139762,9.41466667 58.6209762,9.05433333 58.7896429,8.73233333 C58.9583095,8.41033333 59.1039762,8.08066667 59.2266429,7.74333333 C59.3493095,7.406 59.4413095,7.05333333 59.5026429,6.68533333 C59.5026429,6.68533333 59.6406429,6.43233333 59.9166429,5.92633333 C60.1926429,5.42033333 60.3613095,4.89133333 60.4226429,4.33933333 C60.7906429,3.726 61.1126429,3.16633333 61.3886429,2.66033333 C61.6646429,2.15433333 61.8333095,1.84 61.8946429,1.71733333 C62.2319762,1.44133333 62.4696429,1.30333333 62.6076429,1.30333333 C62.7456429,1.30333333 63.0446429,1.45666667 63.5046429,1.76333333 C63.7806429,1.91666667 64.0259762,2.10066667 64.2406429,2.31533333 C64.4553095,2.53 64.5933095,2.75233333 64.6546429,2.98233333 C64.7159762,3.21233333 64.6239762,3.43466667 64.3786429,3.64933333 C64.3173095,3.772 64.2253095,3.99433333 64.1026429,4.31633333 C63.9799762,4.63833333 63.8879762,4.90666667 63.8266429,5.12133333 C63.6426429,5.336 63.4203095,5.681 63.1596429,6.15633333 C62.8989762,6.63166667 62.7226429,7.11466667 62.6306429,7.60533333 C62.3853095,8.12666667 62.1553095,8.59433333 61.9406429,9.00833333 C61.7259762,9.42233333 61.5573095,9.62933333 61.4346429,9.62933333 C61.4959762,9.936 61.6799762,10.0816667 61.9866429,10.0663333 C62.2933095,10.051 62.7993095,10.028 63.5046429,9.99733333 C64.0873095,9.936 64.4936429,9.867 64.7236429,9.79033333 C64.9536429,9.71366667 65.2219762,9.752 65.5286429,9.90533333 C65.6819762,10.12 65.8046429,10.3653333 65.8966429,10.6413333 C65.9886429,10.9173333 66.0116429,11.1703333 65.9656429,11.4003333 C65.9196429,11.6303333 65.7893095,11.7913333 65.5746429,11.8833333 C65.4213095,11.8833333 65.1069762,11.9676667 64.6316429,12.1363333 C64.1563095,12.305 63.5659762,12.4046667 62.8606429,12.4353333 L60.4226429,12.6653333 L59.6406429,14.2293333 C59.4259762,14.628 59.2419762,14.9883333 59.0886429,15.3103333 C58.9353095,15.6323333 58.8279762,15.824 58.7666429,15.8853333 C58.7666429,16.0693333 58.6669762,16.3453333 58.4676429,16.7133333 C58.2683095,17.0813333 58.0613095,17.48 57.8466429,17.9093333 C57.6626429,18.4306667 57.4556429,18.906 57.2256429,19.3353333 C56.9956429,19.7646667 56.8806429,19.9793333 56.8806429,19.9793333 C56.7579762,19.9793333 56.6966429,20.0713333 56.6966429,20.2553333 C56.8499762,20.6233333 56.8039762,20.8993333 56.5586429,21.0833333 C56.4053095,21.1753333 56.2749762,21.3056667 56.1676429,21.4743333 C56.0603095,21.643 56.0066429,21.7273333 56.0066429,21.7273333 C56.1293095,21.85 56.1523095,22.0033333 56.0756429,22.1873333 C55.9989762,22.3713333 55.8993095,22.5706667 55.7766429,22.7853333 C55.7766429,23.0306667 55.7076429,23.3833333 55.5696429,23.8433333 C55.4316429,24.3033333 55.2859762,24.7326667 55.1326429,25.1313333 C55.1633095,25.6833333 55.1939762,26.036 55.2246429,26.1893333 C55.2553095,26.3426667 55.3319762,26.404 55.4546429,26.3733333 C55.6079762,26.404 55.7459762,26.404 55.8686429,26.3733333 C55.9913095,26.3426667 56.1139762,26.3273333 56.2366429,26.3273333 C56.6659762,26.1433333 56.4359762,27.2166667 55.5466429,29.5473333 C55.0559762,30.314 54.7186429,30.8736667 54.5346429,31.2263333 C54.3506429,31.579 54.1819762,31.7553333 54.0286429,31.7553333 Z" id="t"></path> | |
| <path d="M81.0766429,27.7073333 C80.4326429,27.83 80.0263095,27.8683333 79.8576429,27.8223333 C79.6889762,27.7763333 79.4359762,27.6 79.0986429,27.2933333 C78.6079762,27.048 78.2016429,26.7413333 77.8796429,26.3733333 C77.5576429,26.0053333 77.3276429,25.6143333 77.1896429,25.2003333 C77.0516429,24.7863333 76.9979762,24.4413333 77.0286429,24.1653333 C77.1206429,23.092 77.3813095,21.942 77.8106429,20.7153333 C78.2399762,19.4886667 78.7613095,18.308 79.3746429,17.1733333 C79.9879762,16.0386667 80.6549762,15.065 81.3756429,14.2523333 C82.0963095,13.4396667 82.7939762,12.9106667 83.4686429,12.6653333 C84.0819762,12.42 84.6646429,12.328 85.2166429,12.3893333 C85.7686429,12.4506667 86.1673095,12.742 86.4126429,13.2633333 C86.8726429,14.1526667 86.7653095,14.72 86.0906429,14.9653333 C85.9986429,14.9653333 85.8913095,15.0036667 85.7686429,15.0803333 C85.6459762,15.157 85.5846429,15.2566667 85.5846429,15.3793333 C85.7073095,15.4406667 86.0446429,15.4483333 86.5966429,15.4023333 C87.1486429,15.3563333 87.7083095,15.2643333 88.2756429,15.1263333 C88.8429762,14.9883333 89.2186429,14.8426667 89.4026429,14.6893333 C89.5866429,14.5973333 89.7246429,14.5513333 89.8166429,14.5513333 C89.9086429,14.5513333 90.1386429,14.582 90.5066429,14.6433333 C91.0279762,14.7966667 91.2886429,14.9806667 91.2886429,15.1953333 C91.2886429,15.318 91.3346429,15.433 91.4266429,15.5403333 C91.5186429,15.6476667 91.6259762,15.7013333 91.7486429,15.7013333 C91.9633095,15.732 91.9403095,15.87 91.6796429,16.1153333 C91.4189762,16.3606667 90.9819762,16.698 90.3686429,17.1273333 C89.7859762,17.4953333 89.4256429,17.733 89.2876429,17.8403333 C89.1496429,17.9476667 89.1266429,18.17 89.2186429,18.5073333 C89.4639762,19.09 89.4793095,19.7646667 89.2646429,20.5313333 C89.0499762,21.298 88.6666429,22.08 88.1146429,22.8773333 C87.5626429,23.6746667 86.8956429,24.4183333 86.1136429,25.1083333 C85.3316429,25.7983333 84.5036429,26.381 83.6296429,26.8563333 C82.7556429,27.3316667 81.9046429,27.6153333 81.0766429,27.7073333 Z M80.2946429,25.6833333 C80.4173095,25.6833333 80.6319762,25.6143333 80.9386429,25.4763333 C81.2453095,25.3383333 81.4906429,25.2233333 81.6746429,25.1313333 C81.7973095,25.0086667 81.9583095,24.863 82.1576429,24.6943333 C82.3569762,24.5256667 82.5179762,24.426 82.6406429,24.3953333 C82.7633095,24.3953333 82.9166429,24.3416667 83.1006429,24.2343333 C83.2846429,24.127 83.5453095,23.897 83.8826429,23.5443333 C84.2199762,23.1916667 84.6646429,22.6626667 85.2166429,21.9573333 C85.8299762,21.2826667 86.3053095,20.6616667 86.6426429,20.0943333 C86.9799762,19.527 87.0719762,18.998 86.9186429,18.5073333 C86.8879762,18.3846667 86.8036429,18.308 86.6656429,18.2773333 C86.5276429,18.2466667 86.3513095,18.17 86.1366429,18.0473333 C85.8299762,18.0473333 85.5463095,17.963 85.2856429,17.7943333 C85.0249762,17.6256667 84.7259762,17.4033333 84.3886429,17.1273333 L83.6526429,16.2073333 L82.8706429,16.9893333 C82.3799762,17.48 81.8663095,18.2083333 81.3296429,19.1743333 C80.7929762,20.1403333 80.3406429,21.1216667 79.9726429,22.1183333 C79.6046429,23.115 79.3899762,23.9046667 79.3286429,24.4873333 C79.2979762,24.9473333 79.3746429,25.254 79.5586429,25.4073333 C79.7426429,25.5606667 79.9879762,25.6526667 80.2946429,25.6833333 Z" id="o"></path> | |
| <path d="M108.768643,27.3393333 C108.15531,27.3393333 107.64931,27.209 107.250643,26.9483333 C106.851976,26.6876667 106.514643,26.2506667 106.238643,25.6373333 C106.115976,25.208 106.01631,24.725 105.939643,24.1883333 C105.862976,23.6516667 105.824643,23.1456667 105.824643,22.6703333 C105.824643,22.195 105.870643,21.8806667 105.962643,21.7273333 C106.08531,21.6046667 106.138976,21.3823333 106.123643,21.0603333 C106.10831,20.7383333 106.100643,20.3933333 106.100643,20.0253333 C106.069976,19.412 105.92431,19.067 105.663643,18.9903333 C105.402976,18.9136667 105.02731,19.0133333 104.536643,19.2893333 C103.984643,19.6266667 103.263976,20.079 102.374643,20.6463333 C101.48531,21.2136667 100.557643,21.8346667 99.5916429,22.5093333 C98.6256429,23.184 97.7133095,23.8893333 96.8546429,24.6253333 C96.1799762,25.3613333 95.7736429,25.921 95.6356429,26.3043333 C95.4976429,26.6876667 95.3059762,26.8793333 95.0606429,26.8793333 C94.8153095,27.002 94.6083095,27.0096667 94.4396429,26.9023333 C94.2709762,26.795 94.0333095,26.6186667 93.7266429,26.3733333 C93.5119762,26.128 93.2973095,25.8903333 93.0826429,25.6603333 C92.8679762,25.4303333 92.7299762,25.254 92.6686429,25.1313333 C92.6686429,24.978 92.7146429,24.656 92.8066429,24.1653333 C92.8986429,23.6746667 93.0136429,23.184 93.1516429,22.6933333 C93.2896429,22.2026667 93.3893095,21.8806667 93.4506429,21.7273333 C93.6039762,21.7273333 93.7343095,21.574 93.8416429,21.2673333 C93.9489762,20.9606667 94.1253095,20.6233333 94.3706429,20.2553333 C94.4319762,19.8873333 94.5929762,19.389 94.8536429,18.7603333 C95.1143095,18.1316667 95.3519762,17.572 95.5666429,17.0813333 C95.9959762,16.3453333 96.2949762,15.732 96.4636429,15.2413333 C96.6323095,14.7506667 96.7473095,14.1373333 96.8086429,13.4013333 C96.7779762,13.2786667 96.8086429,13.1636667 96.9006429,13.0563333 C96.9926429,12.949 97.0999762,12.8953333 97.2226429,12.8953333 L97.2226429,12.8953333 L97.2226429,12.8953333 C97.4679762,12.65 97.7593095,12.581 98.0966429,12.6883333 C98.4339762,12.7956667 98.7406429,13.0333333 99.0166429,13.4013333 C99.5686429,14.1373333 99.7909762,14.8963333 99.6836429,15.6783333 C99.5763095,16.4603333 99.0779762,17.572 98.1886429,19.0133333 C97.9739762,19.504 97.8129762,19.8796667 97.7056429,20.1403333 C97.5983095,20.401 97.5446429,20.608 97.5446429,20.7613333 C97.5446429,20.7613333 97.7056429,20.654 98.0276429,20.4393333 C98.3496429,20.2246667 98.7176429,19.9716667 99.1316429,19.6803333 C99.5456429,19.389 99.8753095,19.1666667 100.120643,19.0133333 C100.273976,18.86 100.626643,18.584 101.178643,18.1853333 C101.730643,17.7866667 102.320976,17.3956667 102.949643,17.0123333 C103.57831,16.629 104.045976,16.4066667 104.352643,16.3453333 C104.597976,16.2226667 104.858643,16.1076667 105.134643,16.0003333 C105.410643,15.893 105.609976,15.8393333 105.732643,15.8393333 C105.977976,15.8393333 106.29231,15.9696667 106.675643,16.2303333 C107.058976,16.491 107.41931,16.7976667 107.756643,17.1503333 C108.093976,17.503 108.29331,17.802 108.354643,18.0473333 C108.354643,18.17 108.36231,18.2926667 108.377643,18.4153333 C108.392976,18.538 108.415976,18.6606667 108.446643,18.7833333 C108.56931,19.182 108.63831,19.7186667 108.653643,20.3933333 C108.668976,21.068 108.645976,21.6813333 108.584643,22.2333333 C108.52331,22.7853333 108.415976,23.1073333 108.262643,23.1993333 C108.262643,23.1993333 108.27031,23.2376667 108.285643,23.3143333 C108.300976,23.391 108.369976,23.4293333 108.492643,23.4293333 C108.492643,23.552 108.492643,23.621 108.492643,23.6363333 C108.492643,23.6516667 108.492643,23.6593333 108.492643,23.6593333 C108.33931,23.6593333 108.277976,23.7896667 108.308643,24.0503333 C108.33931,24.311 108.438976,24.5946667 108.607643,24.9013333 C108.77631,25.208 108.952643,25.4533333 109.136643,25.6373333 C109.504643,26.0053333 109.657976,26.3503333 109.596643,26.6723333 C109.53531,26.9943333 109.25931,27.2166667 108.768643,27.3393333 Z" id="n"></path> | |
| <path d="M116.404643,28.3513333 C115.208643,27.8606667 114.43431,27.1783333 114.081643,26.3043333 C113.728976,25.4303333 113.659976,24.0733333 113.874643,22.2333333 C113.935976,21.2826667 113.966643,20.654 113.966643,20.3473333 C113.966643,20.0406667 113.797976,19.734 113.460643,19.4273333 C113.368643,19.3046667 113.207643,19.136 112.977643,18.9213333 C112.747643,18.7066667 112.647976,18.5226667 112.678643,18.3693333 C112.647976,18.1546667 112.66331,17.917 112.724643,17.6563333 C112.785976,17.3956667 112.877976,17.2653333 113.000643,17.2653333 C113.12331,17.2653333 113.253643,17.2346667 113.391643,17.1733333 C113.529643,17.112 113.659976,17.112 113.782643,17.1733333 C113.90531,17.1733333 114.04331,17.1886667 114.196643,17.2193333 C114.349976,17.25 114.426643,17.3266667 114.426643,17.4493333 C114.54931,17.664 114.748643,17.687 115.024643,17.5183333 C115.300643,17.3496667 115.591976,16.9586667 115.898643,16.3453333 C116.20531,15.8546667 116.611643,15.364 117.117643,14.8733333 C117.623643,14.3826667 118.129643,13.9303333 118.635643,13.5163333 C119.141643,13.1023333 119.56331,12.8033333 119.900643,12.6193333 C120.053976,12.558 120.283976,12.4813333 120.590643,12.3893333 C120.89731,12.2973333 121.226976,12.2206667 121.579643,12.1593333 C121.93231,12.098 122.23131,12.0826667 122.476643,12.1133333 C123.028643,12.144 123.49631,12.2973333 123.879643,12.5733333 C124.262976,12.8493333 124.62331,13.1713333 124.960643,13.5393333 C125.35931,13.8153333 125.61231,14.1833333 125.719643,14.6433333 C125.826976,15.1033333 125.849976,15.594 125.788643,16.1153333 C125.72731,16.6366667 125.58931,17.112 125.374643,17.5413333 C125.282643,17.848 125.021976,18.216 124.592643,18.6453333 C124.16331,19.0746667 123.672643,19.4886667 123.120643,19.8873333 C122.568643,20.286 122.062643,20.5773333 121.602643,20.7613333 C121.203976,20.8533333 120.69031,20.93 120.061643,20.9913333 C119.432976,21.0526667 118.85031,21.0756667 118.313643,21.0603333 C117.776976,21.045 117.416643,20.9913333 117.232643,20.8993333 C117.017976,20.7766667 116.84931,20.9453333 116.726643,21.4053333 C116.603976,21.8653333 116.511976,22.5246667 116.450643,23.3833333 C116.38931,24.058 116.38931,24.5486667 116.450643,24.8553333 C116.511976,25.162 116.57331,25.3766667 116.634643,25.4993333 C116.84931,25.714 117.14831,25.9823333 117.531643,26.3043333 C117.914976,26.6263333 118.45931,26.68 119.164643,26.4653333 C119.74731,26.312 120.32231,25.9133333 120.889643,25.2693333 C121.456976,24.6253333 121.985976,24.104 122.476643,23.7053333 C122.59931,23.4906667 122.80631,23.3603333 123.097643,23.3143333 C123.388976,23.2683333 123.70331,23.2913333 124.040643,23.3833333 C124.377976,23.598 124.523643,23.851 124.477643,24.1423333 C124.431643,24.4336667 124.270643,24.8706667 123.994643,25.4533333 C123.902643,25.668 123.695643,25.9363333 123.373643,26.2583333 C123.051643,26.5803333 122.698976,26.9023333 122.315643,27.2243333 C121.93231,27.5463333 121.58731,27.7993333 121.280643,27.9833333 C120.360643,28.474 119.501976,28.727 118.704643,28.7423333 C117.90731,28.7576667 117.140643,28.6273333 116.404643,28.3513333 Z M119.118643,19.0133333 C119.79331,18.86 120.329976,18.7526667 120.728643,18.6913333 C121.12731,18.63 121.510643,18.4536667 121.878643,18.1623333 C122.246643,17.871 122.706643,17.3113333 123.258643,16.4833333 C123.38131,16.146 123.419643,15.8086667 123.373643,15.4713333 C123.327643,15.134 123.24331,14.904 123.120643,14.7813333 C122.844643,14.4746667 122.514976,14.375 122.131643,14.4823333 C121.74831,14.5896667 121.387976,14.766 121.050643,15.0113333 C120.835976,15.1033333 120.521643,15.3256667 120.107643,15.6783333 C119.693643,16.031 119.28731,16.4296667 118.888643,16.8743333 C118.489976,17.319 118.167976,17.7253333 117.922643,18.0933333 C117.67731,18.4613333 117.615976,18.676 117.738643,18.7373333 C117.67731,18.86 117.853643,18.9366667 118.267643,18.9673333 C118.681643,18.998 118.96531,19.0133333 119.118643,19.0133333 Z" id="e"></path> | |
| <path d="M140.554643,27.7533333 C140.462643,27.6306667 140.37831,27.4773333 140.301643,27.2933333 C140.224976,27.1093333 140.186643,26.956 140.186643,26.8333333 C140.186643,26.772 140.178976,26.6953333 140.163643,26.6033333 C140.14831,26.5113333 140.07931,26.4653333 139.956643,26.4653333 C139.864643,26.3733333 139.933643,26.013 140.163643,25.3843333 C140.393643,24.7556667 140.70031,24.0273333 141.083643,23.1993333 C141.466976,22.3713333 141.865643,21.5663333 142.279643,20.7843333 C142.693643,20.0023333 143.038643,19.3813333 143.314643,18.9213333 C143.467976,18.8293333 143.567643,18.699 143.613643,18.5303333 C143.659643,18.3616667 143.651976,18.2773333 143.590643,18.2773333 C143.590643,18.2773333 143.674976,18.1316667 143.843643,17.8403333 C144.01231,17.549 144.142643,17.3573333 144.234643,17.2653333 C144.479976,16.836 144.663976,16.399 144.786643,15.9543333 C144.90931,15.5096667 144.939976,15.134 144.878643,14.8273333 C144.755976,14.674 144.617976,14.628 144.464643,14.6893333 C144.31131,14.7506667 144.234643,14.7813333 144.234643,14.7813333 C144.111976,14.812 143.935643,14.8656667 143.705643,14.9423333 C143.475643,15.019 143.268643,15.1186667 143.084643,15.2413333 C142.37931,15.732 141.903976,15.9543333 141.658643,15.9083333 C141.41331,15.8623333 141.13731,15.4713333 140.830643,14.7353333 C140.707976,14.398 140.661976,14.1526667 140.692643,13.9993333 C140.72331,13.846 140.845976,13.6773333 141.060643,13.4933333 C141.305976,13.2786667 141.535976,13.133 141.750643,13.0563333 C141.96531,12.9796667 142.133976,12.8953333 142.256643,12.8033333 C142.593976,12.5886667 142.877643,12.4353333 143.107643,12.3433333 C143.337643,12.2513333 143.513976,12.19 143.636643,12.1593333 C144.433976,11.914 145.108643,11.868 145.660643,12.0213333 C146.212643,12.1746667 146.626643,12.5733333 146.902643,13.2173333 C147.331976,13.7386667 147.546643,14.329 147.546643,14.9883333 C147.546643,15.6476667 147.331976,16.4066667 146.902643,17.2653333 L146.442643,17.9553333 C146.28931,18.262 146.26631,18.4153333 146.373643,18.4153333 C146.480976,18.4153333 146.61131,18.308 146.764643,18.0933333 C146.856643,17.9706667 147.040643,17.7866667 147.316643,17.5413333 C147.592643,17.296 147.776643,17.1733333 147.868643,17.1733333 C147.868643,17.1733333 147.906976,17.158 147.983643,17.1273333 C148.06031,17.0966667 148.098643,16.974 148.098643,16.7593333 C148.190643,16.6673333 148.29031,16.5753333 148.397643,16.4833333 C148.504976,16.3913333 148.558643,16.3453333 148.558643,16.3453333 C148.68131,16.3453333 148.918976,16.1996667 149.271643,15.9083333 C149.62431,15.617 150.045976,15.272 150.536643,14.8733333 C150.873976,14.628 151.180643,14.5053333 151.456643,14.5053333 C152.161976,14.2906667 152.736976,14.5206667 153.181643,15.1953333 C153.62631,15.87 153.848643,16.744 153.848643,17.8173333 L152.882643,20.3013333 L154.538643,18.2773333 C154.722643,18.032 154.91431,17.8173333 155.113643,17.6333333 C155.312976,17.4493333 155.48931,17.296 155.642643,17.1733333 C155.703976,16.9586667 155.795976,16.836 155.918643,16.8053333 C156.04131,16.7746667 156.102643,16.7593333 156.102643,16.7593333 C156.102643,16.7593333 156.13331,16.7516667 156.194643,16.7363333 C156.255976,16.721 156.286643,16.6673333 156.286643,16.5753333 C156.439976,16.4526667 156.608643,16.3376667 156.792643,16.2303333 C156.976643,16.123 157.09931,16.008 157.160643,15.8853333 C157.681976,15.6706667 158.15731,15.6323333 158.586643,15.7703333 C159.015976,15.9083333 159.383976,16.2993333 159.690643,16.9433333 C159.90531,17.3113333 160.027976,17.6333333 160.058643,17.9093333 C160.08931,18.1853333 160.104643,18.5993333 160.104643,19.1513333 C160.04331,19.6113333 159.989643,19.9716667 159.943643,20.2323333 C159.897643,20.493 159.85931,20.7613333 159.828643,21.0373333 C159.797976,21.3133333 159.751976,21.6966667 159.690643,22.1873333 C159.567976,22.4326667 159.498976,22.6933333 159.483643,22.9693333 C159.46831,23.2453333 159.460643,23.506 159.460643,23.7513333 C159.460643,24.15 159.475976,24.4183333 159.506643,24.5563333 C159.53731,24.6943333 159.659976,24.7633333 159.874643,24.7633333 C160.303976,24.6713333 160.89431,24.449 161.645643,24.0963333 C162.396976,23.7436667 162.956643,23.3986667 163.324643,23.0613333 C163.784643,22.632 164.190976,22.4096667 164.543643,22.3943333 C164.89631,22.379 165.118643,22.5553333 165.210643,22.9233333 C165.271976,23.046 165.17231,23.322 164.911643,23.7513333 C164.650976,24.1806667 164.359643,24.5946667 164.037643,24.9933333 C163.715643,25.392 163.477976,25.5913333 163.324643,25.5913333 C163.232643,25.5913333 163.12531,25.6756667 163.002643,25.8443333 C162.879976,26.013 162.741976,26.1433333 162.588643,26.2353333 C162.373976,26.45 162.166976,26.6493333 161.967643,26.8333333 C161.76831,27.0173333 161.545976,27.1093333 161.300643,27.1093333 C161.177976,27.1093333 161.03231,27.1476667 160.863643,27.2243333 C160.694976,27.301 160.50331,27.3393333 160.288643,27.3393333 C159.981976,27.4313333 159.51431,27.3853333 158.885643,27.2013333 C158.256976,27.0173333 157.850643,26.588 157.666643,25.9133333 C157.543976,25.576 157.436643,25.0316667 157.344643,24.2803333 C157.252643,23.529 157.267976,22.77 157.390643,22.0033333 C157.51331,21.4513333 157.589976,20.9453333 157.620643,20.4853333 C157.65131,20.0253333 157.712643,19.7033333 157.804643,19.5193333 C157.804643,19.4273333 157.804643,19.205 157.804643,18.8523333 C157.804643,18.4996667 157.758643,18.3233333 157.666643,18.3233333 C157.543976,18.3233333 157.26031,18.5456667 156.815643,18.9903333 C156.370976,19.435 155.849643,19.9946667 155.251643,20.6693333 C154.653643,21.344 154.06331,22.0493333 153.480643,22.7853333 C152.897976,23.5213333 152.422643,24.1806667 152.054643,24.7633333 C151.778643,25.1006667 151.53331,25.5146667 151.318643,26.0053333 C151.103976,26.496 150.950643,26.772 150.858643,26.8333333 C150.643976,27.0786667 150.390976,27.1093333 150.099643,26.9253333 C149.80831,26.7413333 149.539976,26.45 149.294643,26.0513333 C149.202643,25.8673333 149.14131,25.7063333 149.110643,25.5683333 C149.079976,25.4303333 149.087643,25.231 149.133643,24.9703333 C149.179643,24.7096667 149.286976,24.3186667 149.455643,23.7973333 C149.62431,23.276 149.861976,22.54 150.168643,21.5893333 C150.505976,20.5466667 150.804976,19.6036667 151.065643,18.7603333 C151.32631,17.917 151.456643,17.4953333 151.456643,17.4953333 C151.456643,17.3726667 151.226643,17.4876667 150.766643,17.8403333 C150.306643,18.193 149.769976,18.63 149.156643,19.1513333 C148.880643,19.4886667 148.420643,19.9946667 147.776643,20.6693333 C147.132643,21.344 146.42731,22.1106667 145.660643,22.9693333 C144.893976,23.828 144.157976,24.7326667 143.452643,25.6833333 C142.56331,26.9406667 141.94231,27.7073333 141.589643,27.9833333 C141.236976,28.2593333 140.891976,28.1826667 140.554643,27.7533333 Z" id="m"></path> | |
| <path d="M170.592643,28.7653333 C170.193976,28.7653333 169.879643,28.6886667 169.649643,28.5353333 C169.419643,28.382 169.135976,28.1673333 168.798643,27.8913333 C168.215976,27.278 167.801976,26.6876667 167.556643,26.1203333 C167.31131,25.553 167.234643,25.0086667 167.326643,24.4873333 C167.418643,24.242 167.456976,24.0043333 167.441643,23.7743333 C167.42631,23.5443333 167.418643,23.4293333 167.418643,23.4293333 C167.26531,23.276 167.21931,23.1763333 167.280643,23.1303333 C167.341976,23.0843333 167.40331,23 167.464643,22.8773333 C167.648643,22.8773333 167.709976,22.7086667 167.648643,22.3713333 C167.58731,22.126 167.709976,21.5893333 168.016643,20.7613333 C168.32331,19.9333333 168.706643,19.1513333 169.166643,18.4153333 C169.350643,18.1086667 169.626643,17.7023333 169.994643,17.1963333 C170.362643,16.6903333 170.768976,16.1843333 171.213643,15.6783333 C171.65831,15.1723333 172.064643,14.766 172.432643,14.4593333 C173.19931,13.8153333 173.873976,13.34 174.456643,13.0333333 C175.03931,12.7266667 175.667976,12.4966667 176.342643,12.3433333 C177.01731,12.19 177.484976,12.1133333 177.745643,12.1133333 C178.00631,12.1133333 178.366643,12.3586667 178.826643,12.8493333 C179.531976,13.156 180.045643,13.524 180.367643,13.9533333 C180.689643,14.3826667 180.896643,15.0113333 180.988643,15.8393333 C181.080643,16.7593333 181.011643,17.8096667 180.781643,18.9903333 C180.551643,20.171 179.82331,21.6353333 178.596643,23.3833333 C177.829976,24.4873333 177.124643,25.3076667 176.480643,25.8443333 C175.836643,26.381 175.069976,26.91 174.180643,27.4313333 C173.536643,27.8606667 172.953976,28.175 172.432643,28.3743333 C171.91131,28.5736667 171.297976,28.704 170.592643,28.7653333 Z M175.008643,23.8893333 C175.744643,23.0613333 176.334976,22.2793333 176.779643,21.5433333 C177.22431,20.8073333 177.645976,19.872 178.044643,18.7373333 C178.16731,18.4 178.243976,17.9783333 178.274643,17.4723333 C178.30531,16.9663333 178.297643,16.491 178.251643,16.0463333 C178.205643,15.6016667 178.090643,15.3486667 177.906643,15.2873333 C177.538643,15.0726667 177.093976,15.0036667 176.572643,15.0803333 C176.05131,15.157 175.483976,15.456 174.870643,15.9773333 C173.919976,16.7746667 173.091976,17.7636667 172.386643,18.9443333 C171.68131,20.125 170.99131,21.4666667 170.316643,22.9693333 C169.856643,24.0733333 169.756976,24.955 170.017643,25.6143333 C170.27831,26.2736667 170.845643,26.5036667 171.719643,26.3043333 C172.593643,26.105 173.689976,25.3 175.008643,23.8893333 Z" id="o"></path> | |
| <path d="M185.956643,28.3973333 C185.80331,28.704 185.580976,28.796 185.289643,28.6733333 C184.99831,28.5506667 184.760643,28.428 184.576643,28.3053333 C184.361976,28.3053333 184.177976,28.244 184.024643,28.1213333 C183.87131,27.9986667 183.763976,27.8146667 183.702643,27.5693333 C183.64131,27.3853333 183.625976,27.163 183.656643,26.9023333 C183.68731,26.6416667 183.75631,26.335 183.863643,25.9823333 C183.970976,25.6296667 184.085976,25.2386667 184.208643,24.8093333 C184.453976,23.7973333 184.622643,23.0613333 184.714643,22.6013333 C184.806643,22.1413333 184.898643,21.7426667 184.990643,21.4053333 C185.082643,21.068 185.20531,20.5773333 185.358643,19.9333333 C185.603976,19.32 185.80331,18.722 185.956643,18.1393333 C186.109976,17.5566667 186.339976,16.974 186.646643,16.3913333 C186.86131,15.594 187.129643,14.835 187.451643,14.1143333 C187.773643,13.3936667 188.087976,12.788 188.394643,12.2973333 C188.455976,12.2053333 188.570976,12.0826667 188.739643,11.9293333 C188.90831,11.776 189.053976,11.6993333 189.176643,11.6993333 C189.421976,11.454 189.64431,11.3543333 189.843643,11.4003333 C190.042976,11.4463333 190.295976,11.592 190.602643,11.8373333 C190.970643,12.236 191.11631,12.696 191.039643,13.2173333 C190.962976,13.7386667 190.58731,14.5053333 189.912643,15.5173333 C189.544643,16.468 189.20731,17.2883333 188.900643,17.9783333 C188.593976,18.6683333 188.37931,19.32 188.256643,19.9333333 C188.593976,19.4426667 188.969643,18.9903333 189.383643,18.5763333 C189.797643,18.1623333 190.142643,17.8173333 190.418643,17.5413333 C191.09331,16.8666667 191.652976,16.376 192.097643,16.0693333 C192.54231,15.7626667 193.07131,15.41 193.684643,15.0113333 C194.052643,14.766 194.40531,14.5436667 194.742643,14.3443333 C195.079976,14.145 195.455643,13.9993333 195.869643,13.9073333 C196.283643,13.8153333 196.735976,13.8153333 197.226643,13.9073333 C197.53331,13.8766667 197.78631,13.9686667 197.985643,14.1833333 C198.184976,14.398 198.345976,14.6893333 198.468643,15.0573333 C198.59131,15.4253333 198.667976,15.8546667 198.698643,16.3453333 C197.99331,16.192 197.364643,16.215 196.812643,16.4143333 C196.260643,16.6136667 195.792976,16.8513333 195.409643,17.1273333 C195.02631,17.4033333 194.72731,17.618 194.512643,17.7713333 C194.052643,18.078 193.469976,18.4843333 192.764643,18.9903333 C192.05931,19.4963333 191.353976,20.102 190.648643,20.8073333 C190.096643,21.4206667 189.628976,21.942 189.245643,22.3713333 C188.86231,22.8006667 188.555643,23.184 188.325643,23.5213333 C188.095643,23.8586667 187.91931,24.2113333 187.796643,24.5793333 C187.489976,25.2846667 187.167976,26.0513333 186.830643,26.8793333 C186.49331,27.7073333 186.201976,28.2133333 185.956643,28.3973333 Z" id="r"></path> | |
| <path d="M204.632643,29.5933333 C203.28331,29.5933333 202.17931,29.0796667 201.320643,28.0523333 C200.461976,27.025 200.047976,25.7446667 200.078643,24.2113333 C200.139976,23.1073333 200.36231,21.919 200.745643,20.6463333 C201.128976,19.3736667 201.642643,18.147 202.286643,16.9663333 C202.930643,15.7856667 203.635976,14.7506667 204.402643,13.8613333 C205.16931,12.972 205.966643,12.3433333 206.794643,11.9753333 C207.10131,11.822 207.430976,11.6993333 207.783643,11.6073333 C208.13631,11.5153333 208.496643,11.4693333 208.864643,11.4693333 C209.201976,11.4693333 209.554643,11.523 209.922643,11.6303333 C210.290643,11.7376667 210.59731,11.8526667 210.842643,11.9753333 C211.363976,12.19 211.762643,12.4506667 212.038643,12.7573333 C212.314643,13.064 212.559976,13.5393333 212.774643,14.1833333 C212.866643,14.766 212.912643,15.18 212.912643,15.4253333 C212.912643,15.6706667 212.835976,16.0386667 212.682643,16.5293333 C212.314643,17.6333333 211.83931,18.584 211.256643,19.3813333 C210.673976,20.1786667 209.891976,20.8533333 208.910643,21.4053333 C208.66531,21.5586667 208.381643,21.6736667 208.059643,21.7503333 C207.737643,21.827 207.407976,21.8653333 207.070643,21.8653333 C206.45731,21.8653333 205.866976,21.7503333 205.299643,21.5203333 C204.73231,21.2903333 204.279976,20.9453333 203.942643,20.4853333 L203.620643,20.1173333 L203.482643,20.4853333 C203.175976,21.3133333 202.93831,22.08 202.769643,22.7853333 C202.600976,23.4906667 202.516643,24.1346667 202.516643,24.7173333 C202.516643,25.0853333 202.554976,25.438 202.631643,25.7753333 C202.70831,26.1126667 202.82331,26.404 202.976643,26.6493333 C203.09931,26.8333333 203.30631,26.9636667 203.597643,27.0403333 C203.888976,27.117 204.20331,27.1553333 204.540643,27.1553333 C204.75531,27.1553333 204.977643,27.1476667 205.207643,27.1323333 C205.437643,27.117 205.659976,27.0633333 205.874643,26.9713333 C206.395976,26.7873333 206.817643,26.588 207.139643,26.3733333 C207.461643,26.1586667 207.79131,25.9286667 208.128643,25.6833333 L208.312643,25.5913333 L208.266643,25.5913333 C208.634643,25.4073333 208.96431,25.2233333 209.255643,25.0393333 C209.546976,24.8553333 209.692643,24.7633333 209.692643,24.7633333 C209.81531,24.7633333 209.937976,24.6866667 210.060643,24.5333333 C210.305976,24.4106667 210.62031,24.4566667 211.003643,24.6713333 C211.386976,24.886 211.578643,25.162 211.578643,25.4993333 C211.547976,25.6526667 211.409976,25.8903333 211.164643,26.2123333 C210.91931,26.5343333 210.650976,26.8333333 210.359643,27.1093333 C210.06831,27.3853333 209.830643,27.5386667 209.646643,27.5693333 C209.615976,27.6 209.508643,27.6536667 209.324643,27.7303333 C209.140643,27.807 209.017976,27.876 208.956643,27.9373333 L209.002643,27.9373333 C208.726643,28.3053333 208.450643,28.4893333 208.174643,28.4893333 L207.806643,28.4893333 C207.683976,28.704 207.28531,28.9416667 206.610643,29.2023333 C205.935976,29.463 205.276643,29.5933333 204.632643,29.5933333 Z M206.702643,19.4733333 C207.254643,19.4733333 207.737643,19.3123333 208.151643,18.9903333 C208.565643,18.6683333 208.925976,18.308 209.232643,17.9093333 C209.845976,17.0813333 210.20631,16.2763333 210.313643,15.4943333 C210.420976,14.7123333 210.32131,14.168 210.014643,13.8613333 C209.830643,13.7693333 209.669643,13.7156667 209.531643,13.7003333 C209.393643,13.685 209.12531,13.7386667 208.726643,13.8613333 C208.450643,13.9226667 208.06731,14.1526667 207.576643,14.5513333 C207.085976,14.95 206.602976,15.3946667 206.127643,15.8853333 C205.65231,16.376 205.291976,16.79 205.046643,17.1273333 L204.448643,18.0933333 C204.693976,18.0013333 204.931643,17.9476667 205.161643,17.9323333 C205.391643,17.917 205.521976,17.94 205.552643,18.0013333 C205.552643,18.2773333 205.60631,18.5303333 205.713643,18.7603333 C205.820976,18.9903333 205.958976,19.1666667 206.127643,19.2893333 C206.29631,19.412 206.487976,19.4733333 206.702643,19.4733333 Z" id="e"></path> | |
| <path d="M225.332643,38.6093333 C224.596643,38.824 223.791643,38.8623333 222.917643,38.7243333 C222.043643,38.5863333 221.276976,38.318 220.617643,37.9193333 C219.95831,37.5206667 219.582643,37.076 219.490643,36.5853333 C219.459976,36.4013333 219.513643,36.202 219.651643,35.9873333 C219.789643,35.7726667 219.95831,35.627 220.157643,35.5503333 C220.356976,35.4736667 220.53331,35.5273333 220.686643,35.7113333 C220.931976,35.8646667 221.376643,36.0563333 222.020643,36.2863333 C222.664643,36.5163333 223.38531,36.5546667 224.182643,36.4013333 C224.887976,36.248 225.585643,35.834 226.275643,35.1593333 C226.965643,34.4846667 227.52531,33.856 227.954643,33.2733333 C228.199976,32.9053333 228.613976,32.246 229.196643,31.2953333 C229.77931,30.3446667 230.384976,29.2943333 231.013643,28.1443333 C231.64231,26.9943333 232.17131,25.9286667 232.600643,24.9473333 C232.692643,24.702 232.799976,24.4106667 232.922643,24.0733333 C233.04531,23.736 233.198643,23.46 233.382643,23.2453333 C233.566643,22.8773333 233.727643,22.5323333 233.865643,22.2103333 C234.003643,21.8883333 234.087976,21.666 234.118643,21.5433333 C234.14931,21.39 234.28731,21.0833333 234.532643,20.6233333 C234.777976,20.1633333 235.007976,19.7033333 235.222643,19.2433333 C235.375976,18.7833333 235.605976,18.1086667 235.912643,17.2193333 C236.21931,16.33 236.525976,15.6093333 236.832643,15.0573333 C237.200643,14.352 237.499643,13.777 237.729643,13.3323333 C237.959643,12.8876667 238.212643,12.6193333 238.488643,12.5273333 L238.488643,12.5273333 L238.488643,12.5273333 C238.764643,12.3126667 238.95631,12.2053333 239.063643,12.2053333 C239.170976,12.2053333 239.39331,12.2973333 239.730643,12.4813333 C240.098643,12.8493333 240.328643,13.2096667 240.420643,13.5623333 C240.512643,13.915 240.47431,14.3443333 240.305643,14.8503333 C240.136976,15.3563333 239.822643,16.0386667 239.362643,16.8973333 C239.11731,17.6333333 238.848976,18.3003333 238.557643,18.8983333 C238.26631,19.4963333 238.043976,19.8873333 237.890643,20.0713333 C237.73731,20.4393333 237.560976,20.8456667 237.361643,21.2903333 C237.16231,21.735 236.985976,22.1413333 236.832643,22.5093333 C236.280643,23.736 235.80531,24.7326667 235.406643,25.4993333 C235.007976,26.266 234.65531,26.9713333 234.348643,27.6153333 C234.041976,28.2593333 233.719976,29.0106667 233.382643,29.8693333 C232.67731,31.004 231.994976,32.085 231.335643,33.1123333 C230.67631,34.1396667 229.978643,35.098 229.242643,35.9873333 C228.935976,36.2633333 228.552643,36.5853333 228.092643,36.9533333 C227.632643,37.3213333 227.164976,37.6586667 226.689643,37.9653333 C226.21431,38.272 225.761976,38.4866667 225.332643,38.6093333 Z M231.542643,27.5693333 C231.082643,27.508 230.63031,27.232 230.185643,26.7413333 C229.740976,26.2506667 229.395976,25.7293333 229.150643,25.1773333 C228.90531,24.6253333 228.81331,24.2266667 228.874643,23.9813333 C228.874643,23.828 228.874643,23.7053333 228.874643,23.6133333 C228.874643,23.5213333 228.874643,23.4753333 228.874643,23.4753333 C228.690643,23.4753333 228.529643,23.2453333 228.391643,22.7853333 C228.253643,22.3253333 228.153976,21.7273333 228.092643,20.9913333 C228.03131,20.2553333 227.992976,19.4733333 227.977643,18.6453333 C227.96231,17.8173333 227.98531,17.0353333 228.046643,16.2993333 C228.16931,15.778 228.230643,15.203 228.230643,14.5743333 C228.230643,13.9456667 228.245976,13.4473333 228.276643,13.0793333 C228.245976,12.5886667 228.291976,12.259 228.414643,12.0903333 C228.53731,11.9216667 228.659976,11.7913333 228.782643,11.6993333 L228.782643,11.6993333 L228.782643,11.6993333 C229.64131,11.3313333 230.21631,11.5536667 230.507643,12.3663333 C230.798976,13.179 230.867976,14.6893333 230.714643,16.8973333 C230.65331,18.124 230.65331,19.3506667 230.714643,20.5773333 C230.775976,21.804 230.95231,22.8773333 231.243643,23.7973333 C231.534976,24.7173333 231.94131,25.346 232.462643,25.6833333 C232.67731,25.806 232.784643,25.9746667 232.784643,26.1893333 C232.784643,26.404 232.72331,26.6263333 232.600643,26.8563333 C232.477976,27.0863333 232.316976,27.2703333 232.117643,27.4083333 C231.91831,27.5463333 231.726643,27.6 231.542643,27.5693333 Z" id="y"></path> | |
| <path d="M246.630643,29.1793333 C246.231976,29.21 245.909976,29.1716667 245.664643,29.0643333 C245.41931,28.957 245.112643,28.796 244.744643,28.5813333 C244.069976,28.06 243.571643,27.531 243.249643,26.9943333 C242.927643,26.4576667 242.781976,25.9286667 242.812643,25.4073333 C242.873976,25.1313333 242.881643,24.886 242.835643,24.6713333 C242.789643,24.4566667 242.766643,24.3493333 242.766643,24.3493333 C242.582643,24.196 242.52131,24.0963333 242.582643,24.0503333 C242.643976,24.0043333 242.689976,23.92 242.720643,23.7973333 C242.965976,23.736 242.996643,23.5673333 242.812643,23.2913333 C242.720643,23.046 242.77431,22.4863333 242.973643,21.6123333 C243.172976,20.7383333 243.44131,19.918 243.778643,19.1513333 C243.931976,18.814 244.15431,18.3693333 244.445643,17.8173333 C244.736976,17.2653333 245.066643,16.7056667 245.434643,16.1383333 C245.802643,15.571 246.139976,15.1186667 246.446643,14.7813333 C247.12131,14.0146667 247.726976,13.4396667 248.263643,13.0563333 C248.80031,12.673 249.405976,12.3586667 250.080643,12.1133333 C250.693976,11.868 251.138643,11.73 251.414643,11.6993333 C251.690643,11.6686667 252.073976,11.8526667 252.564643,12.2513333 C253.300643,12.466 253.86031,12.765 254.243643,13.1483333 C254.626976,13.5316667 254.925976,14.122 255.140643,14.9193333 C255.385976,15.8086667 255.47031,16.859 255.393643,18.0703333 C255.316976,19.2816667 254.787976,20.838 253.806643,22.7393333 C253.223976,23.9353333 252.648976,24.84 252.081643,25.4533333 C251.51431,26.0666667 250.831976,26.7106667 250.034643,27.3853333 C249.451976,27.876 248.91531,28.2593333 248.424643,28.5353333 C247.933976,28.8113333 247.335976,29.026 246.630643,29.1793333 Z M250.310643,23.7053333 C250.923976,22.7853333 251.406976,21.9343333 251.759643,21.1523333 C252.11231,20.3703333 252.395976,19.3813333 252.610643,18.1853333 C252.671976,17.848 252.68731,17.4263333 252.656643,16.9203333 C252.625976,16.4143333 252.556976,15.9466667 252.449643,15.5173333 C252.34231,15.088 252.196643,14.858 252.012643,14.8273333 C251.613976,14.674 251.16931,14.6663333 250.678643,14.8043333 C250.187976,14.9423333 249.65131,15.318 249.068643,15.9313333 C248.54731,16.5446667 248.079643,17.2346667 247.665643,18.0013333 C247.251643,18.768 246.875976,19.6113333 246.538643,20.5313333 C246.20131,21.4513333 245.87931,22.4326667 245.572643,23.4753333 C245.265976,24.6406667 245.288976,25.53 245.641643,26.1433333 C245.99431,26.7566667 246.584643,26.9023333 247.412643,26.5803333 C248.240643,26.2583333 249.206643,25.3 250.310643,23.7053333 Z" id="o"></path> | |
| <path d="M258.958643,27.2933333 C258.651976,27.1093333 258.421976,26.9253333 258.268643,26.7413333 C258.11531,26.5573333 258.038643,26.2966667 258.038643,25.9593333 C258.038643,25.4993333 258.099976,25.0163333 258.222643,24.5103333 C258.34531,24.0043333 258.467976,23.506 258.590643,23.0153333 C258.651976,22.4633333 258.73631,21.9036667 258.843643,21.3363333 C258.950976,20.769 259.157976,20.24 259.464643,19.7493333 C259.801976,18.584 260.154643,17.4263333 260.522643,16.2763333 C260.890643,15.1263333 261.212643,13.938 261.488643,12.7113333 C261.88731,11.5766667 262.247643,10.5723333 262.569643,9.69833333 C262.891643,8.82433333 263.297976,7.71266667 263.788643,6.36333333 C264.064643,5.59666667 264.30231,4.77633333 264.501643,3.90233333 C264.700976,3.02833333 265.01531,2.23866667 265.444643,1.53333333 C265.628643,1.25733333 265.77431,1.01966667 265.881643,0.820333333 C265.988976,0.621 266.103976,0.429333333 266.226643,0.245333333 C266.25731,0.122666667 266.356976,0.046 266.525643,0.0153333333 C266.69431,-0.0153333333 266.885976,0 267.100643,0.0613333333 C267.31531,0.122666667 267.483976,0.23 267.606643,0.383333333 C267.698643,0.352666667 267.813643,0.437 267.951643,0.636333333 C268.089643,0.835666667 268.219976,1.058 268.342643,1.30333333 C268.46531,1.54866667 268.51131,1.76333333 268.480643,1.94733333 C268.480643,2.07 268.457643,2.23866667 268.411643,2.45333333 C268.365643,2.668 268.28131,2.86733333 268.158643,3.05133333 C268.035976,3.174 267.920976,3.35033333 267.813643,3.58033333 C267.70631,3.81033333 267.54531,4.12466667 267.330643,4.52333333 C267.207976,4.922 267.100643,5.32833333 267.008643,5.74233333 C266.916643,6.15633333 266.793976,6.532 266.640643,6.86933333 C266.517976,7.23733333 266.37231,7.59 266.203643,7.92733333 C266.034976,8.26466667 265.919976,8.54066667 265.858643,8.75533333 C265.643976,9.46066667 265.390976,10.1506667 265.099643,10.8253333 C264.80831,11.5 264.55531,12.2206667 264.340643,12.9873333 C264.125976,13.7233333 263.91131,14.4823333 263.696643,15.2643333 C263.481976,16.0463333 263.17531,16.79 262.776643,17.4953333 C262.561976,17.8326667 262.408643,18.262 262.316643,18.7833333 C262.224643,19.3046667 262.132643,19.826 262.040643,20.3473333 C261.856643,20.8993333 261.695643,21.413 261.557643,21.8883333 C261.419643,22.3636667 261.350643,22.6626667 261.350643,22.7853333 C261.166643,23.46 261.03631,24.127 260.959643,24.7863333 C260.882976,25.4456667 260.721976,26.0206667 260.476643,26.5113333 C260.445976,26.818 260.384643,27.0633333 260.292643,27.2473333 C260.200643,27.4313333 260.04731,27.531 259.832643,27.5463333 C259.617976,27.5616667 259.326643,27.4773333 258.958643,27.2933333 Z" id="l"></path> | |
| <path d="M269.170643,28.7653333 C268.771976,28.7653333 268.457643,28.6886667 268.227643,28.5353333 C267.997643,28.382 267.713976,28.1673333 267.376643,27.8913333 C266.793976,27.278 266.379976,26.6876667 266.134643,26.1203333 C265.88931,25.553 265.812643,25.0086667 265.904643,24.4873333 C265.996643,24.242 266.034976,24.0043333 266.019643,23.7743333 C266.00431,23.5443333 265.996643,23.4293333 265.996643,23.4293333 C265.84331,23.276 265.79731,23.1763333 265.858643,23.1303333 C265.919976,23.0843333 265.98131,23 266.042643,22.8773333 C266.226643,22.8773333 266.287976,22.7086667 266.226643,22.3713333 C266.16531,22.126 266.287976,21.5893333 266.594643,20.7613333 C266.90131,19.9333333 267.284643,19.1513333 267.744643,18.4153333 C267.928643,18.1086667 268.204643,17.7023333 268.572643,17.1963333 C268.940643,16.6903333 269.346976,16.1843333 269.791643,15.6783333 C270.23631,15.1723333 270.642643,14.766 271.010643,14.4593333 C271.77731,13.8153333 272.451976,13.34 273.034643,13.0333333 C273.61731,12.7266667 274.245976,12.4966667 274.920643,12.3433333 C275.59531,12.19 276.062976,12.1133333 276.323643,12.1133333 C276.58431,12.1133333 276.944643,12.3586667 277.404643,12.8493333 C278.109976,13.156 278.623643,13.524 278.945643,13.9533333 C279.267643,14.3826667 279.474643,15.0113333 279.566643,15.8393333 C279.658643,16.7593333 279.589643,17.8096667 279.359643,18.9903333 C279.129643,20.171 278.40131,21.6353333 277.174643,23.3833333 C276.407976,24.4873333 275.702643,25.3076667 275.058643,25.8443333 C274.414643,26.381 273.647976,26.91 272.758643,27.4313333 C272.114643,27.8606667 271.531976,28.175 271.010643,28.3743333 C270.48931,28.5736667 269.875976,28.704 269.170643,28.7653333 Z M273.586643,23.8893333 C274.322643,23.0613333 274.912976,22.2793333 275.357643,21.5433333 C275.80231,20.8073333 276.223976,19.872 276.622643,18.7373333 C276.74531,18.4 276.821976,17.9783333 276.852643,17.4723333 C276.88331,16.9663333 276.875643,16.491 276.829643,16.0463333 C276.783643,15.6016667 276.668643,15.3486667 276.484643,15.2873333 C276.116643,15.0726667 275.671976,15.0036667 275.150643,15.0803333 C274.62931,15.157 274.061976,15.456 273.448643,15.9773333 C272.497976,16.7746667 271.669976,17.7636667 270.964643,18.9443333 C270.25931,20.125 269.56931,21.4666667 268.894643,22.9693333 C268.434643,24.0733333 268.334976,24.955 268.595643,25.6143333 C268.85631,26.2736667 269.423643,26.5036667 270.297643,26.3043333 C271.171643,26.105 272.267976,25.3 273.586643,23.8893333 Z" id="o"></path> | |
| <path d="M295.666643,28.3973333 C295.51331,28.704 295.290976,28.796 294.999643,28.6733333 C294.70831,28.5506667 294.470643,28.428 294.286643,28.3053333 C294.071976,28.3053333 293.887976,28.244 293.734643,28.1213333 C293.58131,27.9986667 293.473976,27.8146667 293.412643,27.5693333 C293.35131,27.3853333 293.335976,27.163 293.366643,26.9023333 C293.39731,26.6416667 293.46631,26.335 293.573643,25.9823333 C293.680976,25.6296667 293.795976,25.2386667 293.918643,24.8093333 C294.163976,23.7973333 294.332643,23.0613333 294.424643,22.6013333 C294.516643,22.1413333 294.608643,21.7426667 294.700643,21.4053333 C294.792643,21.068 294.91531,20.5773333 295.068643,19.9333333 C295.313976,19.32 295.51331,18.722 295.666643,18.1393333 C295.819976,17.5566667 296.049976,16.974 296.356643,16.3913333 C296.57131,15.594 296.839643,14.835 297.161643,14.1143333 C297.483643,13.3936667 297.797976,12.788 298.104643,12.2973333 C298.165976,12.2053333 298.280976,12.0826667 298.449643,11.9293333 C298.61831,11.776 298.763976,11.6993333 298.886643,11.6993333 C299.131976,11.454 299.35431,11.3543333 299.553643,11.4003333 C299.752976,11.4463333 300.005976,11.592 300.312643,11.8373333 C300.680643,12.236 300.82631,12.696 300.749643,13.2173333 C300.672976,13.7386667 300.29731,14.5053333 299.622643,15.5173333 C299.254643,16.468 298.91731,17.2883333 298.610643,17.9783333 C298.303976,18.6683333 298.08931,19.32 297.966643,19.9333333 C298.303976,19.4426667 298.679643,18.9903333 299.093643,18.5763333 C299.507643,18.1623333 299.852643,17.8173333 300.128643,17.5413333 C300.80331,16.8666667 301.362976,16.376 301.807643,16.0693333 C302.25231,15.7626667 302.78131,15.41 303.394643,15.0113333 C303.762643,14.766 304.11531,14.5436667 304.452643,14.3443333 C304.789976,14.145 305.165643,13.9993333 305.579643,13.9073333 C305.993643,13.8153333 306.445976,13.8153333 306.936643,13.9073333 C307.24331,13.8766667 307.49631,13.9686667 307.695643,14.1833333 C307.894976,14.398 308.055976,14.6893333 308.178643,15.0573333 C308.30131,15.4253333 308.377976,15.8546667 308.408643,16.3453333 C307.70331,16.192 307.074643,16.215 306.522643,16.4143333 C305.970643,16.6136667 305.502976,16.8513333 305.119643,17.1273333 C304.73631,17.4033333 304.43731,17.618 304.222643,17.7713333 C303.762643,18.078 303.179976,18.4843333 302.474643,18.9903333 C301.76931,19.4963333 301.063976,20.102 300.358643,20.8073333 C299.806643,21.4206667 299.338976,21.942 298.955643,22.3713333 C298.57231,22.8006667 298.265643,23.184 298.035643,23.5213333 C297.805643,23.8586667 297.62931,24.2113333 297.506643,24.5793333 C297.199976,25.2846667 296.877976,26.0513333 296.540643,26.8793333 C296.20331,27.7073333 295.911976,28.2133333 295.666643,28.3973333 Z" id="r"></path> | |
| <path d="M320.736643,29.3633333 C320.521976,29.486 320.23831,29.44 319.885643,29.2253333 C319.532976,29.0106667 319.187976,28.6886667 318.850643,28.2593333 C318.635976,27.8913333 318.49031,27.4926667 318.413643,27.0633333 C318.336976,26.634 318.298643,26.036 318.298643,25.2693333 C318.32931,24.656 318.30631,24.2573333 318.229643,24.0733333 C318.152976,23.8893333 317.976643,23.9123333 317.700643,24.1423333 C317.424643,24.3723333 316.94931,24.8246667 316.274643,25.4993333 C315.507976,26.266 314.779643,26.864 314.089643,27.2933333 C313.399643,27.7226667 312.839976,27.922 312.410643,27.8913333 C312.195976,27.8913333 311.95831,27.7763333 311.697643,27.5463333 C311.436976,27.3163333 311.19931,27.025 310.984643,26.6723333 C310.769976,26.3196667 310.585976,25.9593333 310.432643,25.5913333 C310.248643,24.9166667 310.225643,24.0503333 310.363643,22.9923333 C310.501643,21.9343333 310.73931,20.8226667 311.076643,19.6573333 C311.413976,18.492 311.804976,17.388 312.249643,16.3453333 C312.69431,15.3026667 313.15431,14.4593333 313.629643,13.8153333 C314.104976,13.1713333 314.526643,12.8493333 314.894643,12.8493333 C315.139976,12.8493333 315.36231,12.972 315.561643,13.2173333 C315.760976,13.4626667 315.967976,13.846 316.182643,14.3673333 C316.30531,14.582 316.358976,14.766 316.343643,14.9193333 C316.32831,15.0726667 316.197976,15.2566667 315.952643,15.4713333 C315.676643,15.8393333 315.36231,16.3913333 315.009643,17.1273333 C314.656976,17.8633333 314.319643,18.6606667 313.997643,19.5193333 C313.675643,20.378 313.391976,21.206 313.146643,22.0033333 C312.90131,22.8006667 312.732643,23.4523333 312.640643,23.9583333 C312.548643,24.4643333 312.563976,24.7173333 312.686643,24.7173333 C313.115976,24.7173333 313.629643,24.541 314.227643,24.1883333 C314.825643,23.8356667 315.400643,23.3986667 315.952643,22.8773333 C316.596643,22.2333333 317.171643,21.528 317.677643,20.7613333 C318.183643,19.9946667 318.69731,19.182 319.218643,18.3233333 C319.61731,17.71 320.038976,17.0353333 320.483643,16.2993333 C320.92831,15.5633333 321.211976,15.042 321.334643,14.7353333 C321.763976,13.938 322.085976,13.3936667 322.300643,13.1023333 C322.51531,12.811 322.775976,12.6193333 323.082643,12.5273333 C323.235976,12.5273333 323.381643,12.5273333 323.519643,12.5273333 C323.657643,12.5273333 323.726643,12.5273333 323.726643,12.5273333 C323.910643,12.558 324.12531,12.696 324.370643,12.9413333 C324.615976,13.064 324.753976,13.179 324.784643,13.2863333 C324.81531,13.3936667 324.830643,13.524 324.830643,13.6773333 C324.707976,13.984 324.51631,14.4363333 324.255643,15.0343333 C323.994976,15.6323333 323.80331,16.0693333 323.680643,16.3453333 C323.097976,17.664 322.522976,18.9596667 321.955643,20.2323333 C321.38831,21.505 320.981976,22.8006667 320.736643,24.1193333 C320.67531,24.5486667 320.667643,25.047 320.713643,25.6143333 C320.759643,26.1816667 320.843976,26.588 320.966643,26.8333333 C321.058643,27.0173333 321.173643,27.2243333 321.311643,27.4543333 C321.449643,27.6843333 321.610643,27.876 321.794643,28.0293333 C322.070643,28.2133333 322.12431,28.4126667 321.955643,28.6273333 C321.786976,28.842 321.564643,29.0183333 321.288643,29.1563333 C321.012643,29.2943333 320.828643,29.3633333 320.736643,29.3633333 Z" id="u"></path> | |
| <path d="M343.230643,27.3393333 C342.61731,27.3393333 342.11131,27.209 341.712643,26.9483333 C341.313976,26.6876667 340.976643,26.2506667 340.700643,25.6373333 C340.577976,25.208 340.47831,24.725 340.401643,24.1883333 C340.324976,23.6516667 340.286643,23.1456667 340.286643,22.6703333 C340.286643,22.195 340.332643,21.8806667 340.424643,21.7273333 C340.54731,21.6046667 340.600976,21.3823333 340.585643,21.0603333 C340.57031,20.7383333 340.562643,20.3933333 340.562643,20.0253333 C340.531976,19.412 340.38631,19.067 340.125643,18.9903333 C339.864976,18.9136667 339.48931,19.0133333 338.998643,19.2893333 C338.446643,19.6266667 337.725976,20.079 336.836643,20.6463333 C335.94731,21.2136667 335.019643,21.8346667 334.053643,22.5093333 C333.087643,23.184 332.17531,23.8893333 331.316643,24.6253333 C330.641976,25.3613333 330.235643,25.921 330.097643,26.3043333 C329.959643,26.6876667 329.767976,26.8793333 329.522643,26.8793333 C329.27731,27.002 329.07031,27.0096667 328.901643,26.9023333 C328.732976,26.795 328.49531,26.6186667 328.188643,26.3733333 C327.973976,26.128 327.75931,25.8903333 327.544643,25.6603333 C327.329976,25.4303333 327.191976,25.254 327.130643,25.1313333 C327.130643,24.978 327.176643,24.656 327.268643,24.1653333 C327.360643,23.6746667 327.475643,23.184 327.613643,22.6933333 C327.751643,22.2026667 327.85131,21.8806667 327.912643,21.7273333 C328.065976,21.7273333 328.19631,21.574 328.303643,21.2673333 C328.410976,20.9606667 328.58731,20.6233333 328.832643,20.2553333 C328.893976,19.8873333 329.054976,19.389 329.315643,18.7603333 C329.57631,18.1316667 329.813976,17.572 330.028643,17.0813333 C330.457976,16.3453333 330.756976,15.732 330.925643,15.2413333 C331.09431,14.7506667 331.20931,14.1373333 331.270643,13.4013333 C331.239976,13.2786667 331.270643,13.1636667 331.362643,13.0563333 C331.454643,12.949 331.561976,12.8953333 331.684643,12.8953333 L331.684643,12.8953333 L331.684643,12.8953333 C331.929976,12.65 332.22131,12.581 332.558643,12.6883333 C332.895976,12.7956667 333.202643,13.0333333 333.478643,13.4013333 C334.030643,14.1373333 334.252976,14.8963333 334.145643,15.6783333 C334.03831,16.4603333 333.539976,17.572 332.650643,19.0133333 C332.435976,19.504 332.274976,19.8796667 332.167643,20.1403333 C332.06031,20.401 332.006643,20.608 332.006643,20.7613333 C332.006643,20.7613333 332.167643,20.654 332.489643,20.4393333 C332.811643,20.2246667 333.179643,19.9716667 333.593643,19.6803333 C334.007643,19.389 334.33731,19.1666667 334.582643,19.0133333 C334.735976,18.86 335.088643,18.584 335.640643,18.1853333 C336.192643,17.7866667 336.782976,17.3956667 337.411643,17.0123333 C338.04031,16.629 338.507976,16.4066667 338.814643,16.3453333 C339.059976,16.2226667 339.320643,16.1076667 339.596643,16.0003333 C339.872643,15.893 340.071976,15.8393333 340.194643,15.8393333 C340.439976,15.8393333 340.75431,15.9696667 341.137643,16.2303333 C341.520976,16.491 341.88131,16.7976667 342.218643,17.1503333 C342.555976,17.503 342.75531,17.802 342.816643,18.0473333 C342.816643,18.17 342.82431,18.2926667 342.839643,18.4153333 C342.854976,18.538 342.877976,18.6606667 342.908643,18.7833333 C343.03131,19.182 343.10031,19.7186667 343.115643,20.3933333 C343.130976,21.068 343.107976,21.6813333 343.046643,22.2333333 C342.98531,22.7853333 342.877976,23.1073333 342.724643,23.1993333 C342.724643,23.1993333 342.73231,23.2376667 342.747643,23.3143333 C342.762976,23.391 342.831976,23.4293333 342.954643,23.4293333 C342.954643,23.552 342.954643,23.621 342.954643,23.6363333 C342.954643,23.6516667 342.954643,23.6593333 342.954643,23.6593333 C342.80131,23.6593333 342.739976,23.7896667 342.770643,24.0503333 C342.80131,24.311 342.900976,24.5946667 343.069643,24.9013333 C343.23831,25.208 343.414643,25.4533333 343.598643,25.6373333 C343.966643,26.0053333 344.119976,26.3503333 344.058643,26.6723333 C343.99731,26.9943333 343.72131,27.2166667 343.230643,27.3393333 Z" id="n"></path> | |
| </g> | |
| </g> | |
| </g> | |
| </svg> | |
| `; | |
| container.appendChild(annotation); | |
| } | |
| // ============ CONFIGURATION ============ | |
| // Visualization mode: 'normalize' | 'align' | 'raw' | |
| // | |
| // 'normalize' (CURRENT) ✅ | |
| // → Each run starts at X=0 (relative to its own start) | |
| // → Runs have different lengths (based on their training duration) | |
| // → No data removed | |
| // → Ideal for comparing curve shapes | |
| // | |
| // 'align' | |
| // → All runs start at the same absolute point (latest start) | |
| // → All runs end at the same absolute point (earliest end) | |
| // → Same length for all runs (trimmed) | |
| // → Data trimmed for alignment | |
| // → Ideal for comparing over a common time window | |
| // | |
| // 'raw' | |
| // → Displays raw data without transformation | |
| // → Each run keeps its original start and end points | |
| // → No normalization | |
| // → Ideal for seeing real training timelines | |
| // | |
| const VISUALIZATION_MODE = 'align'; | |
| // Log scale control: true = logarithmic, false = linear | |
| const USE_LOG_SCALE = true; | |
| // Gap between run groups: 0.2 = doubled gap, 0.1 = normal gap | |
| const CATEGORY_GAP = 0.05; | |
| // ======================================= | |
| // State/data | |
| const svgPaddingTop = 20; | |
| const svgPaddingBottom = 20; | |
| // Get initial height from container instead of fixed value | |
| const getContainerHeight = () => { | |
| const containerHeight = container.clientHeight || 350; | |
| return Math.max(containerHeight - 20, 200); // Minimum 200px | |
| }; | |
| let svgHeight = getContainerHeight(); | |
| let contentHeight = svgHeight - svgPaddingTop - svgPaddingBottom; | |
| let width = 800, height = svgHeight; const margin = { top: 0, right: 0, bottom: 0, left: 0 }; | |
| // SVG container | |
| const svg = d3.select(container).append('svg').attr('width', 800).attr('height', svgHeight).style('display', 'block'); | |
| const gRoot = svg.append('g').attr('transform', `translate(0, ${svgPaddingTop})`); | |
| const gGrid = gRoot.append('g').attr('class', 'grid'); | |
| const gAxes = gRoot.append('g').attr('class', 'axes'); | |
| const gLines = gRoot.append('g').attr('class', 'lines'); | |
| const gPoints = gRoot.append('g').attr('class', 'points'); | |
| const overlay = gRoot.append('rect').attr('fill', 'transparent').style('cursor', 'crosshair'); | |
| const hoverLine = gRoot.append('line').attr('stroke-width', 1).style('display', 'none'); | |
| const xScale = USE_LOG_SCALE ? d3.scaleLinear() : d3.scaleLinear(); | |
| const yScale = USE_LOG_SCALE ? d3.scaleLinear() : d3.scaleLinear(); | |
| const lineGen = d3.line().x(d => xScale(d.logTokens)).y(d => yScale(d.logLoss)); | |
| const dataByRun = new Map(); | |
| let runOrder = []; | |
| // Colors - categorical for distinct run categories | |
| function getRunColors(count) { | |
| try { | |
| if (window.ColorPalettes && typeof window.ColorPalettes.getColors === 'function') { | |
| return window.ColorPalettes.getColors('categorical', count); | |
| } | |
| } catch (_) { } | |
| // Fallback to categorical-like colors - evenly distributed hues | |
| const colors = []; | |
| for (let i = 0; i < count; i++) { | |
| const hue = (i * 360 / count) % 360; | |
| colors.push(`hsl(${hue}, 70%, 60%)`); | |
| } | |
| return colors; | |
| } | |
| // Format helper for thousands (5000 -> 5k, 1500 -> 1.5k) | |
| function formatK(v) { | |
| const abs = Math.abs(v); | |
| if (abs >= 1000) { | |
| const n = v / 1000; | |
| const s = d3.format('.1f')(n); | |
| return (s.endsWith('.0') ? s.slice(0, -2) : s) + 'k'; | |
| } | |
| return d3.format('d')(v); | |
| } | |
| // Format numbers with K/M/B suffixes | |
| function formatNumber(num) { | |
| if (num >= 1e9) return (num / 1e9).toFixed(1) + 'B'; | |
| if (num >= 1e6) return (num / 1e6).toFixed(1) + 'M'; | |
| if (num >= 1e3) return (num / 1e3).toFixed(1) + 'K'; | |
| return num.toFixed(0); | |
| } | |
| // Parse run name to extract type and config | |
| function parseRunName(runName) { | |
| // Format: "category_loss+date_time_config" | |
| const parts = runName.split('+'); | |
| const category = parts[0] || ''; | |
| const configPart = parts[1] || ''; | |
| // Extract readable category name | |
| const categoryName = category.replace(/_loss$/i, '').replace(/_/g, ' ') | |
| .replace(/\b\w/g, l => l.toUpperCase()); | |
| // Remove date/time part (format: DD/MM/YYYY_HH:MM:SS_) | |
| // This will match patterns like "22/09/2025_16:41:43_" | |
| let config = configPart.replace(/^\d{2}\/\d{2}\/\d{4}_\d{2}:\d{2}:\d{2}_/, ''); | |
| // Check if it was baseline before removing it | |
| const wasBaseline = /^baseline$/i.test(config) || /^baseline[-_]/i.test(config) || /[-_]baseline$/i.test(config); | |
| // Remove "baseline" (case insensitive) | |
| config = config.replace(/^baseline$/i, '').replace(/^baseline[-_]/i, '').replace(/[-_]baseline$/i, ''); | |
| // Clean up and format if something remains | |
| if (config) { | |
| config = config.replace(/[_-]+/g, ' ').trim() | |
| .replace(/\b\w/g, l => l.toUpperCase()); | |
| } else if (wasBaseline) { | |
| // If nothing remains but it was baseline, show "Baseline" | |
| config = 'Baseline'; | |
| } | |
| return { categoryName, config }; | |
| } | |
| // Helper function to check if a run is a true baseline (nothing after "baseline") | |
| function isBaselineRun(runName) { | |
| const parts = runName.split('+'); | |
| if (parts.length < 2) return false; | |
| const configPart = parts[1] || ''; | |
| // Remove date/time part first (format: DD/MM/YYYY_HH:MM:SS_) | |
| let config = configPart.replace(/^\d{2}\/\d{2}\/\d{4}_\d{2}:\d{2}:\d{2}_/, ''); | |
| // Check if it's exactly "baseline" (case insensitive) with nothing after | |
| return /^baseline$/i.test(config); | |
| } | |
| // Helper function to map run labels to prettier names | |
| function mapRunLabel(label) { | |
| const labelMappings = { | |
| 'Z': 'Z-loss', | |
| 'Doc-Masking': 'IntraDoc Masking', | |
| 'Doc Masking': 'IntraDoc Masking', | |
| 'Doc_Masking': 'IntraDoc Masking', | |
| 'Lr': 'Learning Rate', | |
| 'No-Wd': 'No Weight Decay', | |
| 'No Wd': 'No Weight Decay', | |
| 'No_Wd': 'No Weight Decay', | |
| 'Tied-Embeddings': 'Tied Embeddings', | |
| 'Tied Embeddings': 'Tied Embeddings', | |
| 'Tied_Embeddings': 'Tied Embeddings', | |
| 'Batch Size Fix': 'Batch Size', | |
| 'Batch_Size_Fix': 'Batch Size' | |
| }; | |
| return labelMappings[label] || label; | |
| } | |
| // Helper function to saturate a color slightly | |
| function saturateColor(color) { | |
| // Handle different color formats | |
| if (color.startsWith('hsl(')) { | |
| // HSL color - boost saturation slightly and reduce lightness a bit | |
| const match = color.match(/hsl\((\d+),\s*(\d+)%,\s*(\d+)%\)/); | |
| if (match) { | |
| const h = parseInt(match[1]); | |
| const s = Math.min(100, parseInt(match[2]) + 25); // +10% saturation | |
| const l = Math.max(0, parseInt(match[3])); // -5% lightness | |
| return `hsl(${h}, ${s}%, ${l}%)`; | |
| } | |
| } else if (color.startsWith('#')) { | |
| // Convert hex to RGB then to HSL | |
| const hex = color.replace('#', ''); | |
| const r = parseInt(hex.substr(0, 2), 16) / 255; | |
| const g = parseInt(hex.substr(2, 2), 16) / 255; | |
| const b = parseInt(hex.substr(4, 2), 16) / 255; | |
| const max = Math.max(r, g, b); | |
| const min = Math.min(r, g, b); | |
| let h, s, l = (max + min) / 2; | |
| if (max === min) { | |
| h = s = 0; | |
| } else { | |
| const d = max - min; | |
| s = l > 0.5 ? d / (2 - max - min) : d / (max + min); | |
| switch (max) { | |
| case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break; | |
| case g: h = ((b - r) / d + 2) / 6; break; | |
| case b: h = ((r - g) / d + 4) / 6; break; | |
| } | |
| } | |
| h = Math.round(h * 360); | |
| s = Math.min(100, Math.round(s * 100) + 10); | |
| l = Math.max(0, Math.round(l * 100) - 5); | |
| return `hsl(${h}, ${s}%, ${l}%)`; | |
| } | |
| // Fallback: return original color | |
| return color; | |
| } | |
| // Single aggregated CSV file | |
| const AGGREGATED_CSV = 'aggregated-loss-data.csv'; | |
| const fetchFirstAvailable = async (paths) => { | |
| for (const p of paths) { | |
| try { | |
| // Add timestamp to bypass cache | |
| const url = p + (p.includes('?') ? '&' : '?') + '_=' + Date.now(); | |
| const r = await fetch(url, { cache: 'no-cache' }); | |
| if (r.ok) return await r.text(); | |
| } catch (_) { } | |
| } | |
| throw new Error('CSV not found'); | |
| }; | |
| // ============ DATA TRANSFORMATION MODES ============ | |
| /** | |
| * Transform data according to the selected visualization mode | |
| * @param {Map} dataByRun - Map(run_name -> array of {tokens, loss, logTokens, logLoss}) | |
| * @param {string} mode - 'normalize' | 'align' | 'raw' | |
| * @returns {Map} Transformed data | |
| */ | |
| function transformDataByMode(dataByRun, mode) { | |
| const runs = Array.from(dataByRun.keys()); | |
| const transformedData = new Map(); | |
| if (mode === 'normalize') { | |
| // NORMALIZE MODE: Each run starts at X=0 (relative to its start) | |
| runs.forEach(r => { | |
| const data = dataByRun.get(r) || []; | |
| if (data.length > 0) { | |
| const firstLogTokens = Math.min(...data.map(d => d.logTokens)); | |
| const normalizedData = data.map(d => ({ | |
| ...d, | |
| logTokens: d.logTokens - firstLogTokens | |
| })); | |
| transformedData.set(r, normalizedData); | |
| } | |
| }); | |
| } else if (mode === 'align') { | |
| // ALIGN MODE: Improved alignment strategy | |
| // 1. Collect all start and end points | |
| const runRanges = []; | |
| runs.forEach(r => { | |
| const data = dataByRun.get(r) || []; | |
| if (data.length > 0) { | |
| const minTokens = Math.min(...data.map(d => d.logTokens)); | |
| const maxTokens = Math.max(...data.map(d => d.logTokens)); | |
| runRanges.push({ run: r, min: minTokens, max: maxTokens, data }); | |
| } | |
| }); | |
| if (runRanges.length === 0) return transformedData; | |
| // 2. Use percentile-based alignment (70th percentile start, 30th percentile end) | |
| // This gives a better balance than strict min/max | |
| const starts = runRanges.map(r => r.min).sort((a, b) => a - b); | |
| const ends = runRanges.map(r => r.max).sort((a, b) => a - b); | |
| const startPercentile = Math.floor(starts.length * 0.3); // Use 30th percentile as start | |
| const endPercentile = Math.floor(ends.length * 0.8); // Use 80th percentile as end | |
| const alignedStart = starts[Math.max(0, startPercentile)]; | |
| const alignedEnd = ends[Math.min(ends.length - 1, endPercentile)]; | |
| // 3. Filter and align data | |
| runs.forEach(r => { | |
| const data = dataByRun.get(r) || []; | |
| if (data.length > 0) { | |
| // Filter to alignment window but be more permissive | |
| const filtered = data.filter(d => | |
| d.logTokens >= alignedStart && d.logTokens <= alignedEnd | |
| ); | |
| // If we have very little data after filtering, be more lenient | |
| let finalData = filtered; | |
| if (filtered.length < 3) { | |
| // Fallback: use data that intersects with the alignment window | |
| finalData = data.filter(d => d.logTokens >= alignedStart); | |
| // Take at least 80% of the run's original length or minimum viable amount | |
| if (finalData.length < Math.max(3, data.length * 0.8)) { | |
| finalData = data; // If still too restrictive, use all data | |
| } | |
| // But still normalize to the alignment start | |
| } | |
| if (finalData.length > 0) { | |
| const alignedData = finalData.map(d => ({ | |
| ...d, | |
| logTokens: d.logTokens - alignedStart | |
| })); | |
| transformedData.set(r, alignedData); | |
| } | |
| } | |
| }); | |
| } else { | |
| // RAW MODE: Raw data without transformation | |
| runs.forEach(r => { | |
| const data = dataByRun.get(r) || []; | |
| if (data.length > 0) { | |
| transformedData.set(r, [...data]); // Deep copy | |
| } | |
| }); | |
| } | |
| return transformedData; | |
| } | |
| // ================================================== | |
| function updateLayout() { | |
| const axisColor = getComputedStyle(container).getPropertyValue('--axis-color').trim() || 'rgba(0,0,0,0.25)'; | |
| width = container.clientWidth || 800; | |
| // Update height based on current container size | |
| svgHeight = getContainerHeight(); | |
| contentHeight = svgHeight - svgPaddingTop - svgPaddingBottom; | |
| height = svgHeight; | |
| svg.attr('width', width).attr('height', height); | |
| gRoot.attr('transform', `translate(0, ${svgPaddingTop})`); | |
| const innerWidth = width - margin.left - margin.right; | |
| const innerHeight = contentHeight; | |
| overlay.attr('x', 0).attr('y', 0).attr('width', innerWidth).attr('height', innerHeight); | |
| hoverLine.attr('y1', 0).attr('y2', innerHeight).attr('stroke', axisColor); | |
| return { innerWidth, innerHeight }; | |
| } | |
| function render() { | |
| const { innerWidth, innerHeight } = updateLayout(); | |
| // Transform data according to selected mode | |
| const transformedData = transformDataByMode(dataByRun, VISUALIZATION_MODE); | |
| const allRuns = Array.from(transformedData.keys()).sort(); | |
| // Filter out debug runs and the original "Batch Size" (keep only "Batch Size Fix") | |
| const runs = allRuns.filter(run => { | |
| const debugFilter = !run.toLowerCase().includes('debug') && | |
| !run.toLowerCase().includes('tp debug') && | |
| !run.toLowerCase().includes('tp-debug') && | |
| !run.toLowerCase().includes('test'); | |
| // Filter out "batch_size_loss" but keep "batch_size_fix_loss" | |
| const batchSizeFilter = !(run.toLowerCase().includes('batch_size_loss') && | |
| !run.toLowerCase().includes('batch_size_fix')); | |
| return debugFilter && batchSizeFilter; | |
| }); | |
| // Compute domains from transformed data | |
| let minLogTokens = Infinity, maxLogTokens = -Infinity; | |
| let minLogLoss = Infinity, maxLogLoss = -Infinity; | |
| runs.forEach(r => { | |
| const data = transformedData.get(r) || []; | |
| data.forEach(d => { | |
| minLogTokens = Math.min(minLogTokens, d.logTokens); | |
| maxLogTokens = Math.max(maxLogTokens, d.logTokens); | |
| minLogLoss = Math.min(minLogLoss, d.logLoss); | |
| maxLogLoss = Math.max(maxLogLoss, d.logLoss); | |
| }); | |
| }); | |
| // No grid or axes - clean visualization | |
| gGrid.selectAll('*').remove(); | |
| gAxes.selectAll('*').remove(); | |
| // Lines with vertical offset - optimized | |
| // Group runs by category (prefix before '+') | |
| const categoryMap = new Map(); | |
| const categories = []; | |
| runs.forEach(r => { | |
| const parts = r.split('+'); | |
| const category = parts.length > 1 ? parts[0] : r; | |
| if (!categoryMap.has(category)) { | |
| categories.push(category); | |
| categoryMap.set(category, []); | |
| } | |
| categoryMap.get(category).push(r); | |
| }); | |
| // Generate one color per category | |
| const categoryColors = getRunColors(categories.length); | |
| const runColorMap = {}; | |
| categories.forEach((cat, idx) => { | |
| const color = categoryColors[idx]; | |
| categoryMap.get(cat).forEach(run => { | |
| runColorMap[run] = color; | |
| }); | |
| }); | |
| // Split categories into two rows (5 on top, 6 on bottom for 11 items) | |
| const midPoint = Math.floor(categories.length / 2); | |
| const firstRow = categories.slice(0, midPoint); | |
| const secondRow = categories.slice(midPoint); | |
| const createRow = (cats, startIdx) => cats.map((cat, i) => { | |
| const idx = startIdx + i; | |
| let prettyLabel = cat.replace(/_/g, ' ').replace(/loss/g, '').trim() | |
| .replace(/\b\w/g, l => l.toUpperCase()); | |
| // Apply label mapping | |
| prettyLabel = mapRunLabel(prettyLabel); | |
| return ` | |
| <div class="legend-item" data-category="${cat}"> | |
| <div class="legend-swatch" style="background: ${categoryColors[idx]}"></div> | |
| <div class="legend-label">${prettyLabel}</div> | |
| </div> | |
| `; | |
| }).join(''); | |
| // Update legend with two rows | |
| legend.innerHTML = ` | |
| <div class="legend-title">Run Types</div> | |
| <div class="legend-items"> | |
| <div class="legend-row">${createRow(firstRow, 0)}</div> | |
| <div class="legend-row">${createRow(secondRow, midPoint)}</div> | |
| </div> | |
| `; | |
| // Legend interaction - highlight category on hover | |
| legend.querySelectorAll('.legend-item').forEach(item => { | |
| const cat = item.getAttribute('data-category'); | |
| item.addEventListener('mouseenter', () => { | |
| container.classList.add('hovering'); | |
| // Ghost lines (both dashed and solid) | |
| gLines.selectAll('path.run').classed('ghost', function (d) { | |
| const parts = d.run.split('+'); | |
| const runCat = parts.length > 1 ? parts[0] : d.run; | |
| return runCat !== cat; | |
| }); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', function (d) { | |
| const parts = d.run.split('+'); | |
| const runCat = parts.length > 1 ? parts[0] : d.run; | |
| return runCat !== cat; | |
| }); | |
| // Ghost legend items | |
| legend.querySelectorAll('.legend-item').forEach(otherItem => { | |
| if (otherItem.getAttribute('data-category') !== cat) { | |
| otherItem.classList.add('ghost'); | |
| } | |
| }); | |
| }); | |
| item.addEventListener('mouseleave', () => { | |
| container.classList.remove('hovering'); | |
| gLines.selectAll('path.run').classed('ghost', false); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', false); | |
| legend.querySelectorAll('.legend-item').forEach(otherItem => { | |
| otherItem.classList.remove('ghost'); | |
| }); | |
| }); | |
| }); | |
| // Create vertical offset mapping with doubled gaps between categories | |
| const createVerticalOffsetMap = () => { | |
| const runToOffset = new Map(); | |
| let runIndex = 0; | |
| categories.forEach((category, catIndex) => { | |
| const categoryRuns = categoryMap.get(category); | |
| categoryRuns.forEach(run => { | |
| // Gap between categories + normal run spacing (runIndex * 0.05) | |
| const verticalOffset = (catIndex * CATEGORY_GAP) + (runIndex * 0.05); | |
| runToOffset.set(run, verticalOffset); | |
| runIndex++; | |
| }); | |
| }); | |
| return runToOffset; | |
| }; | |
| const verticalOffsetMap = createVerticalOffsetMap(); | |
| // Calculate max vertical offset for padding | |
| let maxVerticalOffset = 0; | |
| for (const offset of verticalOffsetMap.values()) { | |
| maxVerticalOffset = Math.max(maxVerticalOffset, offset); | |
| } | |
| maxLogLoss += maxVerticalOffset; | |
| // Update scales with final domain | |
| xScale.domain([minLogTokens, maxLogTokens]).range([0, innerWidth]); | |
| yScale.domain([minLogLoss, maxLogLoss]).range([innerHeight, 0]); | |
| const series = runs.map((r) => { | |
| const data = transformedData.get(r) || []; | |
| // Sample data for performance - take every 5th point | |
| const sampledData = data.filter((_, idx) => idx % 5 === 0); | |
| return { | |
| run: r, | |
| color: runColorMap[r], | |
| values: sampledData.sort((a, b) => a.logTokens - b.logTokens).map(d => ({ | |
| ...d, | |
| logLoss: d.logLoss + verticalOffsetMap.get(r) // Vertical offset with doubled category gaps | |
| })) | |
| }; | |
| }); | |
| // First, add solid lines under dashed baseline lines (background) | |
| const baselineSeries = series.filter(s => isBaselineRun(s.run)); | |
| if (baselineSeries.length > 0) { | |
| const solidPaths = gLines.selectAll('path.baseline-solid').data(baselineSeries, d => `solid-${d.run}`); | |
| const solidPathsEnter = solidPaths.enter().append('path') | |
| .attr('class', 'baseline-solid') | |
| .attr('fill', 'none') | |
| .attr('stroke-width', 3) | |
| .attr('stroke', d => d.color) | |
| .attr('stroke-dasharray', null) | |
| .attr('d', d => lineGen(d.values)); | |
| solidPathsEnter.merge(solidPaths) | |
| .attr('stroke', d => d.color) | |
| .attr('d', d => lineGen(d.values)); | |
| solidPaths.exit().remove(); | |
| } | |
| // Then, add all lines (saturated baselines will be on top) | |
| const paths = gLines.selectAll('path.run').data(series, d => d.run); | |
| const pathsEnter = paths.enter().append('path') | |
| .attr('class', 'run') | |
| .attr('fill', 'none') | |
| .attr('stroke-width', 2) | |
| .attr('stroke', d => isBaselineRun(d.run) ? saturateColor(d.color) : d.color) | |
| .attr('stroke-dasharray', null) | |
| .attr('d', d => lineGen(d.values)); | |
| pathsEnter.merge(paths) | |
| .attr('stroke', d => isBaselineRun(d.run) ? saturateColor(d.color) : d.color) | |
| .attr('stroke-dasharray', null) | |
| .attr('d', d => lineGen(d.values)); // No transition for performance | |
| paths.exit().remove(); | |
| // Hover capture paths (wider invisible stroke for easy hovering) - optimized | |
| const captures = gLines.selectAll('path.run-hover').data(series, d => `cap-${d.run}`); | |
| captures.enter().append('path').attr('class', 'run-hover').attr('fill', 'none').attr('stroke', 'transparent').attr('stroke-width', 12).style('pointer-events', 'stroke') | |
| .attr('d', d => lineGen(d.values)) | |
| .merge(captures) | |
| .attr('d', d => lineGen(d.values)) | |
| .on('mouseenter', function (ev, d) { | |
| container.classList.add('hovering'); | |
| // Ghost non-hovered lines (both dashed and solid) | |
| gLines.selectAll('path.run').classed('ghost', s => s.run !== d.run); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', s => s.run !== d.run); | |
| }) | |
| .on('mouseleave', function () { | |
| container.classList.remove('hovering'); | |
| gLines.selectAll('path.run').classed('ghost', false); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', false); | |
| }); | |
| captures.exit().remove(); | |
| // No point markers - just lines | |
| // No legend needed | |
| // Hover interaction - optimized | |
| function onMove(ev) { | |
| const [mx, my] = d3.pointer(ev, overlay.node()); | |
| // Find nearest point on any line - optimized search | |
| let nearestPoint = null; | |
| let minDist = Infinity; | |
| const threshold = 20; | |
| for (const s of series) { | |
| for (const pt of s.values) { | |
| const dist = Math.abs(xScale(pt.logTokens) - mx); // Only check X distance first | |
| if (dist < threshold && dist < minDist) { | |
| const yDist = Math.abs(yScale(pt.logLoss) - my); | |
| const totalDist = Math.sqrt(dist * dist + yDist * yDist); | |
| if (totalDist < minDist) { | |
| minDist = totalDist; | |
| nearestPoint = { ...pt, run: s.run, color: s.color }; | |
| } | |
| } | |
| } | |
| } | |
| if (nearestPoint && minDist < threshold) { | |
| // Parse run info | |
| const { categoryName, config } = parseRunName(nearestPoint.run); | |
| // Apply label mapping to category name | |
| const mappedCategoryName = mapRunLabel(categoryName); | |
| // Format metrics | |
| const tokensFormatted = formatNumber(nearestPoint.tokens); | |
| const lossFormatted = nearestPoint.loss.toFixed(2); | |
| // Build rich tooltip with color swatch | |
| let html = ` | |
| <div class="d3-tooltip__header"> | |
| <div class="d3-tooltip__color-swatch" style="background: ${nearestPoint.color}"></div> | |
| <div class="d3-tooltip__title">${mappedCategoryName}</div> | |
| </div> | |
| `; | |
| // Only show config if it exists | |
| if (config) { | |
| html += `<div class="d3-tooltip__subtitle">Config: ${config}</div>`; | |
| } | |
| html += ` | |
| <div class="d3-tooltip__divider"></div> | |
| <div class="d3-tooltip__data"> | |
| Tokens: ${tokensFormatted}<br/> | |
| Loss: ${lossFormatted} | |
| </div> | |
| `; | |
| tipInner.innerHTML = html; | |
| tip.style.opacity = '1'; | |
| // Ghost other lines (both dashed and solid) | |
| container.classList.add('hovering'); | |
| gLines.selectAll('path.run').classed('ghost', s => s.run !== nearestPoint.run); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', s => s.run !== nearestPoint.run); | |
| // Smart positioning - keep tooltip within container bounds | |
| const tooltipRect = tip.getBoundingClientRect(); | |
| const containerRect = container.getBoundingClientRect(); | |
| const offset = 12; | |
| let x = mx + margin.left + offset; | |
| let y = my + margin.top + offset; | |
| // Check right edge | |
| if (x + tooltipRect.width > containerRect.width) { | |
| x = mx + margin.left - tooltipRect.width - offset; | |
| } | |
| // Check bottom edge | |
| if (y + tooltipRect.height > containerRect.height) { | |
| y = my + margin.top - tooltipRect.height - offset; | |
| } | |
| // Check left edge (if flipped to left) | |
| if (x < 0) { | |
| x = offset; | |
| } | |
| // Check top edge (if flipped to top) | |
| if (y < 0) { | |
| y = offset; | |
| } | |
| tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`; | |
| } else { | |
| tip.style.opacity = '0'; | |
| container.classList.remove('hovering'); | |
| gLines.selectAll('path.run').classed('ghost', false); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', false); | |
| } | |
| } | |
| function onLeave() { | |
| tip.style.opacity = '0'; | |
| tip.style.transform = 'translate(-9999px, -9999px)'; | |
| container.classList.remove('hovering'); | |
| gLines.selectAll('path.run').classed('ghost', false); | |
| gLines.selectAll('path.baseline-solid').classed('ghost', false); | |
| } | |
| overlay.on('mousemove', onMove).on('mouseleave', onLeave); | |
| } | |
| // Load aggregated CSV file and initialize | |
| (async () => { | |
| try { | |
| // Load single aggregated CSV file | |
| const paths = [ | |
| `/data/${AGGREGATED_CSV}`, | |
| `./assets/data/${AGGREGATED_CSV}`, | |
| `../assets/data/${AGGREGATED_CSV}`, | |
| `../../assets/data/${AGGREGATED_CSV}` | |
| ]; | |
| const text = await fetchFirstAvailable(paths); | |
| // Parse CSV - format is run_name,tokens,loss with prefixes already included | |
| const rows = d3.csvParse(text, d => ({ | |
| run: (d.run_name || '').trim(), | |
| tokens: +d.tokens, | |
| loss: +d.loss | |
| })); | |
| // Filter out invalid data and compute log values | |
| const allData = rows | |
| .filter(r => r.run && r.tokens > 0 && r.loss > 0) // Valid data only | |
| .map(row => ({ | |
| run: row.run, | |
| tokens: row.tokens, | |
| loss: row.loss, | |
| logTokens: USE_LOG_SCALE ? Math.log(row.tokens) : row.tokens, | |
| logLoss: USE_LOG_SCALE ? Math.log(row.loss) : row.loss | |
| })); | |
| // Group data by run | |
| runOrder = Array.from(new Set(allData.map(r => r.run))).sort(); | |
| runOrder.forEach(r => { | |
| dataByRun.set(r, allData.filter(d => d.run === r)); | |
| }); | |
| render(); | |
| const rerender = () => render(); | |
| if (window.ResizeObserver) { const ro = new ResizeObserver(() => rerender()); ro.observe(container); } else { window.addEventListener('resize', rerender); } | |
| } catch (e) { | |
| const pre = document.createElement('pre'); pre.textContent = 'CSV load error: ' + (e && e.message ? e.message : e); | |
| pre.style.color = 'var(--danger, #b00020)'; pre.style.fontSize = '12px'; pre.style.whiteSpace = 'pre-wrap'; container.appendChild(pre); | |
| } | |
| })(); | |
| }; | |
| if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => ensureD3(bootstrap), { once: true }); } else { ensureD3(bootstrap); } | |
| })(); | |
| </script> |