1"use strict";tb.onRootElementReady(g=>{g.querySelectorAll("[data-tb-blog-filter]").forEach(r=>{const a=r.closest(".tb-block");if(!a)return;const n=r.querySelectorAll("[data-tb-blog-filter-value]"),b=a.querySelectorAll("[data-tb-blog-categories]"),i=a.querySelector("[data-tb-blog-filter-empty]"),h=new Set(Array.from(n).map(e=>e.dataset.tbBlogFilterValue||"").filter(Boolean)),s=e=>{let t=0;b.forEach(o=>{const l=(o.dataset.tbBlogCategories||"").split(" ").filter(Boolean),d=!e||l.includes(e);o.hidden=!d,d&&t++}),n.forEach(o=>{const l=(o.dataset.tbBlogFilterValue||"")===e;o.classList.toggle("is-active",l),o.setAttribute("aria-pressed",l?"true":"false")}),i&&(i.hidden=t>0)},c=()=>{const e=decodeURIComponent(window.location.hash.replace(/^#/,""));return h.has(e)?e:""};n.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.tbBlogFilterValue||"";window.history.replaceState(null,"",t?`#${encodeURIComponent(t)}`:window.location.pathname),s(t)})}),window.addEventListener("hashchange",()=>s(c())),s(c())})});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.