1var e=Uint8Array,t=Uint16Array,n=Int32Array,r=new e([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new e([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new e([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),o=function(e,r){for(var i=new t(31),a=0;a<31;++a)i[a]=r+=1<<e[a-1];for(var o=new n(i[30]),a=1;a<30;++a)for(var s=i[a];s<i[a+1];++s)o[s]=s-i[a]<<5|a;return{b:i,r:o}},s=o(r,2),c=s.b,l=s.r;c[28]=258,l[258]=28;var u=o(i,0),d=u.b;u.r;for(var f=new t(32768),p=0;p<32768;++p){var m=(p&43690)>>1|(p&21845)<<1;m=(m&52428)>>2|(m&13107)<<2,m=(m&61680)>>4|(m&3855)<<4,f[p]=((m&65280)>>8|(m&255)<<8)>>1}for(var h=(function(e,n,r){for(var i=e.length,a=0,o=new t(n);a<i;++a)e[a]&&++o[e[a]-1];var s=new t(n);for(a=1;a<n;++a)s[a]=s[a-1]+o[a-1]<<1;var c;if(r){c=new t(1<<n);var l=15-n;for(a=0;a<i;++a)if(e[a])for(var u=a<<4|e[a],d=n-e[a],p=s[e[a]-1]++<<d,m=p|(1<<d)-1;p<=m;++p)c[f[p]>>l]=u}else for(c=new t(i),a=0;a<i;++a)e[a]&&(c[a]=f[s[e[a]-1]++]>>15-e[a]);return c}),g=new e(288),p=0;p<144;++p)g[p]=8;for(var p=144;p<256;++p)g[p]=9;for(var p=256;p<280;++p)g[p]=7;for(var p=280;p<288;++p)g[p]=8;for(var _=new e(32),p=0;p<32;++p)_[p]=5;var v=h(g,9,1),y=h(_,5,1),b=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},x=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},S=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},C=function(e){return(e+7)/8|0},w=function(t,n,r){return(n==null||n<0)&&(n=0),(r==null||r>t.length)&&(r=t.length),new e(t.subarray(n,r))},T=[`unexpected EOF`,`invalid block type`,`invalid length/literal`,`invalid distance`,`stream finished`,`no stream handler`,,`no callback`,`invalid UTF-8 data`,`extra field too long`,`date not in range 1980-2099`,`filename too long`,`stream finishing`,`invalid zip data`],E=function(e,t,n){var r=Error(t||T[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,E),!n)throw r;return r},D=function(t,n,o,s){var l=t.length,u=s?s.length:0;if(!l||n.f&&!n.l)return o||new e(0);var f=!o,p=f||n.i!=2,m=n.i;f&&(o=new e(l*3));var g=function(t){var n=o.length;if(t>n){var r=new e(Math.max(n*2,t));r.set(o),o=r}},_=n.f||0,T=n.p||0,D=n.b||0,O=n.l,k=n.d,A=n.m,j=n.n,M=l*8;do{if(!O){_=x(t,T,1);var N=x(t,T+1,3);if(T+=3,!N){var P=C(T)+4,F=t[P-4]|t[P-3]<<8,I=P+F;if(I>l){m&&E(0);break}p&&g(D+F),o.set(t.subarray(P,I),D),n.b=D+=F,n.p=T=I*8,n.f=_;continue}if(N==1)O=v,k=y,A=9,j=5;else if(N==2){var L=x(t,T,31)+257,R=x(t,T+10,15)+4,z=L+x(t,T+5,31)+1;T+=14;for(var B=new e(z),V=new e(19),H=0;H<R;++H)V[a[H]]=x(t,T+H*3,7);T+=R*3;for(var U=b(V),ee=(1<<U)-1,te=h(V,U,1),H=0;H<z;){var W=te[x(t,T,ee)];T+=W&15;var P=W>>4;if(P<16)B[H++]=P;else{var G=0,K=0;for(P==16?(K=3+x(t,T,3),T+=2,G=B[H-1]):P==17?(K=3+x(t,T,7),T+=3):P==18&&(K=11+x(t,T,127),T+=7);K--;)B[H++]=G}}var q=B.subarray(0,L),J=B.subarray(L);A=b(q),j=b(J),O=h(q,A,1),k=h(J,j,1)}else E(1);if(T>M){m&&E(0);break}}p&&g(D+131072);for(var ne=(1<<A)-1,re=(1<<j)-1,Y=T;;Y=T){var G=O[S(t,T)&ne],X=G>>4;if(T+=G&15,T>M){m&&E(0);break}if(G||E(2),X<256)o[D++]=X;else if(X==256){Y=T,O=null;break}else{var ie=X-254;if(X>264){var H=X-257,Z=r[H];ie=x(t,T,(1<<Z)-1)+c[H],T+=Z}var Q=k[S(t,T)&re],$=Q>>4;Q||E(3),T+=Q&15;var J=d[$];if($>3){var Z=i[$];J+=S(t,T)&(1<<Z)-1,T+=Z}if(T>M){m&&E(0);break}p&&g(D+131072);var ae=D+ie;if(D<J){var oe=u-J,se=Math.min(J,ae);for(oe+D<0&&E(3);D<se;++D)o[D]=s[oe+D]}for(;D<ae;++D)o[D]=o[D-J]}}n.l=O,n.p=Y,n.b=D,n.f=_,O&&(_=1,n.m=A,n.d=k,n.n=j)}while(!_);return D!=o.length&&f?w(o,0,D):o.subarray(0,D)},O=new e(0),k=function(e,t){return e[t]|e[t+1]<<8},A=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},j=function(e,t){return A(e,t)+A(e,t+4)*4294967296};function M(e,t){return D(e,{i:2},t&&t.out,t&&t.dictionary)}var N=typeof TextDecoder<`u`&&new TextDecoder;try{N.decode(O,{stream:!0})}catch{}var P=function(e){for(var t=``,n=0;;){var r=e[n++],i=(r>127)+(r>223)+(r>239);if(n+i>e.length)return{s:t,r:w(e,n-1)};i?i==3?(r=((r&15)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,t+=String.fromCharCode(55296|r>>10,56320|r&1023)):i&1?t+=String.fromCharCode((r&31)<<6|e[n++]&63):t+=String.fromCharCode((r&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCharCode(r)}};function F(e,t){if(t){for(var n=``,r=0;r<e.length;r+=16384)n+=String.fromCharCode.apply(null,e.subarray(r,r+16384));return n}if(N)return N.decode(e);var i=P(e),a=i.s,n=i.r;return n.length&&E(8),a}var I=function(e,t){return t+30+k(e,t+26)+k(e,t+28)},L=function(e,t,n){var r=k(e,t+28),i=k(e,t+30),a=F(e.subarray(t+46,t+46+r),!(k(e,t+8)&2048)),o=t+46+r,s=R(e,o,i,n,A(e,t+20),A(e,t+24),A(e,t+42)),c=s[0],l=s[1],u=s[2];return[k(e,t+10),c,l,a,o+i+k(e,t+32),u]},R=function(e,t,n,r,i,a,o){var s=i==4294967295,c=a==4294967295,l=o==4294967295,u=t+n,d=s+c+l;if(r&&d){for(;t+4<u;t+=4+k(e,t+2))if(k(e,t)==1)return[s?j(e,t+4+8*c):i,c?j(e,t+4):a,l?j(e,t+4+8*(c+s)):o,1];r<2&&E(13)}return[i,a,o,0]};function z(t,n){for(var r={},i=t.length-22;A(t,i)!=101010256;--i)(!i||t.length-i>65558)&&E(13);var a=k(t,i+8);if(!a)return{};var o=A(t,i+16),s=A(t,i-20)==117853008;if(s){var c=A(t,i-12);s=A(t,c)==101075792,s&&(a=A(t,c+32),o=A(t,c+48))}for(var l=n&&n.filter,u=0;u<a;++u){var d=L(t,o,s),f=d[0],p=d[1],m=d[2],h=d[3],g=d[4],_=d[5],v=I(t,_);o=g,(!l||l({name:h,size:p,originalSize:m,compression:f}))&&(f?f==8?r[h]=M(t.subarray(v,v+p),{out:new e(m)}):E(14,`unknown compression type `+f):r[h]=w(t,v,v+p))}return r}var B=52428800,V=new Set([`dclid`,`fbclid`,`gclid`,`mc_cid`,`mc_eid`,`mkt_tok`,`msclkid`,`oly_anon_id`,`oly_enc_id`,`vero_conv`,`vero_i
1d`,`_hsenc`,`_hsmi`]),H=document.querySelector(`[data-bookmark-analyzer]`);if(H){let e=H.querySelector(`[data-file-input]`),t=H.querySelector(`[data-drop-zone]`),n=H.querySelector(`[data-demo]`),r=H.querySelector(`[data-reset]`),i=H.querySelector(`[data-download]`),a=H.querySelector(`[data-copy]`),o=H.querySelector(`[data-status]`),s=H.querySelector(`[data-empty-state]`),c=H.querySelector(`[data-report]`),l=H.querySelector(`[data-error]`),u=null,d=`bookmark-export.html`,f=(e,t)=>{let n=H.querySelector(e);n&&(n.textContent=t)},p=e=>new Intl.NumberFormat(`en-US`).format(e),m=e=>e?new Intl.DateTimeFormat(`en`,{day:`numeric`,month:`short`,year:`numeric`}).format(e):`Not recorded`,h=e=>{let t=String(e),n=typeof e==`string`&&/^[=+\-@]/.test(t)?`'${t}`:t;return/[",\n]/.test(n)?`"${n.replaceAll(`"`,`""`)}"`:n},g=e=>{if(!e)return null;let t=Number(e);if(!Number.isFinite(t)||t<=0)return null;let n=t>0xe8d4a51000?t:t*1e3,r=new Date(n);return Number.isNaN(r.getTime())?null:r},_=e=>{let t=[],n=e.closest(`dl`);for(;n;){let e=n.parentElement,r=((e?.tagName===`DT`?e:n.previousElementSibling?.tagName===`DT`?n.previousElementSibling:null)?.querySelector(`:scope > h3`))?.textContent?.trim();r&&t.unshift(r),n=e?.closest(`dl`)??null}return t.join(` / `)||`Root`},v=e=>{try{let t=new URL(e);if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`Not a web URL`);t.hash=``,t.hostname=t.hostname.toLowerCase(),(t.protocol===`https:`&&t.port===`443`||t.protocol===`http:`&&t.port===`80`)&&(t.port=``),t.pathname.length>1&&t.pathname.endsWith(`/`)&&(t.pathname=t.pathname.slice(0,-1));let n=t.toString();for(let e of[...t.searchParams.keys()])(e.toLowerCase().startsWith(`utm_`)||V.has(e.toLowerCase()))&&t.searchParams.delete(e);return t.searchParams.sort(),{domain:t.hostname.replace(/^www\./,``),exactKey:n,trackingFreeKey:t.toString(),validWebUrl:!0}}catch{return{domain:`Non-web or invalid URL`,exactKey:`invalid:${e}`,trackingFreeKey:`invalid:${e}`,validWebUrl:!1}}},y=e=>{let t=[...new DOMParser().parseFromString(e,`text/html`).querySelectorAll(`a[href]`)];if(!t.length)throw Error(`No bookmarks were found. Choose the HTML file exported by your browser, not a saved web page.`);return t.map(e=>{let t=e.textContent?.replace(/\s+/g,` `).trim()??``,n=e.getAttribute(`href`)?.trim()??``,r=v(n);return{title:t||`Untitled bookmark`,url:n,folder:_(e),addedAt:g(e.getAttribute(`add_date`)),untitled:!t,...r}})},b=e=>{let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return[...t.entries()].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0]))},x=(e,t)=>{let n=new Map;for(let r of e){if(!r.validWebUrl)continue;let e=r[t],i=n.get(e)??[];i.push(r),n.set(e,i)}return[...n.entries()].map(([e,t])=>({key:e,items:t}))},S=e=>{let t=x(e,`exactKey`).filter(e=>e.items.length>1).sort((e,t)=>t.items.length-e.items.length),n=x(e,`trackingFreeKey`).filter(e=>e.items.length>1&&new Set(e.items.map(e=>e.exactKey)).size>1).sort((e,t)=>t.items.length-e.items.length),r=e.map(e=>e.addedAt).filter(e=>e!==null).sort((e,t)=>e.getTime()-t.getTime());return{bookmarks:e,domainCounts:b(e.map(e=>e.domain)),folderCounts:b(e.map(e=>e.folder)),yearCounts:b(r.map(e=>String(e.getFullYear()))).sort((e,t)=>Number(e[0])-Number(t[0])),duplicateGroups:t,trackingGroups:n,duplicateCopies:t.reduce((e,t)=>e+t.items.length-1,0),invalidCount:e.filter(e=>!e.validWebUrl).length,untitledCount:e.filter(e=>e.untitled).length,undatedCount:e.filter(e=>!e.addedAt).length,oldest:r.at(0)??null,newest:r.at(-1)??null}},C=e=>{let t=H.querySelector(e);return t&&t.replaceChildren(),t},w=(e,t,n)=>{let r=C(e);if(r)for(let[e,i]of t.slice(0,10)){let t=document.createElement(`div`);t.className=`analyzer-ranked-row`;let a=document.createElement(`span`);a.textContent=e,a.title=e;let o=document.createElement(`i`);o.setAttribute(`aria-hidden`,`true`),o.style.setProperty(`--bar-size`,`${Math.max(3,i/n*100)}%`);let s=document.createElement(`strong`);s.textContent=p(i),t.append(a,o,s),r.append(t)}},T=e=>{let t=C(`[data-years]`);if(!t)return;let n=Math.max(...e.yearCounts.map(([,e])=>e),1);if(!e.yearCounts.length){let e=document.createElement(`p`);e.className=`analyzer-muted`,e.textContent=`This export does not include bookmark dates.`,t.append(e);return}for(let[r,i]of e.yearCounts){let e=document.createElement(`div`);e.className=`analyzer-year-row`;let a=document.createElement(`span`);a.textContent=r;let o=document.createElement(`i`),s=document.createElement(`b`);s.style.setProperty(`--year-size`,`${Math.max(4,i/n*100)}%`),o.append(s);let c=document.createElement(`strong`);c.textContent=p(i),e.append(a,o,c),t.append(e)}},E=(e,t,n)=>{let r=C(e);if(r){if(!t.length){let e=document.createElement(`p`);e.className=`analyzer-muted`,e.textContent=n,r.append(e);return}for(let e of t.slice(0,8)){let t=document.createElement(`details`),n=document.createElement(`summary`),i=document.createElement(`span`);i.textContent=e.items[0]?.title??e.key;let a=document.createElement(`strong`);a.textContent=`${e.items.length} copies`,n.append(i,a);let o=document.createElement(`ul`);for(let t of e.items){let e=document.createElement(`li`),n=document.createElement(`span`);n.textContent=t.folder;let r=document.createElement(`code`);r.textContent=t.url,e.append(n,r),o.append(e)}t.append(n,o),r.append(t)}}},D=e=>{let t=[[`[data-signal-duplicates]`,e.duplicateCopies,`extra duplicate copies`],[`[data-signal-tracking]`,e.trackingGroups.length,`tracking-link groups`],[`[data-signal-invalid]`,e.invali
1dCount,`non-web or invalid URLs`],[`[data-signal-untitled]`,e.untitledCount,`untitled bookmarks`],[`[data-signal-undated]`,e.undatedCount,`bookmarks without a saved date`]];for(let[e,n,r]of t){let t=H.querySelector(e);if(!t)continue;let i=t.querySelector(`strong`),a=t.querySelector(`span`);i&&(i.textContent=p(n)),a&&(a.textContent=r),t.dataset.clear=n===0?`true`:`false`}},O=(e,t)=>{u=e,d=t,f(`[data-file-name]`,t),f(`[data-metric-bookmarks]`,p(e.bookmarks.length)),f(`[data-metric-folders]`,p(e.folderCounts.length)),f(`[data-metric-domains]`,p(e.domainCounts.filter(([e])=>e!==`Non-web or invalid URL`).length)),f(`[data-metric-duplicates]`,p(e.duplicateCopies)),f(`[data-oldest]`,m(e.oldest)),f(`[data-newest]`,m(e.newest)),f(`[data-dated]`,p(e.bookmarks.length-e.undatedCount)),w(`[data-domains]`,e.domainCounts.filter(([e])=>e!==`Non-web or invalid URL`),e.bookmarks.length),w(`[data-folders]`,e.folderCounts,e.bookmarks.length),T(e),E(`[data-duplicate-groups]`,e.duplicateGroups,`No repeated destination URLs were found.`),E(`[data-tracking-groups]`,e.trackingGroups,`No URL groups differed only by common tracking parameters.`),D(e),s&&(s.hidden=!0),c&&(c.hidden=!1),l&&(l.hidden=!0),o&&(o.textContent=`Analyzed ${p(e.bookmarks.length)} bookmarks locally. Nothing was uploaded.`,o.dataset.state=`success`),c?.scrollIntoView({behavior:`smooth`,block:`start`})},k=async e=>{if(e.size>B)throw Error(`That file is larger than 50 MB. Export bookmarks only and try again.`);if(!(e.name.toLowerCase().endsWith(`.zip`)||e.type===`application/zip`))return e.text();let t=z(new Uint8Array(await e.arrayBuffer()),{filter:e=>e.name.toLowerCase().endsWith(`.html`)&&e.originalSize<=B}),n=Object.entries(t),r=n.find(([e])=>/(^|\/)bookmarks?\.html$/i.test(e))??n[0];if(!r)throw Error(`No bookmark HTML file was found in that ZIP. In Safari, export bookmarks only and try again.`);return F(r[1])},A=async e=>{try{o&&(o.textContent=`Reading ${e.name} on this deviceâ¦`,o.dataset.state=`working`),l&&(l.hidden=!0);let t=await k(e);O(S(y(t)),e.name)}catch(e){let t=e instanceof Error?e.message:`The bookmark file could not be read.`;
1l&&(l.textContent=t,l.hidden=!1),o&&(o.textContent=`Analysis stopped. Your file stayed on this device.`,o.dataset.state=`error`)}},j=()=>{u=null,e&&(e.value=``),c&&(c.hidden=!0),s&&(s.hidden=!1),l&&(l.hidden=!0),o&&(o.textContent=`Ready for a bookmark HTML file or a Safari bookmarks-only ZIP.`,o.dataset.state=`idle`),t?.scrollIntoView({behavior:`smooth`,block:`center`})},M=e=>{let t=new Map;for(let n of e.duplicateGroups)t.set(n.key,n.items.length);return[[`title`,`url`,`domain`,`folder`,`date_added`,`copies_of_destination`],...e.bookmarks.map(e=>[e.title,e.url,e.domain,e.folder,e.addedAt?.toISOString()??``,t.get(e.exactKey)??1])].map(e=>e.map(h).join(`,`)).join(` 2`)},N=e=>[`Bookmark file audit`,`Bookmarks: ${p(e.bookmarks.length)}`,`Folders: ${p(e.folderCounts.length)}`,`Domains: ${p(e.domainCounts.length)}`,`Extra duplicate copies: ${p(e.duplicateCopies)}`,`Tracking-link groups: ${p(e.trackingGroups.length)}`,`Oldest dated bookmark: ${m(e.oldest)}`,`Newest dated bookmark: ${m(e.newest)}`,`Analyzed locally with Rewind: https://rewind4.com/tools/bookmark-analyzer/`].join(` 3`);e?.addEventListener(`change`,()=>{let t=e.files?.[0];t&&A(t)});for(let e of[`dragenter`,`dragover`])t?.addEventListener(e,e=>{e.preventDefault(),t.dataset.dragging=`true`});for(let e of[`dragleave`,`drop`])t?.addEventListener(e,e=>{e.preventDefault(),delete t.dataset.dragging});t?.addEventListener(`drop`,e=>{let t=e.dataTransfer?.files[0];t&&A(t)}),n?.addEventListener(`click`,()=>{let e=Math.floor(Date.now()/1e3),t=`<!DOCTYPE NETSCAPE-Bookmark-file-1> 4 <TITLE>Rewind demo bookmarks</TITLE> 5 <H1>Rewind demo bookmarks</H1> 6 <DL><p> 7 <DT><H3>Research</H3> 8 <DL><p> 9 <DT><A HREF="https://developer.mozilla.org/en-US/docs/Web/API/URL" ADD_DATE="${e-31536e3}">The URL API</A> 10 <DT><A HREF="https://developer.mozilla.org/en-US/docs/Web/API/URL" ADD_DATE="${e-16e6}">URL reference</A> 11 <DT><A HREF="https://support.google.com/chrome/answer/96816?utm_source=newsletter" ADD_DATE="${e-9e6}">Move Chrome bookmarks</A> 12 <DT><A HREF="https://support.google.com/chrome/answer/96816?utm_source=community" ADD_DATE="${e-8e6}">Chrome bookmark export</A> 13 </DL><p> 14 <DT><H3>Design references</H3> 15 <DL><p> 16 <DT><A HREF="https://www.figma.com/community" ADD_DATE="${e-6e7}">Figma Community</A> 17 <DT><A HREF="https://www.smashingmagazine.com/" ADD_DATE="${e-75e6}">Smashing Magazine</A> 18 <DT><A HREF="https://www.figma.com/community" ADD_DATE="${e-2e6}">Figma files</A> 19 </DL><p> 20 <DT><H3>Reading</H3> 21 <DL><p> 22 <DT><A HREF="https://alistapart.com/" ADD_DATE="${e-12e7}">A List Apart</A> 23 <DT><A HREF="https://web.dev/learn/" ADD_DATE="${e-6e6}">Learn web development</A> 24 <DT><A HREF="chrome://bookmarks/">Browser bookmarks</A> 25 <DT><A HREF="https://example.com/untitled" ADD_DATE="${e-1e6}"></A> 26 </DL><p> 27 </DL><p>`;O(S(y(t)),`private-demo-bookmarks.html`)}),r?.addEventListener(`click`,j),i?.addEventListener(`click`,()=>{if(!u)return;let e=new Blob([M(u)],{type:`text/csv;charset=utf-8`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`${d.replace(/\.(html?|zip)$/i,``)||`bookmarks`}-audit.csv`,n.click(),URL.revokeObjectURL(t)}),a?.addEventListener(`click`,async()=>{if(u&&a)try{await navigator.clipboard.writeText(N(u));let e=a.textContent;a.textContent=`Copied`,window.setTimeout(()=>{a.textContent=e},1600)}catch{a.textContent=`Copy unavailable`}})}
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.