STreaming ARchives: stricter, verifiable, deterministic, highly compressible alternatives to CAR files for atproto repositories.
atproto car
9
fork

Configure Feed

Select the types of activity you want to include in your feed.

viz

phil e58a5f85 c1c44d4a

+2423
+1
star-lite/viz/.gitignore
··· 1 + node_modules
+1
star-lite/viz/dist/assets/index-B_cDv0fH.css
··· 1 + .viz-wrap.svelte-qc7y49{overflow-x:auto;background:#0e0f13;border:1px solid #1c1f26;border-radius:6px}svg.svelte-qc7y49{display:block}.layer-label.svelte-qc7y49{fill:#4a505c;font:10px ui-monospace,monospace}.layer-divider.svelte-qc7y49{stroke:#14171c;stroke-width:1}.stream-cell.svelte-qc7y49 rect:where(.svelte-qc7y49){stroke:#2a2f3a;stroke-width:.5}.stream-cell.past.svelte-qc7y49 rect:where(.svelte-qc7y49){opacity:.55}.stream-cell.current.svelte-qc7y49 rect:where(.svelte-qc7y49){stroke:#6ea2ff;stroke-width:1.5}.stream-cell.pulse-cell.svelte-qc7y49 rect:where(.svelte-qc7y49){stroke:#ffd86c;stroke-width:2}.stream-cell.svelte-qc7y49 .key:where(.svelte-qc7y49){fill:#d4d8e0;font:12px ui-monospace,monospace}.stream-cell.past.svelte-qc7y49 .key:where(.svelte-qc7y49){fill:#5b626d}.stream-cell.current.svelte-qc7y49 .key:where(.svelte-qc7y49){fill:#eaf3ff;font-weight:600}.stream-cell.svelte-qc7y49 .layer-tag:where(.svelte-qc7y49){fill:#5b626d;font:9px ui-monospace,monospace}.layer-tick.svelte-qc7y49{stroke-width:2}.node.svelte-qc7y49 rect:where(.svelte-qc7y49){fill:#14171c;stroke:#2a3140}.node.svelte-qc7y49 .title:where(.svelte-qc7y49){font:11px ui-monospace,monospace}.node.svelte-qc7y49 .cid:where(.svelte-qc7y49){font:10px ui-monospace,monospace;opacity:.8}.node.active.svelte-qc7y49 rect:where(.svelte-qc7y49){fill:#1f3550;stroke:#6cd0ff;stroke-width:1.5}.node.active.svelte-qc7y49 .title:where(.svelte-qc7y49){fill:#d4ecff}.node.active.svelte-qc7y49 .cid:where(.svelte-qc7y49){fill:#6cd0ff}.node.active.pulse-active.svelte-qc7y49 rect:where(.svelte-qc7y49){stroke:#ffd86c;stroke-width:2}.node.active.svelte-qc7y49 .entry-dot.active:where(.svelte-qc7y49){fill:#6cd0ff}.node.frozen.svelte-qc7y49 rect:where(.svelte-qc7y49){fill:#11141a;stroke:#232830;opacity:.85}.node.frozen.svelte-qc7y49 .title:where(.svelte-qc7y49){fill:#6b7280}.node.frozen.svelte-qc7y49 .cid:where(.svelte-qc7y49){fill:#4a4f59}.node.frozen.svelte-qc7y49 .entry-dot:where(.svelte-qc7y49){fill:#2f3540}.node.frozen.pulse-cid.svelte-qc7y49 rect:where(.svelte-qc7y49){stroke:#ffd86c;stroke-width:2;opacity:1}.node.frozen.isRoot.svelte-qc7y49 rect:where(.svelte-qc7y49){fill:#1a1c14;stroke:#ffd86c;stroke-width:1.5;opacity:1}.node.frozen.isRoot.svelte-qc7y49 .title:where(.svelte-qc7y49),.node.frozen.isRoot.svelte-qc7y49 .cid:where(.svelte-qc7y49){fill:#ffe8a3}.ghost-skip.svelte-qc7y49{fill:none;stroke:#3a3f48;stroke-dasharray:4 4;opacity:.6}.ghost-label.svelte-qc7y49{fill:#5b626d;font:11px ui-monospace,monospace}.cursor.svelte-qc7y49{stroke:#6ea2ff;stroke-width:1;stroke-dasharray:3 3;opacity:.6}.controls.svelte-1y71c66{display:flex;gap:10px;align-items:center;padding:12px;background:#14171c;border:1px solid #1c1f26;border-radius:6px;margin-top:10px}button.svelte-1y71c66{background:#1f2530;color:#d4d8e0;border:1px solid #2a3140;padding:6px 10px;border-radius:4px;cursor:pointer;font-size:13px;line-height:1}button.svelte-1y71c66:hover{background:#2a3140}button.play.svelte-1y71c66{background:#2c4a70;border-color:#4070b0;min-width:36px}button.play.svelte-1y71c66:hover{background:#355a85}.scrub.svelte-1y71c66{flex:1;min-width:100px;accent-color:#6cd0ff}.speed.svelte-1y71c66{display:flex;align-items:center;gap:6px;color:#8a93a3;font-size:12px}.speed.svelte-1y71c66 input:where(.svelte-1y71c66){width:100px;accent-color:#6cd0ff}.speed.svelte-1y71c66 span:where(.svelte-1y71c66){color:#d4d8e0;font-family:ui-monospace,monospace;min-width:42px;text-align:right}.counter.svelte-1y71c66{color:#8a93a3;font:12px ui-monospace,monospace;min-width:64px;text-align:right}.dataset-picker.svelte-1n46o8q{display:flex;gap:14px;margin-bottom:8px;color:#8a93a3;font-size:13px;flex-wrap:wrap;align-items:center}.dataset-picker.svelte-1n46o8q label:where(.svelte-1n46o8q){display:flex;gap:5px;align-items:center;cursor:pointer}.dataset-picker.svelte-1n46o8q input[type=radio]:where(.svelte-1n46o8q){accent-color:#6cd0ff}.dataset-picker.svelte-1n46o8q .spacer:where(.svelte-1n46o8q){flex:1}.file-button.svelte-1n46o8q{background:#1f2530;color:#d4d8e0;border:1px solid #2a3140;padding:6px 10px;border-radius:4px;cursor:pointer;font-size:12px}.file-button.svelte-1n46o8q:hover{background:#2a3140}.msg.svelte-1n46o8q{margin:6px 0;font:12px ui-monospace,monospace}.msg.ok.svelte-1n46o8q{color:#6cd0ff}.msg.err.svelte-1n46o8q{color:#ff6c6c}.msg.muted.svelte-1n46o8q{color:#8a93a3}.msg.svelte-1n46o8q code:where(.svelte-1n46o8q){color:#d4d8e0}footer.svelte-1n46o8q{margin-top:16px;color:#6b7280;font-size:12px;max-width:720px;line-height:1.5}footer.svelte-1n46o8q p:where(.svelte-1n46o8q){margin:6px 0}footer.svelte-1n46o8q code:where(.svelte-1n46o8q){color:#8a93a3;background:#14171c;padding:1px 5px;border-radius:3px}*{box-sizing:border-box}html,body{margin:0;padding:0;background:#0a0b0e;color:#d4d8e0;font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif}main{padding:16px;min-height:100vh}header{margin-bottom:12px}header h1{margin:0;font-size:18px;font-weight:600;letter-spacing:.2px}header p{margin:4px 0 0;font:12px ui-monospace,SFMono-Regular,Menlo,monospace;color:#8a93a3}header p .ev{color:#6cd0ff}.viz-wrap{overflow-x:auto;background:#0e0f13;border:1px solid #1c1f26;border-radius:6px}
+9
star-lite/viz/dist/assets/index-DAzQMesO.js
··· 1 + var Ui=Object.defineProperty;var Dn=e=>{throw TypeError(e)};var Gi=(e,t,r)=>t in e?Ui(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var qe=(e,t,r)=>Gi(e,typeof t!="symbol"?t+"":t,r),Ur=(e,t,r)=>t.has(e)||Dn("Cannot "+r);var u=(e,t,r)=>(Ur(e,t,"read from private field"),r?r.call(e):t.get(e)),S=(e,t,r)=>t.has(e)?Dn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),I=(e,t,r,n)=>(Ur(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r),q=(e,t,r)=>(Ur(e,t,"access private method"),r);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function r(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=r(i);fetch(i.href,s)}})();const Xi=!1;var ni=Array.isArray,Zi=Array.prototype.indexOf,Xt=Array.prototype.includes,$r=Array.from,Ji=Object.defineProperty,Bt=Object.getOwnPropertyDescriptor,Qi=Object.getOwnPropertyDescriptors,es=Object.prototype,ts=Array.prototype,ii=Object.getPrototypeOf,qn=Object.isExtensible;const rs=()=>{};function ns(e){for(var t=0;t<e.length;t++)e[t]()}function si(){var e,t,r=new Promise((n,i)=>{e=n,t=i});return{promise:r,resolve:e,reject:t}}const ae=2,Zt=4,Hr=8,li=1<<24,We=16,Ke=32,vt=64,fn=128,Me=512,Z=1024,ne=2048,Ue=4096,de=8192,xe=16384,zt=32768,un=1<<25,Jt=65536,cn=1<<17,is=1<<18,rr=1<<19,ss=1<<20,tt=1<<25,Lt=65536,qr=1<<21,cr=1<<22,dt=1<<23,Ct=Symbol("$state"),ls=Symbol("legacy props"),as=Symbol(""),Xe=new class extends Error{constructor(){super(...arguments);qe(this,"name","StaleReactionError");qe(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function os(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function fs(e,t,r){throw new Error("https://svelte.dev/e/each_key_duplicate")}function us(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function cs(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function ds(e){throw new Error("https://svelte.dev/e/effect_orphan")}function hs(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function vs(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function _s(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function ps(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function ys(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const gs=1,ms=2,ws=16,bs=1,xs=2,Q=Symbol(),ai="http://www.w3.org/1999/xhtml";function ks(){console.warn("https://svelte.dev/e/derived_inert")}function Es(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function oi(e){return e===this.v}function Ss(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function fi(e){return!Ss(e,this.v)}let As=!1,ke=null;function Qt(e){ke=e}function jr(e,t=!1,r){ke={p:ke,i:!1,c:null,e:null,s:e,x:null,r:T,l:null}}function Br(e){var t=ke,r=t.e;if(r!==null){t.e=null;for(var n of r)Mi(n)}return t.i=!0,ke=t.p,{}}function ui(){return!0}let bt=[];function ci(){var e=bt;bt=[],ns(e)}function ht(e){if(bt.length===0&&!fr){var t=bt;queueMicrotask(()=>{t===bt&&ci()})}bt.push(e)}function Is(){for(;bt.length>0;)ci()}function di(e){var t=T;if(t===null)return C.f|=dt,e;if((t.f&zt)===0&&(t.f&Zt)===0)throw e;ct(e,t)}function ct(e,t){for(;t!==null;){if((t.f&fn)!==0){if((t.f&zt)===0)throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw e}const Ts=-7169;function B(e,t){e.f=e.f&Ts|t}function kn(e){(e.f&Me)!==0||e.deps===null?B(e,Z):B(e,Ue)}function hi(e){if(e!==null)for(const t of e)(t.f&ae)===0||(t.f&Lt)===0||(t.f^=Lt,hi(t.deps))}function vi(e,t,r){(e.f&ne)!==0?t.add(e):(e.f&Ue)!==0&&r.add(e),hi(e.deps),B(e,Z)}let Ar=!1;function Cs(e){var t=Ar;try{return Ar=!1,[e(),Ar]}finally{Ar=t}}const gt=new Set;let x=null,re=null,dn=null,fr=!1,Gr=!1,Ht=null,Tr=null;var On=0;let Ms=1;var Yt,Vt,Et,Ze,Be,hr,me,vr,ft,Je,Ye,Wt,Ut,St,U,Cr,_i,Mr,hn,Rr,Rs;const Fr=class Fr{constructor(){S(this,U);qe(this,"id",Ms++);qe(this,"current",new Map);qe(this,"previous",new Map);S(this,Yt,new Set);S(this,Vt,new Set);S(this,Et,new Set);S(this,Ze,new Map);S(this,Be,new Map);S(this,hr,null);S(this,me,[]);S(this,vr,[]);S(this,ft,new Set);S(this,Je,new Set);S(this,Ye,new Map);S(this,Wt,new Set);qe(this,"is_fork",!1);S(this,Ut,!1);S(this,St,new Set)}skip_effect(t){u(this,Ye).has(t)||u(this,Ye).set(t,{d:[],m:[]}),u(this,Wt).delete(t)}unskip_effect(t,r=n=>this.schedule(n)){var n=u(this,Ye).get(t);if(n){u(this,Ye).delete(t);for(var i of n.d)B(i,ne),r(i);for(i of n.m)B(i,Ue),r(i)}u(this,Wt).add(t)}capture(t,r,n=!1){t.v!==Q&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&dt)===0&&(this.current.set(t,[r,n]),re==null||re.set(t,r)),this.is_fork||(t.v=r)}activate(){x=this}deactivate(){x=null,re=null}flush(){try{Gr=!0,x=this,q(this,U,Mr).call(this)}finally{On=0,dn=null,Ht=null,Tr=null,Gr=!1,x=null,re=null,Mt.clear()}}discard(){for(const t of u(this,Vt))t(this);u(this,Vt).clear(),u(this,Et).clear(),gt.delete(this)}register_created_effect(t){u(this,vr).push(t)}increment(t,r){let n=u(this,Ze).get(r)??0;if(u(this,Ze).set(r,n+1),t){let i=u(this,Be).get(r)??0;u(this,Be).set(r,i+1)}}decrement(t,r,n){let i=u(this,Ze).get(r)??0;if(i===1?u(this,Ze).delete(r):u(this,Ze).set(r,i-1),t){let s=u(this,Be).get(r)??0;s===1?u(this,Be).delete(r):u(this,Be).set(r,s-1)}u(this,Ut)||n||(I(this,Ut,!0),ht(()=>{I(this,Ut,!1),this.flush()}))}transfer_effects(t,r){for(const n of t)u(this,ft).add(n);for(const n of r)u(this,Je).add(n);t.clear(),r.clear()}oncommit(t){u(this,Yt).add(t)}ondiscard(t){u(this,Vt).add(t)}on_fork_commit(t){u(this,Et).add(t)}run_fork_commit_callbacks(){for(const t of u(this,Et))t(this);u(this,Et).clear()}settled(){return(u(this,hr)??I(this,hr,si())).promise}static ensure(){if(x===null){const t=x=new Fr;Gr||(gt.add(x),fr||ht(()=>{x===t&&t.flush()}))}return x}apply(){{re=null;return}}schedule(t){var i;if(dn=t,(i=t.b)!=null&&i.is_pending&&(t.f&(Zt|Hr|li))!==0&&(t.f&zt)===0){t.b.defer_effect(t);return}for(var r=t;r.parent!==null;){r=r.parent;var n=r.f;if(Ht!==null&&r===T&&(C===null||(C.f&ae)===0))return;if((n&(vt|Ke))!==0){if((n&Z)===0)return;r.f^=Z}}u(this,me).push(r)}};Yt=new WeakMap,Vt=new WeakMap,Et=new WeakMap,Ze=new WeakMap,Be=new WeakMap,hr=new WeakMap,me=new WeakMap,vr=new WeakMap,ft=new WeakMap,Je=new WeakMap,Ye=new WeakMap,Wt=new WeakMap,Ut=new WeakMap,St=new WeakMap,U=new WeakSet,Cr=function(){return this.is_fork||u(this,Be).size>0},_i=function(){for(const n of u(this,St))for(const i of u(n,Be).keys()){for(var t=!1,r=i;r.parent!==null;){if(u(this,Ye).has(r)){t=!0;break}r=r.parent}if(!t)return!0}return!1},Mr=function(){var o,a;if(On++>1e3&&(gt.delete(this),Ls()),!q(this,U,Cr).call(this)){for(const f of u(this,ft))u(this,Je).delete(f),B(f,ne),this.schedule(f);for(const f of u(this,Je))B(f,Ue),this.schedule(f)}const t=u(this,me);I(this,me,[]),this.apply();var r=Ht=[],n=[],i=Tr=[];for(const f of t)try{q(this,U,hn).call(this,f,r,n)}catch(h){throw gi(f),h}if(x=null,i.length>0){var s=Fr.ensure();for(const f of i)s.schedule(f)}if(Ht=null,Tr=null,q(this,U,Cr).call(this)||q(this,U,_i).call(this)){q(this,U,Rr).call(this,n),q(this,U,Rr).call(this,r);for(const[f,h]of u(this,Ye))yi(f,h)}else{u(this,Ze).size===0&&gt.delete(this),u(this,ft).clear(),u(this,Je).clear();for(const f of u(this,Yt))f(this);u(this,Yt).clear(),zn(n),zn(r),(o=u(this,hr))==null||o.resolve()}var l=x;if(u(this,me).length>0){const f=l??(l=this);u(f,me).push(...u(this,me).filter(h=>!u(f,me).includes(h)))}l!==null&&(gt.add(l),q(a=l,U,Mr).call(a))},hn=function(t,r,n){t.f^=Z;for(var i=t.first;i!==null;){var s=i.f,l=(s&(Ke|vt))!==0,o=l&&(s&Z)!==0,a=o||(s&de)!==0||u(this,Ye).has(i);if(!a&&i.fn!==null){l?i.f^=Z:(s&Zt)!==0?r.push(i):wr(i)&&((s&We)!==0&&u(this,Je).add(i),tr(i));var f=i.first;if(f!==null){i=f;continue}}for(;i!==null;){var h=i.next;if(h!==null){i=h;break}i=i.parent}}},Rr=function(t){for(var r=0;r<t.length;r+=1)vi(t[r],u(this,ft),u(this,Je))},Rs=function(){var h,p,_;for(const v of gt){var t=v.id<this.id,r=[];for(const[d,[b,w]]of this.current){if(v.current.has(d)){var n=v.current.get(d)[0];if(t&&b!==n)v.current.set(d,[b,w]);else continue}r.push(d)}var i=[...v.current.keys()].filter(d=>!this.current.has(d));if(i.length===0)t&&v.discard();else if(r.length>0){if(t)for(const d of u(this,Wt))v.unskip_effect(d,b=>{var w;(b.f&(We|cr))!==0?v.schedule(b):q(w=v,U,Rr).call(w,[b])});v.activate();var s=new Set,l=new Map;for(var o of r)pi(o,i,s,l);l=new Map;var a=[...v.current.keys()].filter(d=>this.current.has(d)?this.current.get(d)[0]!==d:!0);for(const d of u(this,vr))(d.f&(xe|de|cn))===0&&En(d,a,l)&&((d.f&(cr|We))!==0?(B(d,ne),v.schedule(d)):u(v,ft).add(d));if(u(v,me).length>0){v.apply();for(var f of u(v,me))q(h=v,U,hn).call(h,f,[],[]);I(v,me,[])}v.deactivate()}}for(const v of gt)u(v,St).has(this)&&(u(v,St).delete(this),u(v,St).size===0&&!q(p=v,U,Cr).call(p)&&(v.activate(),q(_=v,U,Mr).call(_)))};let Dt=Fr;function Ns(e){var t=fr;fr=!0;try{for(var r;;){if(Is(),x===null)return r;x.flush()}}finally{fr=t}}function Ls(){try{hs()}catch(e){ct(e,dn)}}let Oe=null;function zn(e){var t=e.length;if(t!==0){for(var r=0;r<t;){var n=e[r++];if((n.f&(xe|de))===0&&wr(n)&&(Oe=new Set,tr(n),n.deps===null&&n.first===null&&n.nodes===null&&n.teardown===null&&n.ac===null&&Ni(n),(Oe==null?void 0:Oe.size)>0)){Mt.clear();for(const i of Oe){if((i.f&(xe|de))!==0)continue;const s=[i];let l=i.parent;for(;l!==null;)Oe.has(l)&&(Oe.delete(l),s.push(l)),l=l.parent;for(let o=s.length-1;o>=0;o--){const a=s[o];(a.f&(xe|de))===0&&tr(a)}}Oe.clear()}}Oe=null}}function pi(e,t,r,n){if(!r.has(e)&&(r.add(e),e.reactions!==null))for(const i of e.reactions){const s=i.f;(s&ae)!==0?pi(i,t,r,n):(s&(cr|We))!==0&&(s&ne)===0&&En(i,t,n)&&(B(i,ne),Sn(i))}}function En(e,t,r){const n=r.get(e);if(n!==void 0)return n;if(e.deps!==null)for(const i of e.deps){if(Xt.call(t,i))return!0;if((i.f&ae)!==0&&En(i,t,r))return r.set(i,!0),!0}return r.set(e,!1),!1}function Sn(e){x.schedule(e)}function yi(e,t){if(!((e.f&Ke)!==0&&(e.f&Z)!==0)){(e.f&ne)!==0?t.d.push(e):(e.f&Ue)!==0&&t.m.push(e),B(e,Z);for(var r=e.first;r!==null;)yi(r,t),r=r.next}}function gi(e){B(e,Z);for(var t=e.first;t!==null;)gi(t),t=t.next}function Ds(e){let t=0,r=qt(0),n;return()=>{Tn()&&(c(r),Vr(()=>(t===0&&(n=Ln(()=>e(()=>ur(r)))),t+=1,()=>{ht(()=>{t-=1,t===0&&(n==null||n(),n=void 0,ur(r))})})))}}var qs=Jt|rr;function Os(e,t,r,n){new zs(e,t,r,n)}var Ae,xn,Ie,At,ve,Te,ue,we,Qe,It,ut,Gt,_r,pr,et,Kr,K,Fs,Ks,Ps,vn,Nr,Lr,_n,pn;class zs{constructor(t,r,n,i){S(this,K);qe(this,"parent");qe(this,"is_pending",!1);qe(this,"transform_error");S(this,Ae);S(this,xn,null);S(this,Ie);S(this,At);S(this,ve);S(this,Te,null);S(this,ue,null);S(this,we,null);S(this,Qe,null);S(this,It,0);S(this,ut,0);S(this,Gt,!1);S(this,_r,new Set);S(this,pr,new Set);S(this,et,null);S(this,Kr,Ds(()=>(I(this,et,qt(u(this,It))),()=>{I(this,et,null)})));var s;I(this,Ae,t),I(this,Ie,r),I(this,At,l=>{var o=T;o.b=this,o.f|=fn,n(l)}),this.parent=T.b,this.transform_error=i??((s=this.parent)==null?void 0:s.transform_error)??(l=>l),I(this,ve,Cn(()=>{q(this,K,vn).call(this)},qs))}defer_effect(t){vi(t,u(this,_r),u(this,pr))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!u(this,Ie).pending}update_pending_count(t,r){q(this,K,_n).call(this,t,r),I(this,It,u(this,It)+t),!(!u(this,et)||u(this,Gt))&&(I(this,Gt,!0),ht(()=>{I(this,Gt,!1),u(this,et)&&er(u(this,et),u(this,It))}))}get_effect_pending(){return u(this,Kr).call(this),c(u(this,et))}error(t){if(!u(this,Ie).onerror&&!u(this,Ie).failed)throw t;x!=null&&x.is_fork?(u(this,Te)&&x.skip_effect(u(this,Te)),u(this,ue)&&x.skip_effect(u(this,ue)),u(this,we)&&x.skip_effect(u(this,we)),x.on_fork_commit(()=>{q(this,K,pn).call(this,t)})):q(this,K,pn).call(this,t)}}Ae=new WeakMap,xn=new WeakMap,Ie=new WeakMap,At=new WeakMap,ve=new WeakMap,Te=new WeakMap,ue=new WeakMap,we=new WeakMap,Qe=new WeakMap,It=new WeakMap,ut=new WeakMap,Gt=new WeakMap,_r=new WeakMap,pr=new WeakMap,et=new WeakMap,Kr=new WeakMap,K=new WeakSet,Fs=function(){try{I(this,Te,Ce(()=>u(this,At).call(this,u(this,Ae))))}catch(t){this.error(t)}},Ks=function(t){const r=u(this,Ie).failed;r&&I(this,we,Ce(()=>{r(u(this,Ae),()=>t,()=>()=>{})}))},Ps=function(){const t=u(this,Ie).pending;t&&(this.is_pending=!0,I(this,ue,Ce(()=>t(u(this,Ae)))),ht(()=>{var r=I(this,Qe,document.createDocumentFragment()),n=Ot();r.append(n),I(this,Te,q(this,K,Lr).call(this,()=>Ce(()=>u(this,At).call(this,n)))),u(this,ut)===0&&(u(this,Ae).before(r),I(this,Qe,null),Rt(u(this,ue),()=>{I(this,ue,null)}),q(this,K,Nr).call(this,x))}))},vn=function(){try{if(this.is_pending=this.has_pending_snippet(),I(this,ut,0),I(this,It,0),I(this,Te,Ce(()=>{u(this,At).call(this,u(this,Ae))})),u(this,ut)>0){var t=I(this,Qe,document.createDocumentFragment());Nn(u(this,Te),t);const r=u(this,Ie).pending;I(this,ue,Ce(()=>r(u(this,Ae))))}else q(this,K,Nr).call(this,x)}catch(r){this.error(r)}},Nr=function(t){this.is_pending=!1,t.transfer_effects(u(this,_r),u(this,pr))},Lr=function(t){var r=T,n=C,i=ke;Ge(u(this,ve)),Ne(u(this,ve)),Qt(u(this,ve).ctx);try{return Dt.ensure(),t()}catch(s){return di(s),null}finally{Ge(r),Ne(n),Qt(i)}},_n=function(t,r){var n;if(!this.has_pending_snippet()){this.parent&&q(n=this.parent,K,_n).call(n,t,r);return}I(this,ut,u(this,ut)+t),u(this,ut)===0&&(q(this,K,Nr).call(this,r),u(this,ue)&&Rt(u(this,ue),()=>{I(this,ue,null)}),u(this,Qe)&&(u(this,Ae).before(u(this,Qe)),I(this,Qe,null)))},pn=function(t){u(this,Te)&&(pe(u(this,Te)),I(this,Te,null)),u(this,ue)&&(pe(u(this,ue)),I(this,ue,null)),u(this,we)&&(pe(u(this,we)),I(this,we,null));var r=u(this,Ie).onerror;let n=u(this,Ie).failed;var i=!1,s=!1;const l=()=>{if(i){Es();return}i=!0,s&&ys(),u(this,we)!==null&&Rt(u(this,we),()=>{I(this,we,null)}),q(this,K,Lr).call(this,()=>{q(this,K,vn).call(this)})},o=a=>{try{s=!0,r==null||r(a,l),s=!1}catch(f){ct(f,u(this,ve)&&u(this,ve).parent)}n&&I(this,we,q(this,K,Lr).call(this,()=>{try{return Ce(()=>{var f=T;f.b=this,f.f|=fn,n(u(this,Ae),()=>a,()=>l)})}catch(f){return ct(f,u(this,ve).parent),null}}))};ht(()=>{var a;try{a=this.transform_error(t)}catch(f){ct(f,u(this,ve)&&u(this,ve).parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(o,f=>ct(f,u(this,ve)&&u(this,ve).parent)):o(a)})};function $s(e,t,r,n){const i=Yr;var s=e.filter(_=>!_.settled);if(r.length===0&&s.length===0){n(t.map(i));return}var l=T,o=Hs(),a=s.length===1?s[0].promise:s.length>1?Promise.all(s.map(_=>_.promise)):null;function f(_){o();try{n(_)}catch(v){(l.f&xe)===0&&ct(v,l)}Or()}if(r.length===0){a.then(()=>f(t.map(i)));return}var h=mi();function p(){Promise.all(r.map(_=>js(_))).then(_=>f([...t.map(i),..._])).catch(_=>ct(_,l)).finally(()=>h())}a?a.then(()=>{o(),p(),Or()}):p()}function Hs(){var e=T,t=C,r=ke,n=x;return function(s=!0){Ge(e),Ne(t),Qt(r),s&&(e.f&xe)===0&&(n==null||n.activate(),n==null||n.apply())}}function Or(e=!0){Ge(null),Ne(null),Qt(null),e&&(x==null||x.deactivate())}function mi(){var e=T,t=e.b,r=x,n=t.is_rendered();return t.update_pending_count(1,r),r.increment(n,e),(i=!1)=>{t.update_pending_count(-1,r),r.decrement(n,e,i)}}function Yr(e){var t=ae|ne;return T!==null&&(T.f|=rr),{ctx:ke,deps:null,effects:null,equals:oi,f:t,fn:e,reactions:null,rv:0,v:Q,wv:0,parent:T,ac:null}}function js(e,t,r){let n=T;n===null&&os();var i=void 0,s=qt(Q),l=!C,o=new Map;return il(()=>{var v;var a=T,f=si();i=f.promise;try{Promise.resolve(e()).then(f.resolve,f.reject).finally(Or)}catch(d){f.reject(d),Or()}var h=x;if(l){if((a.f&zt)!==0)var p=mi();if(n.b.is_rendered())(v=o.get(h))==null||v.reject(Xe),o.delete(h);else{for(const d of o.values())d.reject(Xe);o.clear()}o.set(h,f)}const _=(d,b=void 0)=>{if(p){var w=b===Xe;p(w)}if(!(b===Xe||(a.f&xe)!==0)){if(h.activate(),b)s.f|=dt,er(s,b);else{(s.f&dt)!==0&&(s.f^=dt),er(s,d);for(const[y,E]of o){if(o.delete(y),y===h)break;E.reject(Xe)}}h.deactivate()}};f.promise.then(_,d=>_(null,d||"unknown"))}),Ci(()=>{for(const a of o.values())a.reject(Xe)}),new Promise(a=>{function f(h){function p(){h===i?a(s):f(i)}h.then(p,p)}f(i)})}function z(e){const t=Yr(e);return qi(t),t}function Bs(e){const t=Yr(e);return t.equals=fi,t}function Ys(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r<t.length;r+=1)pe(t[r])}}function An(e){var t,r=T,n=e.parent;if(!rt&&n!==null&&(n.f&(xe|de))!==0)return ks(),e.v;Ge(n);try{e.f&=~Lt,Ys(e),t=Ki(e)}finally{Ge(r)}return t}function wi(e){var t=An(e);if(!e.equals(t)&&(e.wv=zi(),(!(x!=null&&x.is_fork)||e.deps===null)&&(x!==null?x.capture(e,t,!0):e.v=t,e.deps===null))){B(e,Z);return}rt||(re!==null?(Tn()||x!=null&&x.is_fork)&&re.set(e,t):kn(e))}function Vs(e){var t,r;if(e.effects!==null)for(const n of e.effects)(n.teardown||n.ac)&&((t=n.teardown)==null||t.call(n),(r=n.ac)==null||r.abort(Xe),n.teardown=rs,n.ac=null,dr(n,0),Mn(n))}function bi(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&tr(t)}let yn=new Set;const Mt=new Map;let xi=!1;function qt(e,t){var r={f:0,v:e,reactions:null,equals:oi,rv:0,wv:0};return r}function le(e,t){const r=qt(e);return qi(r),r}function Ws(e,t=!1,r=!0){const n=qt(e);return t||(n.equals=fi),n}function N(e,t,r=!1){C!==null&&(!Fe||(C.f&cn)!==0)&&ui()&&(C.f&(ae|We|cr|cn))!==0&&(Re===null||!Xt.call(Re,e))&&ps();let n=r?jt(t):t;return er(e,n,Tr)}function er(e,t,r=null){if(!e.equals(t)){Mt.set(e,rt?t:e.v);var n=Dt.ensure();if(n.capture(e,t),(e.f&ae)!==0){const i=e;(e.f&ne)!==0&&An(i),re===null&&kn(i)}e.wv=zi(),ki(e,ne,r),T!==null&&(T.f&Z)!==0&&(T.f&(Ke|vt))===0&&(Se===null?al([e]):Se.push(e)),!n.is_fork&&yn.size>0&&!xi&&Us()}return t}function Us(){xi=!1;for(const e of yn)(e.f&Z)!==0&&B(e,Ue),wr(e)&&tr(e);yn.clear()}function ur(e){N(e,e.v+1)}function ki(e,t,r){var n=e.reactions;if(n!==null)for(var i=n.length,s=0;s<i;s++){var l=n[s],o=l.f,a=(o&ne)===0;if(a&&B(l,t),(o&ae)!==0){var f=l;re==null||re.delete(f),(o&Lt)===0&&(o&Me&&(T===null||(T.f&qr)===0)&&(l.f|=Lt),ki(f,Ue,r))}else if(a){var h=l;(o&We)!==0&&Oe!==null&&Oe.add(h),r!==null?r.push(h):Sn(h)}}}function jt(e){if(typeof e!="object"||e===null||Ct in e)return e;const t=ii(e);if(t!==es&&t!==ts)return e;var r=new Map,n=ni(e),i=le(0),s=Nt,l=o=>{if(Nt===s)return o();var a=C,f=Nt;Ne(null),Hn(s);var h=o();return Ne(a),Hn(f),h};return n&&r.set("length",le(e.length)),new Proxy(e,{defineProperty(o,a,f){(!("value"in f)||f.configurable===!1||f.enumerable===!1||f.writable===!1)&&vs();var h=r.get(a);return h===void 0?l(()=>{var p=le(f.value);return r.set(a,p),p}):N(h,f.value,!0),!0},deleteProperty(o,a){var f=r.get(a);if(f===void 0){if(a in o){const h=l(()=>le(Q));r.set(a,h),ur(i)}}else N(f,Q),ur(i);return!0},get(o,a,f){var v;if(a===Ct)return e;var h=r.get(a),p=a in o;if(h===void 0&&(!p||(v=Bt(o,a))!=null&&v.writable)&&(h=l(()=>{var d=jt(p?o[a]:Q),b=le(d);return b}),r.set(a,h)),h!==void 0){var _=c(h);return _===Q?void 0:_}return Reflect.get(o,a,f)},getOwnPropertyDescriptor(o,a){var f=Reflect.getOwnPropertyDescriptor(o,a);if(f&&"value"in f){var h=r.get(a);h&&(f.value=c(h))}else if(f===void 0){var p=r.get(a),_=p==null?void 0:p.v;if(p!==void 0&&_!==Q)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return f},has(o,a){var _;if(a===Ct)return!0;var f=r.get(a),h=f!==void 0&&f.v!==Q||Reflect.has(o,a);if(f!==void 0||T!==null&&(!h||(_=Bt(o,a))!=null&&_.writable)){f===void 0&&(f=l(()=>{var v=h?jt(o[a]):Q,d=le(v);return d}),r.set(a,f));var p=c(f);if(p===Q)return!1}return h},set(o,a,f,h){var D;var p=r.get(a),_=a in o;if(n&&a==="length")for(var v=f;v<p.v;v+=1){var d=r.get(v+"");d!==void 0?N(d,Q):v in o&&(d=l(()=>le(Q)),r.set(v+"",d))}if(p===void 0)(!_||(D=Bt(o,a))!=null&&D.writable)&&(p=l(()=>le(void 0)),N(p,jt(f)),r.set(a,p));else{_=p.v!==Q;var b=l(()=>jt(f));N(p,b)}var w=Reflect.getOwnPropertyDescriptor(o,a);if(w!=null&&w.set&&w.set.call(h,f),!_){if(n&&typeof a=="string"){var y=r.get("length"),E=Number(a);Number.isInteger(E)&&E>=y.v&&N(y,E+1)}ur(i)}return!0},ownKeys(o){c(i);var a=Reflect.ownKeys(o).filter(p=>{var _=r.get(p);return _===void 0||_.v!==Q});for(var[f,h]of r)h.v!==Q&&!(f in o)&&a.push(f);return a},setPrototypeOf(){_s()}})}function Fn(e){try{if(e!==null&&typeof e=="object"&&Ct in e)return e[Ct]}catch{}return e}function Gs(e,t){return Object.is(Fn(e),Fn(t))}var Kn,Ei,Si,Ai;function Xs(){if(Kn===void 0){Kn=window,Ei=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,r=Text.prototype;Si=Bt(t,"firstChild").get,Ai=Bt(t,"nextSibling").get,qn(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),qn(r)&&(r.__t=void 0)}}function Ot(e=""){return document.createTextNode(e)}function ot(e){return Si.call(e)}function mr(e){return Ai.call(e)}function L(e,t){return ot(e)}function mt(e,t=!1){{var r=ot(e);return r instanceof Comment&&r.data===""?mr(r):r}}function M(e,t=1,r=!1){let n=e;for(;t--;)n=mr(n);return n}function Zs(e){e.textContent=""}function Ii(){return!1}function Js(e,t,r){return document.createElementNS(ai,e,void 0)}let Pn=!1;function Qs(){Pn||(Pn=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const r of e.target.elements)(t=r.__on_r)==null||t.call(r)})},{capture:!0}))}function In(e){var t=C,r=T;Ne(null),Ge(null);try{return e()}finally{Ne(t),Ge(r)}}function Ti(e,t,r,n=r){e.addEventListener(t,()=>In(r));const i=e.__on_r;i?e.__on_r=()=>{i(),n(!0)}:e.__on_r=()=>n(!0),Qs()}function el(e){T===null&&(C===null&&ds(),cs()),rt&&us()}function tl(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function nt(e,t){var r=T;r!==null&&(r.f&de)!==0&&(e|=de);var n={ctx:ke,deps:null,nodes:null,f:e|ne|Me,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};x==null||x.register_created_effect(n);var i=n;if((e&Zt)!==0)Ht!==null?Ht.push(n):Dt.ensure().schedule(n);else if(t!==null){try{tr(n)}catch(l){throw pe(n),l}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&rr)===0&&(i=i.first,(e&We)!==0&&(e&Jt)!==0&&i!==null&&(i.f|=Jt))}if(i!==null&&(i.parent=r,r!==null&&tl(i,r),C!==null&&(C.f&ae)!==0&&(e&vt)===0)){var s=C;(s.effects??(s.effects=[])).push(i)}return n}function Tn(){return C!==null&&!Fe}function Ci(e){const t=nt(Hr,null);return B(t,Z),t.teardown=e,t}function gn(e){el();var t=T.f,r=!C&&(t&Ke)!==0&&(t&zt)===0;if(r){var n=ke;(n.e??(n.e=[])).push(e)}else return Mi(e)}function Mi(e){return nt(Zt|ss,e)}function rl(e){Dt.ensure();const t=nt(vt|rr,e);return(r={})=>new Promise(n=>{r.outro?Rt(t,()=>{pe(t),n(void 0)}):(pe(t),n(void 0))})}function nl(e){return nt(Zt,e)}function il(e){return nt(cr|rr,e)}function Vr(e,t=0){return nt(Hr|t,e)}function ee(e,t=[],r=[],n=[]){$s(n,t,r,i=>{nt(Hr,()=>e(...i.map(c)))})}function Cn(e,t=0){var r=nt(We|t,e);return r}function Ce(e){return nt(Ke|rr,e)}function Ri(e){var t=e.teardown;if(t!==null){const r=rt,n=C;$n(!0),Ne(null);try{t.call(null)}finally{$n(r),Ne(n)}}}function Mn(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){const i=r.ac;i!==null&&In(()=>{i.abort(Xe)});var n=r.next;(r.f&vt)!==0?r.parent=null:pe(r,t),r=n}}function sl(e){for(var t=e.first;t!==null;){var r=t.next;(t.f&Ke)===0&&pe(t),t=r}}function pe(e,t=!0){var r=!1;(t||(e.f&is)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(ll(e.nodes.start,e.nodes.end),r=!0),B(e,un),Mn(e,t&&!r),dr(e,0);var n=e.nodes&&e.nodes.t;if(n!==null)for(const s of n)s.stop();Ri(e),e.f^=un,e.f|=xe;var i=e.parent;i!==null&&i.first!==null&&Ni(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function ll(e,t){for(;e!==null;){var r=e===t?null:mr(e);e.remove(),e=r}}function Ni(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function Rt(e,t,r=!0){var n=[];Li(e,n,!0);var i=()=>{r&&pe(e),t&&t()},s=n.length;if(s>0){var l=()=>--s||i();for(var o of n)o.out(l)}else i()}function Li(e,t,r){if((e.f&de)===0){e.f^=de;var n=e.nodes&&e.nodes.t;if(n!==null)for(const o of n)(o.is_global||r)&&t.push(o);for(var i=e.first;i!==null;){var s=i.next;if((i.f&vt)===0){var l=(i.f&Jt)!==0||(i.f&Ke)!==0&&(e.f&We)!==0;Li(i,t,l?r:!1)}i=s}}}function Rn(e){Di(e,!0)}function Di(e,t){if((e.f&de)!==0){e.f^=de,(e.f&Z)===0&&(B(e,ne),Dt.ensure().schedule(e));for(var r=e.first;r!==null;){var n=r.next,i=(r.f&Jt)!==0||(r.f&Ke)!==0;Di(r,i?t:!1),r=n}var s=e.nodes&&e.nodes.t;if(s!==null)for(const l of s)(l.is_global||t)&&l.in()}}function Nn(e,t){if(e.nodes)for(var r=e.nodes.start,n=e.nodes.end;r!==null;){var i=r===n?null:mr(r);t.append(r),r=i}}let Dr=!1,rt=!1;function $n(e){rt=e}let C=null,Fe=!1;function Ne(e){C=e}let T=null;function Ge(e){T=e}let Re=null;function qi(e){C!==null&&(Re===null?Re=[e]:Re.push(e))}let _e=null,ge=0,Se=null;function al(e){Se=e}let Oi=1,xt=0,Nt=xt;function Hn(e){Nt=e}function zi(){return++Oi}function wr(e){var t=e.f;if((t&ne)!==0)return!0;if(t&ae&&(e.f&=~Lt),(t&Ue)!==0){for(var r=e.deps,n=r.length,i=0;i<n;i++){var s=r[i];if(wr(s)&&wi(s),s.wv>e.wv)return!0}(t&Me)!==0&&re===null&&B(e,Z)}return!1}function Fi(e,t,r=!0){var n=e.reactions;if(n!==null&&!(Re!==null&&Xt.call(Re,e)))for(var i=0;i<n.length;i++){var s=n[i];(s.f&ae)!==0?Fi(s,t,!1):t===s&&(r?B(s,ne):(s.f&Z)!==0&&B(s,Ue),Sn(s))}}function Ki(e){var b;var t=_e,r=ge,n=Se,i=C,s=Re,l=ke,o=Fe,a=Nt,f=e.f;_e=null,ge=0,Se=null,C=(f&(Ke|vt))===0?e:null,Re=null,Qt(e.ctx),Fe=!1,Nt=++xt,e.ac!==null&&(In(()=>{e.ac.abort(Xe)}),e.ac=null);try{e.f|=qr;var h=e.fn,p=h();e.f|=zt;var _=e.deps,v=x==null?void 0:x.is_fork;if(_e!==null){var d;if(v||dr(e,ge),_!==null&&ge>0)for(_.length=ge+_e.length,d=0;d<_e.length;d++)_[ge+d]=_e[d];else e.deps=_=_e;if(Tn()&&(e.f&Me)!==0)for(d=ge;d<_.length;d++)((b=_[d]).reactions??(b.reactions=[])).push(e)}else!v&&_!==null&&ge<_.length&&(dr(e,ge),_.length=ge);if(ui()&&Se!==null&&!Fe&&_!==null&&(e.f&(ae|Ue|ne))===0)for(d=0;d<Se.length;d++)Fi(Se[d],e);if(i!==null&&i!==e){if(xt++,i.deps!==null)for(let w=0;w<r;w+=1)i.deps[w].rv=xt;if(t!==null)for(const w of t)w.rv=xt;Se!==null&&(n===null?n=Se:n.push(...Se))}return(e.f&dt)!==0&&(e.f^=dt),p}catch(w){return di(w)}finally{e.f^=qr,_e=t,ge=r,Se=n,C=i,Re=s,Qt(l),Fe=o,Nt=a}}function ol(e,t){let r=t.reactions;if(r!==null){var n=Zi.call(r,e);if(n!==-1){var i=r.length-1;i===0?r=t.reactions=null:(r[n]=r[i],r.pop())}}if(r===null&&(t.f&ae)!==0&&(_e===null||!Xt.call(_e,t))){var s=t;(s.f&Me)!==0&&(s.f^=Me,s.f&=~Lt),s.v!==Q&&kn(s),Vs(s),dr(s,0)}}function dr(e,t){var r=e.deps;if(r!==null)for(var n=t;n<r.length;n++)ol(e,r[n])}function tr(e){var t=e.f;if((t&xe)===0){B(e,Z);var r=T,n=Dr;T=e,Dr=!0;try{(t&(We|li))!==0?sl(e):Mn(e),Ri(e);var i=Ki(e);e.teardown=typeof i=="function"?i:null,e.wv=Oi;var s;Xi&&As&&(e.f&ne)!==0&&e.deps}finally{Dr=n,T=r}}}async function fl(){await Promise.resolve(),Ns()}function c(e){var t=e.f,r=(t&ae)!==0;if(C!==null&&!Fe){var n=T!==null&&(T.f&xe)!==0;if(!n&&(Re===null||!Xt.call(Re,e))){var i=C.deps;if((C.f&qr)!==0)e.rv<xt&&(e.rv=xt,_e===null&&i!==null&&i[ge]===e?ge++:_e===null?_e=[e]:_e.push(e));else{(C.deps??(C.deps=[])).push(e);var s=e.reactions;s===null?e.reactions=[C]:Xt.call(s,C)||s.push(C)}}}if(rt&&Mt.has(e))return Mt.get(e);if(r){var l=e;if(rt){var o=l.v;return((l.f&Z)===0&&l.reactions!==null||$i(l))&&(o=An(l)),Mt.set(l,o),o}var a=(l.f&Me)===0&&!Fe&&C!==null&&(Dr||(C.f&Me)!==0),f=(l.f&zt)===0;wr(l)&&(a&&(l.f|=Me),wi(l)),a&&!f&&(bi(l),Pi(l))}if(re!=null&&re.has(e))return re.get(e);if((e.f&dt)!==0)throw e.v;return e.v}function Pi(e){if(e.f|=Me,e.deps!==null)for(const t of e.deps)(t.reactions??(t.reactions=[])).push(e),(t.f&ae)!==0&&(t.f&Me)===0&&(bi(t),Pi(t))}function $i(e){if(e.v===Q)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(Mt.has(t)||(t.f&ae)!==0&&$i(t))return!0;return!1}function Ln(e){var t=Fe;try{return Fe=!0,e()}finally{Fe=t}}const ul=["touchstart","touchmove"];function cl(e){return ul.includes(e)}const kt=Symbol("events"),Hi=new Set,mn=new Set;function ar(e,t,r){(t[kt]??(t[kt]={}))[e]=r}function ji(e){for(var t=0;t<e.length;t++)Hi.add(e[t]);for(var r of mn)r(e)}let jn=null;function Bn(e){var w,y;var t=this,r=t.ownerDocument,n=e.type,i=((w=e.composedPath)==null?void 0:w.call(e))||[],s=i[0]||e.target;jn=e;var l=0,o=jn===e&&e[kt];if(o){var a=i.indexOf(o);if(a!==-1&&(t===document||t===window)){e[kt]=t;return}var f=i.indexOf(t);if(f===-1)return;a<=f&&(l=a)}if(s=i[l]||e.target,s!==t){Ji(e,"currentTarget",{configurable:!0,get(){return s||r}});var h=C,p=T;Ne(null),Ge(null);try{for(var _,v=[];s!==null;){var d=s.assignedSlot||s.parentNode||s.host||null;try{var b=(y=s[kt])==null?void 0:y[n];b!=null&&(!s.disabled||e.target===s)&&b.call(s,e)}catch(E){_?v.push(E):_=E}if(e.cancelBubble||d===t||d===null)break;s=d}if(_){for(let E of v)queueMicrotask(()=>{throw E});throw _}}finally{e[kt]=t,delete e.currentTarget,Ne(h),Ge(p)}}}var ti;const Xr=((ti=globalThis==null?void 0:globalThis.window)==null?void 0:ti.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function dl(e){return(Xr==null?void 0:Xr.createHTML(e))??e}function Bi(e){var t=Js("template");return t.innerHTML=dl(e.replaceAll("<!>","<!---->")),t.content}function zr(e,t){var r=T;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function Ft(e,t){var r=(t&xs)!==0,n,i=!e.startsWith("<!>");return()=>{n===void 0&&(n=Bi(i?e:"<!>"+e),n=ot(n));var s=r||Ei?document.importNode(n,!0):n.cloneNode(!0);return zr(s,s),s}}function hl(e,t,r="svg"){var n=!e.startsWith("<!>"),i=(t&bs)!==0,s=`<${r}>${n?e:"<!>"+e}</${r}>`,l;return()=>{if(!l){var o=Bi(s),a=ot(o);if(i)for(l=document.createDocumentFragment();ot(a);)l.appendChild(ot(a));else l=ot(a)}var f=l.cloneNode(!0);if(i){var h=ot(f),p=f.lastChild;zr(h,p)}else zr(f,f);return f}}function Pe(e,t){return hl(e,t,"svg")}function Zr(){var e=document.createDocumentFragment(),t=document.createComment(""),r=Ot();return e.append(t,r),zr(t,r),e}function j(e,t){e!==null&&e.before(t)}function ce(e,t){var r=t==null?"":typeof t=="object"?`${t}`:t;r!==(e.__t??(e.__t=e.nodeValue))&&(e.__t=r,e.nodeValue=`${r}`)}function vl(e,t){return _l(e,t)}const Ir=new Map;function _l(e,{target:t,anchor:r,props:n={},events:i,context:s,intro:l=!0,transformError:o}){Xs();var a=void 0,f=rl(()=>{var h=r??t.appendChild(Ot());Os(h,{pending:()=>{}},v=>{jr({});var d=ke;s&&(d.c=s),i&&(n.$$events=i),a=e(v,n)||{},Br()},o);var p=new Set,_=v=>{for(var d=0;d<v.length;d++){var b=v[d];if(!p.has(b)){p.add(b);var w=cl(b);for(const D of[t,document]){var y=Ir.get(D);y===void 0&&(y=new Map,Ir.set(D,y));var E=y.get(b);E===void 0?(D.addEventListener(b,Bn,{passive:w}),y.set(b,1)):y.set(b,E+1)}}}};return _($r(Hi)),mn.add(_),()=>{var w;for(var v of p)for(const y of[t,document]){var d=Ir.get(y),b=d.get(v);--b==0?(y.removeEventListener(v,Bn),d.delete(v),d.size===0&&Ir.delete(y)):d.set(v,b)}mn.delete(_),h!==r&&((w=h.parentNode)==null||w.removeChild(h))}});return pl.set(a,f),a}let pl=new WeakMap;var ze,Ve,be,Tt,yr,gr,Pr;class yl{constructor(t,r=!0){qe(this,"anchor");S(this,ze,new Map);S(this,Ve,new Map);S(this,be,new Map);S(this,Tt,new Set);S(this,yr,!0);S(this,gr,t=>{if(u(this,ze).has(t)){var r=u(this,ze).get(t),n=u(this,Ve).get(r);if(n)Rn(n),u(this,Tt).delete(r);else{var i=u(this,be).get(r);i&&(u(this,Ve).set(r,i.effect),u(this,be).delete(r),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),n=i.effect)}for(const[s,l]of u(this,ze)){if(u(this,ze).delete(s),s===t)break;const o=u(this,be).get(l);o&&(pe(o.effect),u(this,be).delete(l))}for(const[s,l]of u(this,Ve)){if(s===r||u(this,Tt).has(s))continue;const o=()=>{if(Array.from(u(this,ze).values()).includes(s)){var f=document.createDocumentFragment();Nn(l,f),f.append(Ot()),u(this,be).set(s,{effect:l,fragment:f})}else pe(l);u(this,Tt).delete(s),u(this,Ve).delete(s)};u(this,yr)||!n?(u(this,Tt).add(s),Rt(l,o,!1)):o()}}});S(this,Pr,t=>{u(this,ze).delete(t);const r=Array.from(u(this,ze).values());for(const[n,i]of u(this,be))r.includes(n)||(pe(i.effect),u(this,be).delete(n))});this.anchor=t,I(this,yr,r)}ensure(t,r){var n=x,i=Ii();if(r&&!u(this,Ve).has(t)&&!u(this,be).has(t))if(i){var s=document.createDocumentFragment(),l=Ot();s.append(l),u(this,be).set(t,{effect:Ce(()=>r(l)),fragment:s})}else u(this,Ve).set(t,Ce(()=>r(this.anchor)));if(u(this,ze).set(n,t),i){for(const[o,a]of u(this,Ve))o===t?n.unskip_effect(a):n.skip_effect(a);for(const[o,a]of u(this,be))o===t?n.unskip_effect(a.effect):n.skip_effect(a.effect);n.oncommit(u(this,gr)),n.ondiscard(u(this,Pr))}else u(this,gr).call(this,n)}}ze=new WeakMap,Ve=new WeakMap,be=new WeakMap,Tt=new WeakMap,yr=new WeakMap,gr=new WeakMap,Pr=new WeakMap;function lt(e,t,r=!1){var n=new yl(e),i=r?Jt:0;function s(l,o){n.ensure(l,o)}Cn(()=>{var l=!1;t((o,a=0)=>{l=!0,s(a,o)}),l||s(-1,null)},i)}function $t(e,t){return t}function gl(e,t,r){for(var n=[],i=t.length,s,l=t.length,o=0;o<i;o++){let p=t[o];Rt(p,()=>{if(s){if(s.pending.delete(p),s.done.add(p),s.pending.size===0){var _=e.outrogroups;wn(e,$r(s.done)),_.delete(s),_.size===0&&(e.outrogroups=null)}}else l-=1},!1)}if(l===0){var a=n.length===0&&r!==null;if(a){var f=r,h=f.parentNode;Zs(h),h.append(f),e.items.clear()}wn(e,t,!a)}else s={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(s)}function wn(e,t,r=!0){var n;if(e.pending.size>0){n=new Set;for(const l of e.pending.values())for(const o of l)n.add(e.items.get(o).e)}for(var i=0;i<t.length;i++){var s=t[i];if(n!=null&&n.has(s)){s.f|=tt;const l=document.createDocumentFragment();Nn(s,l)}else pe(t[i],r)}}var Yn;function wt(e,t,r,n,i,s=null){var l=e,o=new Map,a=null,f=Bs(()=>{var y=r();return ni(y)?y:y==null?[]:$r(y)}),h,p=new Map,_=!0;function v(y){(w.effect.f&xe)===0&&(w.pending.delete(y),w.fallback=a,ml(w,h,l,t,n),a!==null&&(h.length===0?(a.f&tt)===0?Rn(a):(a.f^=tt,or(a,null,l)):Rt(a,()=>{a=null})))}function d(y){w.pending.delete(y)}var b=Cn(()=>{h=c(f);for(var y=h.length,E=new Set,D=x,Le=Ii(),oe=0;oe<y;oe+=1){var Ee=h[oe],ie=n(Ee,oe),se=_?null:o.get(ie);se?(se.v&&er(se.v,Ee),se.i&&er(se.i,oe),Le&&D.unskip_effect(se.e)):(se=wl(o,_?l:Yn??(Yn=Ot()),Ee,ie,oe,i,t,r),_||(se.e.f|=tt),o.set(ie,se)),E.add(ie)}if(y===0&&s&&!a&&(_?a=Ce(()=>s(l)):(a=Ce(()=>s(Yn??(Yn=Ot()))),a.f|=tt)),y>E.size&&fs(),!_)if(p.set(D,E),Le){for(const[G,$e]of o)E.has(G)||D.skip_effect($e.e);D.oncommit(v),D.ondiscard(d)}else v(D);c(f)}),w={effect:b,items:o,pending:p,outrogroups:null,fallback:a};_=!1}function lr(e){for(;e!==null&&(e.f&Ke)===0;)e=e.next;return e}function ml(e,t,r,n,i){var se;var s=t.length,l=e.items,o=lr(e.effect.first),a,f=null,h=[],p=[],_,v,d,b;for(b=0;b<s;b+=1){if(_=t[b],v=i(_,b),d=l.get(v).e,e.outrogroups!==null)for(const G of e.outrogroups)G.pending.delete(d),G.done.delete(d);if((d.f&de)!==0&&Rn(d),(d.f&tt)!==0)if(d.f^=tt,d===o)or(d,null,r);else{var w=f?f.next:o;d===e.effect.last&&(e.effect.last=d.prev),d.prev&&(d.prev.next=d.next),d.next&&(d.next.prev=d.prev),st(e,f,d),st(e,d,w),or(d,w,r),f=d,h=[],p=[],o=lr(f.next);continue}if(d!==o){if(a!==void 0&&a.has(d)){if(h.length<p.length){var y=p[0],E;f=y.prev;var D=h[0],Le=h[h.length-1];for(E=0;E<h.length;E+=1)or(h[E],y,r);for(E=0;E<p.length;E+=1)a.delete(p[E]);st(e,D.prev,Le.next),st(e,f,D),st(e,Le,y),o=y,f=Le,b-=1,h=[],p=[]}else a.delete(d),or(d,o,r),st(e,d.prev,d.next),st(e,d,f===null?e.effect.first:f.next),st(e,f,d),f=d;continue}for(h=[],p=[];o!==null&&o!==d;)(a??(a=new Set)).add(o),p.push(o),o=lr(o.next);if(o===null)continue}(d.f&tt)===0&&h.push(d),f=d,o=lr(d.next)}if(e.outrogroups!==null){for(const G of e.outrogroups)G.pending.size===0&&(wn(e,$r(G.done)),(se=e.outrogroups)==null||se.delete(G));e.outrogroups.size===0&&(e.outrogroups=null)}if(o!==null||a!==void 0){var oe=[];if(a!==void 0)for(d of a)(d.f&de)===0&&oe.push(d);for(;o!==null;)(o.f&de)===0&&o!==e.fallback&&oe.push(o),o=lr(o.next);var Ee=oe.length;if(Ee>0){var ie=null;gl(e,oe,ie)}}}function wl(e,t,r,n,i,s,l,o){var a=(l&gs)!==0?(l&ws)===0?Ws(r,!1,!1):qt(r):null,f=(l&ms)!==0?qt(i):null;return{v:a,i:f,e:Ce(()=>(s(t,a??r,f??i,o),()=>{e.delete(n)}))}}function or(e,t,r){if(e.nodes)for(var n=e.nodes.start,i=e.nodes.end,s=t&&(t.f&tt)===0?t.nodes.start:r;n!==null;){var l=mr(n);if(s.before(n),n===i)return;n=l}}function st(e,t,r){t===null?e.effect.first=r:t.next=r,r===null?e.effect.last=t:r.prev=t}const Vn=[...` 2 + \r\f \v\uFEFF`];function bl(e,t,r){var n=e==null?"":""+e;if(r){for(var i of Object.keys(r))if(r[i])n=n?n+" "+i:i;else if(n.length)for(var s=i.length,l=0;(l=n.indexOf(i,l))>=0;){var o=l+s;(l===0||Vn.includes(n[l-1]))&&(o===n.length||Vn.includes(n[o]))?n=(l===0?"":n.substring(0,l))+n.substring(o+1):l=o}}return n===""?null:n}function Wn(e,t=!1){var r=t?" !important;":";",n="";for(var i of Object.keys(e)){var s=e[i];s!=null&&s!==""&&(n+=" "+i+": "+s+r)}return n}function xl(e,t){if(t){var r="",n,i;return Array.isArray(t)?(n=t[0],i=t[1]):n=t,n&&(r+=Wn(n)),i&&(r+=Wn(i,!0)),r=r.trim(),r===""?null:r}return String(e)}function Jr(e,t,r,n,i,s){var l=e.__className;if(l!==r||l===void 0){var o=bl(r,n,s);o==null?e.removeAttribute("class"):e.setAttribute("class",o),e.__className=r}else if(s&&i!==s)for(var a in s){var f=!!s[a];(i==null||f!==!!i[a])&&e.classList.toggle(a,f)}return s}function Qr(e,t={},r,n){for(var i in r){var s=r[i];t[i]!==s&&(r[i]==null?e.style.removeProperty(i):e.style.setProperty(i,s,n))}}function kl(e,t,r,n){var i=e.__style;if(i!==t){var s=xl(t,n);s==null?e.removeAttribute("style"):e.style.cssText=s,e.__style=t}else n&&(Array.isArray(n)?(Qr(e,r==null?void 0:r[0],n[0]),Qr(e,r==null?void 0:r[1],n[1],"important")):Qr(e,r,n));return n}const El=Symbol("is custom element"),Sl=Symbol("is html");function m(e,t,r,n){var i=Al(e);i[t]!==(i[t]=r)&&(t==="loading"&&(e[as]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Il(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function Al(e){return e.__attributes??(e.__attributes={[El]:e.nodeName.includes("-"),[Sl]:e.namespaceURI===ai})}var Un=new Map;function Il(e){var t=e.getAttribute("is")||e.nodeName,r=Un.get(t);if(r)return r;Un.set(t,r=[]);for(var n,i=e,s=Element.prototype;s!==i;){n=Qi(i);for(var l in n)n[l].set&&r.push(l);i=ii(i)}return r}function Gn(e,t,r=t){var n=new WeakSet;Ti(e,"input",async i=>{var s=i?e.defaultValue:e.value;if(s=tn(e)?rn(s):s,r(s),x!==null&&n.add(x),await fl(),s!==(s=t())){var l=e.selectionStart,o=e.selectionEnd,a=e.value.length;if(e.value=s??"",o!==null){var f=e.value.length;l===o&&o===a&&f>a?(e.selectionStart=f,e.selectionEnd=f):(e.selectionStart=l,e.selectionEnd=Math.min(o,f))}}}),Ln(t)==null&&e.value&&(r(tn(e)?rn(e.value):e.value),x!==null&&n.add(x)),Vr(()=>{var i=t();if(e===document.activeElement){var s=x;if(n.has(s))return}tn(e)&&i===rn(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i??"")})}const en=new Set;function Tl(e,t,r,n,i=n){var s=r.getAttribute("type")==="checkbox",l=e;if(t!==null)for(var o of t)l=l[o]??(l[o]=[]);l.push(r),Ti(r,"change",()=>{var a=r.__value;s&&(a=Cl(l,a,r.checked)),i(a)},()=>i(s?[]:null)),Vr(()=>{var a=n();s?(a=a||[],r.checked=a.includes(r.__value)):r.checked=Gs(r.__value,a)}),Ci(()=>{var a=l.indexOf(r);a!==-1&&l.splice(a,1)}),en.has(l)||(en.add(l),ht(()=>{l.sort((a,f)=>a.compareDocumentPosition(f)===4?-1:1),en.delete(l)})),ht(()=>{})}function Cl(e,t,r){for(var n=new Set,i=0;i<e.length;i+=1)e[i].checked&&n.add(e[i].__value);return r||n.delete(t),Array.from(n)}function tn(e){var t=e.type;return t==="number"||t==="range"}function rn(e){return e===""?null:+e}function Xn(e,t){return e===t||(e==null?void 0:e[Ct])===t}function Ml(e={},t,r,n){var i=ke.r,s=T;return nl(()=>{var l,o;return Vr(()=>{l=o,o=[],Ln(()=>{e!==r(...o)&&(t(e,...o),l&&Xn(r(...l),e)&&t(null,...l))})}),()=>{let a=s;for(;a!==i&&a.parent!==null&&a.parent.f&un;)a=a.parent;const f=()=>{o&&Xn(r(...o),e)&&t(null,...o)},h=a.teardown;a.teardown=()=>{f(),h==null||h()}}}),e}function nn(e,t,r,n){var w;var i=n,s=!0,l=()=>(s&&(s=!1,i=n),i);let o;{var a=Ct in e||ls in e;o=((w=Bt(e,t))==null?void 0:w.set)??(a&&t in e?y=>e[t]=y:void 0)}var f,h=!1;[f,h]=Cs(()=>e[t]);var p;if(p=()=>{var y=e[t];return y===void 0?l():(s=!0,y)},o){var _=e.$$legacy;return(function(y,E){return arguments.length>0?((!E||_||h)&&o(E?p():y),y):p()})}var v=!1,d=Yr(()=>(v=!1,p()));c(d);var b=T;return(function(y,E){if(arguments.length>0){const D=E?c(d):jt(y);return N(d,D),v=!0,i!==void 0&&(i=D),y}return rt&&v||(b.f&xe)!==0?d.v:c(d)})}const Rl="5";var ri;typeof window<"u"&&((ri=window.__svelte??(window.__svelte={})).v??(ri.v=new Set)).add(Rl);let Yi=0;function bn(e){return`${e}#${(++Yi).toString(16).padStart(3,"0")}`}function Nl(){Yi=0}class Ll{constructor(){this.entries=[],this.leftSubtree=null,this.firstKeyIdx=null,this.lastKeyIdx=null}isEmpty(){return this.leftSubtree===null&&this.entries.length===0}reset(){this.entries=[],this.leftSubtree=null,this.firstKeyIdx=null,this.lastKeyIdx=null}linkRecord(t,r,n){this.entries.push({key:t,recordCid:r,keyIdx:n,rightSubtree:null}),this.firstKeyIdx===null&&(this.firstKeyIdx=n),this.lastKeyIdx=n}linkSubtree(t,r,n){this.entries.length===0?this.leftSubtree=t:this.entries[this.entries.length-1].rightSubtree=t,(this.firstKeyIdx===null||r<this.firstKeyIdx)&&(this.firstKeyIdx=r),(this.lastKeyIdx===null||n>this.lastKeyIdx)&&(this.lastKeyIdx=n)}snapshot(){return{entries:this.entries.map(t=>({...t})),leftSubtree:this.leftSubtree,firstKeyIdx:this.firstKeyIdx,lastKeyIdx:this.lastKeyIdx,isEmpty:this.isEmpty()}}}function at(e,t){return{cursor:e.cursor,prevLayer:e.prevLayer,stack:e.stack.map(r=>r.snapshot()),frozen:e.frozen.slice(),event:t}}function Zn(e,t,r){const n=e.stack[t],i=e.stack[t+1];if(n.isEmpty())return[at(e,{type:r?"finalFreezeSkipEmpty":"freezeSkipEmpty",layer:t})];const s=bn(`n${t}`),l={layer:t,firstKeyIdx:n.firstKeyIdx,lastKeyIdx:n.lastKeyIdx,entries:n.entries.map(o=>({...o})),leftSubtree:n.leftSubtree,cid:s};return e.frozen.push(l),i.linkSubtree(s,n.firstKeyIdx,n.lastKeyIdx),n.reset(),[at(e,{type:r?"finalFreezeNode":"freezeNode",layer:t,cid:s,frozenRecord:l})]}function Dl(e){Nl();const t={cursor:-1,prevLayer:-1,stack:[],frozen:[]},r=[];r.push(at(t,{type:"init"}));for(let i=0;i<e.length;i++){const{key:s,layer:l}=e[i];for(t.cursor=i,r.push(at(t,{type:"read",key:s,keyLayer:l,keyIdx:i}));t.stack.length<=l;)t.stack.push(new Ll),r.push(at(t,{type:"growStack",layer:t.stack.length-1}));if(l>t.prevLayer)for(let a=0;a<l;a++)r.push(...Zn(t,a,!1));const o=bn("r");t.stack[l].linkRecord(s,o,i),r.push(at(t,{type:"linkRecord",key:s,keyLayer:l,keyIdx:i,recordCid:o})),t.prevLayer=l}t.cursor=e.length,r.push(at(t,{type:"streamEnd"}));for(let i=0;i<t.stack.length-1;i++)r.push(...Zn(t,i,!0));let n;if(t.stack.length>0){const i=t.stack.length-1,s=t.stack[i];s.isEmpty()?n="bafyreih…(empty mst)":(n=bn("root"),t.frozen.push({layer:i,firstKeyIdx:s.firstKeyIdx,lastKeyIdx:s.lastKeyIdx,entries:s.entries.map(l=>({...l})),leftSubtree:s.leftSubtree,cid:n,isRoot:!0}),s.reset())}else n="bafyreih…(empty mst)";return r.push(at(t,{type:"rootCid",rootCid:n})),r}function ql(e){switch(e.type){case"init":return"idle — stream not yet read";case"read":return`read key "${e.key}" (layer ${e.keyLayer})`;case"growStack":return`grow stack to include layer ${e.layer}`;case"freezeSkipEmpty":return`cascade: layer ${e.layer} empty — skip`;case"freezeNode":return`cascade: freeze layer ${e.layer} → CID ${e.cid}, link into layer ${e.layer+1}`;case"linkRecord":return`link record "${e.key}" into layer ${e.keyLayer} (record CID ${e.recordCid})`;case"streamEnd":return"stream end — final rollup";case"finalFreezeSkipEmpty":return`final rollup: layer ${e.layer} empty — skip`;case"finalFreezeNode":return`final rollup: freeze layer ${e.layer} → CID ${e.cid}, link into layer ${e.layer+1}`;case"rootCid":return`root CID: ${e.rootCid}`;default:return e.type}}const Ol=[{key:"aa",layer:0},{key:"ab",layer:0},{key:"ac",layer:0},{key:"ad",layer:1},{key:"ae",layer:0},{key:"af",layer:0},{key:"ag",layer:0},{key:"ah",layer:1},{key:"ai",layer:0},{key:"aj",layer:2},{key:"ak",layer:0},{key:"al",layer:0},{key:"am",layer:1},{key:"an",layer:0},{key:"ao",layer:0},{key:"ap",layer:0}],zl=[{key:"aa",layer:0},{key:"ab",layer:0},{key:"ac",layer:1},{key:"ad",layer:0},{key:"ae",layer:0}],Fl=[{key:"aa",layer:1},{key:"ab",layer:1},{key:"ac",layer:2},{key:"ad",layer:0},{key:"ae",layer:0}],sn={small:Ol,tiny:zl,emptyBottom:Fl},Kl=[42,108,0],Pl=[1,113,18,32],ln=36,Jn=4096,Qn=830,ei=1024*1024;function an(e,t){let r=0,n=1,i=t;for(;i<e.length;){const s=e[i++];if(r+=(s&127)*n,(s&128)===0){if(!Number.isSafeInteger(r))throw new Error("varint overflow");return[r,i-t]}if(n*=128,n>2**49)throw new Error("varint too long")}throw new Error("varint truncated at end of buffer")}function on(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function $l(e){const t=new Uint8Array(e);let r=0;if(t.length<3+ln+1)throw new Error("file too short to contain a STAR-lite header");for(let h=0;h<3;h++)if(t[r+h]!==Kl[h])throw new Error(`bad magic at offset 0: expected 2a 6c 00, got ${on(t.slice(0,3))}`);r+=3;const n=t.slice(r,r+ln);for(let h=0;h<4;h++)if(n[h]!==Pl[h])throw new Error(`bad CID prefix: expected 01 71 12 20, got ${on(n.slice(0,4))}`);const i=n.slice(4);r+=ln;const[s,l]=an(t,r);if(r+=l,s>Jn)throw new Error(`partial commit cbor len ${s} exceeds max ${Jn}`);if(r+s>t.length)throw new Error("truncated partial commit cbor");const o=s>0?t.slice(r,r+s):null;r+=s;const a=new TextDecoder("utf-8",{fatal:!0}),f=[];for(;r<t.length;){const[h,p]=an(t,r);if(r+=p,h>Qn)throw new Error(`record ${f.length}: key len ${h} exceeds max ${Qn}`);if(r+h>t.length)throw new Error(`record ${f.length}: truncated key`);let _;try{_=a.decode(t.slice(r,r+h))}catch{throw new Error(`record ${f.length}: key is not valid utf-8`)}r+=h;const[v,d]=an(t,r);if(r+=d,v>ei)throw new Error(`record ${f.length}: record len ${v} exceeds max ${ei}`);if(r+v>t.length)throw new Error(`record ${f.length}: truncated record body`);if(r+=v,f.length>0&&_<=f[f.length-1].key)throw new Error(`record ${f.length}: key "${_}" not in strict lex order after "${f[f.length-1].key}"`);f.push({key:_,recordSize:v})}return{headerCidDigest:i,headerCidHex:on(i),partialCommit:o,records:f}}const Hl=new TextEncoder;async function jl(e){const t=await crypto.subtle.digest("SHA-256",e);return new Uint8Array(t)}function Bl(e){let t=0;for(const r of e){if(r===0){t+=8;continue}return t+=Math.clz32(r)-24,t}return t}async function Yl(e){const t=await jl(Hl.encode(e));return Math.floor(Bl(t)/2)}async function Vl(e){return Promise.all(e.map(Yl))}var Wl=Pe('<g class="layer-bg"><text class="layer-label svelte-qc7y49"></text><line class="layer-divider svelte-qc7y49"></line></g>'),Ul=Pe('<text class="title svelte-qc7y49"> </text><text class="cid svelte-qc7y49"> </text>',1),Gl=Pe('<circle class="entry-dot svelte-qc7y49"></circle>'),Xl=Pe('<g><rect rx="5" class="svelte-qc7y49"></rect><!><!></g>'),Zl=Pe('<text class="title svelte-qc7y49"> </text><text class="cid svelte-qc7y49">building…</text>',1),Jl=Pe('<circle class="entry-dot active svelte-qc7y49"></circle>'),Ql=Pe('<g><rect rx="5" class="svelte-qc7y49"></rect><!><!></g>'),ea=Pe('<rect rx="5" class="ghost-skip svelte-qc7y49"></rect><text text-anchor="middle" class="ghost-label svelte-qc7y49">∅ skip</text>',1),ta=Pe('<text text-anchor="middle" class="key svelte-qc7y49"> </text><text text-anchor="middle" class="layer-tag svelte-qc7y49"> </text>',1),ra=Pe('<line class="layer-tick svelte-qc7y49"></line>'),na=Pe('<g><rect class="svelte-qc7y49"></rect><!></g>'),ia=Ft('<div class="viz-wrap svelte-qc7y49"><svg xmlns="http://www.w3.org/2000/svg" class="svelte-qc7y49"><!><!><!><line class="cursor svelte-qc7y49"></line><!></svg></div>');function sa(e,t){jr(t,!0);const r=24,n=28,i=16,s=18,l=56,o=10,a=16,f=1800,h=4,p=50,_=22;let v=z(()=>t.dataset.length),d=z(()=>c(v)===0?p:Math.max(h,Math.min(p,(f-2*r)/c(v)))),b=z(()=>c(d)>=_);function w(g){return r+g*c(d)}function y(g){return r+(g+1)*c(d)}function E(g){return r+g*c(d)+c(d)/2}let D=z(()=>r*2+c(v)*c(d)),Le=z(()=>Math.max(0,t.snapshot.stack.length-1,...t.snapshot.frozen.map(g=>g.layer))),oe=z(()=>t.dataset.reduce((g,k)=>Math.max(g,k.layer),0)),Ee=z(()=>Math.max(c(Le),c(oe))),ie=z(()=>a+(c(Ee)+1)*(l+o)+s),se=z(()=>c(ie)+n+i+12);function G(g){return a+(c(Ee)-g)*(l+o)}let $e=z(()=>t.snapshot.cursor<0?r:t.snapshot.cursor>=c(v)?y(c(v)-1):w(t.snapshot.cursor)),He=z(()=>{const g=t.snapshot.event;return g?g.type==="linkRecord"?{kind:"activeNode",layer:g.keyLayer}:g.type==="freezeNode"||g.type==="finalFreezeNode"?{kind:"frozenCid",cid:g.cid}:g.type==="freezeSkipEmpty"||g.type==="finalFreezeSkipEmpty"?{kind:"skipLayer",layer:g.layer}:g.type==="read"?{kind:"streamCell",idx:g.keyIdx}:null:null}),je=le(void 0);gn(()=>{if(!c(je))return;const g=c($e),k=c(je).scrollLeft,R=k+c(je).clientWidth,Y=Math.min(120,c(je).clientWidth/4);(g<k+Y||g>R-Y)&&(c(je).scrollLeft=Math.max(0,g-c(je).clientWidth/2))});const nr=["#1a1d24","#1f3550","#3a3214","#4a1e3e","#3e2c5a","#1f4a3a"];function br(g){return nr[Math.min(g,nr.length-1)]}var ir=ia(),Kt=L(ir),xr=L(Kt);wt(xr,17,()=>Array(c(Ee)+1),$t,(g,k,R)=>{var Y=Wl(),X=L(Y);m(X,"x",4),X.textContent=`L${R}`;var J=M(X);m(J,"x1",r-2),ee((F,V,P)=>{m(X,"y",F),m(J,"x2",c(D)-r+2),m(J,"y1",V),m(J,"y2",P)},[()=>G(R)+l/2+4,()=>G(R)+l+o/2,()=>G(R)+l+o/2]),j(g,Y)});var sr=M(xr);wt(sr,17,()=>t.snapshot.frozen,g=>g.cid,(g,k)=>{const R=z(()=>w(c(k).firstKeyIdx)),Y=z(()=>y(c(k).lastKeyIdx)-w(c(k).firstKeyIdx)),X=z(()=>G(c(k).layer)),J=z(()=>(c(k).leftSubtree?1:0)+c(k).entries.filter(H=>H.rightSubtree).length);var F=Xl();let V;var P=L(F);m(P,"height",l);var W=M(P);{var $=H=>{var fe=Ul(),ye=mt(fe),_t=L(ye),pt=M(ye),it=L(pt);ee(()=>{m(ye,"x",c(R)+7),m(ye,"y",c(X)+14),ce(_t,`L${c(k).layer??""} · ${c(k).entries.length??""}e${c(J)>0?` + ${c(J)}s`:""}${c(k).isRoot?" · root":""}`),m(pt,"x",c(R)+7),m(pt,"y",c(X)+28),ce(it,c(k).cid)}),j(H,fe)};lt(W,H=>{c(Y)>=60&&H($)})}var te=M(W);{var De=H=>{var fe=Zr(),ye=mt(fe);wt(ye,17,()=>c(k).entries,$t,(_t,pt)=>{var it=Gl();ee((he,yt)=>{m(it,"cx",he),m(it,"cy",c(X)+l-12),m(it,"r",yt)},[()=>E(c(pt).keyIdx),()=>Math.min(3,c(d)/3)]),j(_t,it)}),j(H,fe)};lt(te,H=>{c(d)>=8&&H(De)})}ee(()=>{var H;V=Jr(F,0,"node frozen svelte-qc7y49",null,V,{isRoot:c(k).isRoot,"pulse-cid":((H=c(He))==null?void 0:H.kind)==="frozenCid"&&c(He).cid===c(k).cid}),m(P,"x",c(R)),m(P,"y",c(X)),m(P,"width",c(Y))}),j(g,F)});var kr=M(sr);wt(kr,17,()=>t.snapshot.stack,$t,(g,k,R)=>{var Y=Zr(),X=mt(Y);{var J=V=>{const P=z(()=>w(c(k).firstKeyIdx)),W=z(()=>y(c(k).lastKeyIdx)),$=z(()=>G(R)),te=z(()=>(c(k).leftSubtree?1:0)+c(k).entries.filter(he=>he.rightSubtree).length);var De=Ql();let H;var fe=L(De);m(fe,"height",l);var ye=M(fe);{var _t=he=>{var yt=Zl(),Pt=mt(yt),Wr=L(Pt),Er=M(Pt);ee(()=>{m(Pt,"x",c(P)+7),m(Pt,"y",c($)+14),ce(Wr,`L${R} · ${c(k).entries.length??""}e${c(te)>0?` + ${c(te)}s`:""}`),m(Er,"x",c(P)+7),m(Er,"y",c($)+28)}),j(he,yt)};lt(ye,he=>{c(W)-c(P)>=60&&he(_t)})}var pt=M(ye);{var it=he=>{var yt=Zr(),Pt=mt(yt);wt(Pt,17,()=>c(k).entries,$t,(Wr,Er)=>{var Sr=Jl();ee((Vi,Wi)=>{m(Sr,"cx",Vi),m(Sr,"cy",c($)+l-12),m(Sr,"r",Wi)},[()=>E(c(Er).keyIdx),()=>Math.min(3.5,c(d)/3)]),j(Wr,Sr)}),j(he,yt)};lt(pt,he=>{c(d)>=8&&he(it)})}ee(()=>{var he;H=Jr(De,0,"node active svelte-qc7y49",null,H,{"pulse-active":((he=c(He))==null?void 0:he.kind)==="activeNode"&&c(He).layer===R}),m(fe,"x",c(P)),m(fe,"y",c($)),m(fe,"width",c(W)-c(P))}),j(V,De)},F=V=>{var P=ea(),W=mt(P);m(W,"width",56),m(W,"height",l);var $=M(W);ee((te,De)=>{m(W,"x",c($e)-28),m(W,"y",te),m($,"x",c($e)),m($,"y",De)},[()=>G(R),()=>G(R)+l/2+4]),j(V,P)};lt(X,V=>{var P;c(k).isEmpty?((P=c(He))==null?void 0:P.kind)==="skipLayer"&&c(He).layer===R&&V(F,1):V(J)})}j(g,Y)});var A=M(kr);m(A,"y1",a-4);var O=M(A);wt(O,17,()=>t.dataset,$t,(g,k,R)=>{var Y=na();let X;var J=L(Y);m(J,"height",n);var F=M(J);{var V=W=>{var $=ta(),te=mt($),De=L(te),H=M(te),fe=L(H);ee((ye,_t)=>{m(te,"x",ye),m(te,"y",c(ie)+18),ce(De,c(k).key),m(H,"x",_t),m(H,"y",c(ie)+n+12),ce(fe,`L${c(k).layer??""}`)},[()=>E(R),()=>E(R)]),j(W,$)},P=W=>{var $=ra();let te;ee((De,H,fe,ye)=>{m($,"x1",De),m($,"x2",H),m($,"y1",c(ie)+n),m($,"y2",fe),te=kl($,"",te,ye)},[()=>w(R)+c(d)/2,()=>w(R)+c(d)/2,()=>c(ie)+n+Math.min(i,4+c(k).layer*4),()=>({stroke:br(c(k).layer+1)||"#6cd0ff"})]),j(W,$)};lt(F,W=>{c(b)?W(V):c(k).layer>0&&W(P,1)})}ee((W,$)=>{var te;X=Jr(Y,0,"stream-cell svelte-qc7y49",null,X,{past:R<t.snapshot.cursor,current:R===t.snapshot.cursor,future:R>t.snapshot.cursor,"pulse-cell":((te=c(He))==null?void 0:te.kind)==="streamCell"&&c(He).idx===R}),m(J,"x",W),m(J,"y",c(ie)),m(J,"width",c(d)),m(J,"fill",$)},[()=>w(R),()=>br(c(k).layer)]),j(g,Y)}),Ml(ir,g=>N(je,g),()=>c(je)),ee(()=>{m(Kt,"width",c(D)),m(Kt,"height",c(se)),m(A,"x1",c($e)),m(A,"x2",c($e)),m(A,"y2",c(ie)+n+i+4)}),j(e,ir),Br()}var la=Ft('<div class="controls svelte-1y71c66"><button title="reset to start" class="svelte-1y71c66">⏮</button> <button title="step back" class="svelte-1y71c66">◀</button> <button class="play svelte-1y71c66"> </button> <button title="step forward" class="svelte-1y71c66">▶</button> <input class="scrub svelte-1y71c66" type="range" min="0"/> <label class="speed svelte-1y71c66">speed <input type="range" min="0.25" max="4" step="0.25" class="svelte-1y71c66"/> <span class="svelte-1y71c66"> </span></label> <span class="counter svelte-1y71c66"> </span></div>');function aa(e,t){jr(t,!0);let r=nn(t,"i"),n=nn(t,"playing"),i=nn(t,"speed");var s=la(),l=L(s),o=M(l,2),a=M(o,2),f=L(a),h=M(a,2),p=M(h,2),_=M(p,2),v=M(L(_)),d=M(v,2),b=L(d),w=M(_,2),y=L(w);ee(E=>{m(a,"title",n()?"pause":"play"),ce(f,n()?"⏸":"▶"),m(p,"max",t.total-1),ce(b,`${E??""}×`),ce(y,`${r()+1} / ${t.total??""}`)},[()=>i().toFixed(2)]),ar("click",l,function(...E){var D;(D=t.onReset)==null||D.apply(this,E)}),ar("click",o,()=>t.onStep(-1)),ar("click",a,()=>n(!n())),ar("click",h,()=>t.onStep(1)),Gn(p,r),Gn(v,i),j(e,s),Br()}ji(["click"]);var oa=Ft('<label class="svelte-1n46o8q"><input type="radio" class="svelte-1n46o8q"/> </label>'),fa=Ft('<p class="msg err svelte-1n46o8q"> </p>'),ua=Ft('<p class="msg ok svelte-1n46o8q"> </p>'),ca=Ft('<p class="msg muted svelte-1n46o8q">header CID digest: <code class="svelte-1n46o8q"> </code></p>'),da=Ft(`<main><header><h1>STAR-lite verification</h1> <p>step <span class="ev"> </span> &middot; <span class="ev"> </span> </p></header> <div class="dataset-picker svelte-1n46o8q"><!> <span class="spacer svelte-1n46o8q"></span> <label class="file-button svelte-1n46o8q"><input type="file" accept=".star,application/octet-stream" hidden=""/> load .star file…</label></div> <!> <!> <!> <!> <footer class="svelte-1n46o8q"><p class="svelte-1n46o8q">Stream is at the bottom (lex-ordered keys, layer tags below). The cursor sweeps left to 3 + right. Each MST node lives in its layer's row, spanning the keys it covers. Active 4 + (in-stack) nodes glow cyan; frozen nodes fade to gray once their CID has been linked into 5 + a parent. The final root node lights up amber.</p> <p class="svelte-1n46o8q">For loaded .star files, layers come from <code class="svelte-1n46o8q">floor(leading_zero_bits(sha256(key)) / 2)</code> (atproto MST fanout 4). 6 + Record CIDs and node CIDs in this viz are placeholders — visualizing the structure 7 + doesn't require the actual DAG-CBOR encoding step.</p> <p class="svelte-1n46o8q">Node labels: <code class="svelte-1n46o8q">Ne</code> = N direct entries (key/value pairs at this layer); <code class="svelte-1n46o8q">Ns</code> = N subtree links (left + per-entry right) into lower layers. 8 + A non-root MST node always has at least 1 entry; subtree count is bounded by <code class="svelte-1n46o8q">entries + 1</code>.</p></footer></main>`);function ha(e,t){jr(t,!0);const r=[];let n=le("small"),i=le(null),s=le(null),l=le(null),o=z(()=>c(n)==="custom"&&c(i)?c(i).dataset:sn[c(n)]),a=z(()=>Dl(c(o))),f=le(0),h=le(!1),p=le(1),_=z(()=>c(a)[Math.min(c(f),c(a).length-1)]);gn(()=>{c(n),N(f,0),N(h,!1)}),gn(()=>{if(!c(h))return;const A=Math.max(60,800/c(p)),O=setInterval(()=>{c(f)<c(a).length-1?N(f,c(f)+1):N(h,!1)},A);return()=>clearInterval(O)});function v(A){N(f,Math.max(0,Math.min(c(a).length-1,c(f)+A)),!0)}function d(){N(f,0),N(h,!1)}async function b(A){const O=A.target.files[0];if(O){N(l,null),N(s,`parsing ${O.name}…`);try{const g=await O.arrayBuffer(),k=$l(g);N(s,`computing layers for ${k.records.length} keys…`);const R=await Vl(k.records.map(F=>F.key)),Y=k.records.map((F,V)=>({key:F.key,layer:R[V]}));N(i,{label:O.name,dataset:Y,headerCidHex:k.headerCidHex},!0),N(n,"custom");const X=R.reduce((F,V)=>(F[V]=(F[V]??0)+1,F),{}),J=Object.keys(X).sort((F,V)=>+F-+V).map(F=>`L${F}:${X[F]}`).join(" ");N(s,`loaded ${O.name} — ${Y.length} keys (${J})`)}catch(g){console.error(g),N(l,`failed to load ${O.name}: ${g.message}`),N(s,null)}finally{A.target.value=""}}}let w=z(()=>[...Object.keys(sn).map(A=>({value:A,label:`${A} (${sn[A].length})`})),...c(i)?[{value:"custom",label:`${c(i).label} (${c(i).dataset.length})`}]:[]]);var y=da(),E=L(y),D=M(L(E),2),Le=M(L(D)),oe=L(Le),Ee=M(Le,2),ie=L(Ee),se=M(Ee),G=M(E,2),$e=L(G);wt($e,17,()=>c(w),$t,(A,O)=>{var g=oa(),k=L(g),R,Y=M(k);ee(()=>{R!==(R=c(O).value)&&(k.value=(k.__value=c(O).value)??""),ce(Y,` ${c(O).label??""}`)}),Tl(r,[],k,()=>(c(O).value,c(n)),X=>N(n,X)),j(A,g)});var He=M($e,4),je=L(He),nr=M(G,2);{var br=A=>{var O=fa(),g=L(O);ee(()=>ce(g,c(l))),j(A,O)},ir=A=>{var O=ua(),g=L(O);ee(()=>ce(g,c(s))),j(A,O)};lt(nr,A=>{c(l)?A(br):c(s)&&A(ir,1)})}var Kt=M(nr,2);{var xr=A=>{var O=ca(),g=M(L(O)),k=L(g);ee(()=>ce(k,c(i).headerCidHex)),j(A,O)};lt(Kt,A=>{c(n)==="custom"&&c(i)&&A(xr)})}var sr=M(Kt,2);sa(sr,{get snapshot(){return c(_)},get dataset(){return c(o)},get cursorIndex(){return c(_).cursor}});var kr=M(sr,2);aa(kr,{get total(){return c(a).length},onStep:v,onReset:d,get i(){return c(f)},set i(A){N(f,A,!0)},get playing(){return c(h)},set playing(A){N(h,A,!0)},get speed(){return c(p)},set speed(A){N(p,A,!0)}}),ee(A=>{ce(oe,`${c(f)+1} / ${c(a).length??""}`),ce(ie,c(_).event.type),ce(se,` · 9 + ${A??""}`)},[()=>ql(c(_).event)]),ar("change",je,b),j(e,y),Br()}ji(["change"]);vl(ha,{target:document.getElementById("app")});
+13
star-lite/viz/dist/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <title>STAR-lite verification viz</title> 7 + <script type="module" crossorigin src="/assets/index-DAzQMesO.js"></script> 8 + <link rel="stylesheet" crossorigin href="/assets/index-B_cDv0fH.css"> 9 + </head> 10 + <body> 11 + <div id="app"></div> 12 + </body> 13 + </html>
+12
star-lite/viz/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <title>STAR-lite verification viz</title> 7 + </head> 8 + <body> 9 + <div id="app"></div> 10 + <script type="module" src="/src/main.js"></script> 11 + </body> 12 + </html>
+1415
star-lite/viz/package-lock.json
··· 1 + { 2 + "name": "star-lite-viz", 3 + "version": "0.0.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "star-lite-viz", 9 + "version": "0.0.0", 10 + "devDependencies": { 11 + "@sveltejs/vite-plugin-svelte": "^5.0.0", 12 + "svelte": "^5.0.0", 13 + "vite": "^6.0.0" 14 + } 15 + }, 16 + "node_modules/@esbuild/aix-ppc64": { 17 + "version": "0.25.12", 18 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", 19 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 20 + "cpu": [ 21 + "ppc64" 22 + ], 23 + "dev": true, 24 + "license": "MIT", 25 + "optional": true, 26 + "os": [ 27 + "aix" 28 + ], 29 + "engines": { 30 + "node": ">=18" 31 + } 32 + }, 33 + "node_modules/@esbuild/android-arm": { 34 + "version": "0.25.12", 35 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", 36 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 37 + "cpu": [ 38 + "arm" 39 + ], 40 + "dev": true, 41 + "license": "MIT", 42 + "optional": true, 43 + "os": [ 44 + "android" 45 + ], 46 + "engines": { 47 + "node": ">=18" 48 + } 49 + }, 50 + "node_modules/@esbuild/android-arm64": { 51 + "version": "0.25.12", 52 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", 53 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 54 + "cpu": [ 55 + "arm64" 56 + ], 57 + "dev": true, 58 + "license": "MIT", 59 + "optional": true, 60 + "os": [ 61 + "android" 62 + ], 63 + "engines": { 64 + "node": ">=18" 65 + } 66 + }, 67 + "node_modules/@esbuild/android-x64": { 68 + "version": "0.25.12", 69 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", 70 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 71 + "cpu": [ 72 + "x64" 73 + ], 74 + "dev": true, 75 + "license": "MIT", 76 + "optional": true, 77 + "os": [ 78 + "android" 79 + ], 80 + "engines": { 81 + "node": ">=18" 82 + } 83 + }, 84 + "node_modules/@esbuild/darwin-arm64": { 85 + "version": "0.25.12", 86 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", 87 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 88 + "cpu": [ 89 + "arm64" 90 + ], 91 + "dev": true, 92 + "license": "MIT", 93 + "optional": true, 94 + "os": [ 95 + "darwin" 96 + ], 97 + "engines": { 98 + "node": ">=18" 99 + } 100 + }, 101 + "node_modules/@esbuild/darwin-x64": { 102 + "version": "0.25.12", 103 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", 104 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 105 + "cpu": [ 106 + "x64" 107 + ], 108 + "dev": true, 109 + "license": "MIT", 110 + "optional": true, 111 + "os": [ 112 + "darwin" 113 + ], 114 + "engines": { 115 + "node": ">=18" 116 + } 117 + }, 118 + "node_modules/@esbuild/freebsd-arm64": { 119 + "version": "0.25.12", 120 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", 121 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 122 + "cpu": [ 123 + "arm64" 124 + ], 125 + "dev": true, 126 + "license": "MIT", 127 + "optional": true, 128 + "os": [ 129 + "freebsd" 130 + ], 131 + "engines": { 132 + "node": ">=18" 133 + } 134 + }, 135 + "node_modules/@esbuild/freebsd-x64": { 136 + "version": "0.25.12", 137 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", 138 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 139 + "cpu": [ 140 + "x64" 141 + ], 142 + "dev": true, 143 + "license": "MIT", 144 + "optional": true, 145 + "os": [ 146 + "freebsd" 147 + ], 148 + "engines": { 149 + "node": ">=18" 150 + } 151 + }, 152 + "node_modules/@esbuild/linux-arm": { 153 + "version": "0.25.12", 154 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", 155 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 156 + "cpu": [ 157 + "arm" 158 + ], 159 + "dev": true, 160 + "license": "MIT", 161 + "optional": true, 162 + "os": [ 163 + "linux" 164 + ], 165 + "engines": { 166 + "node": ">=18" 167 + } 168 + }, 169 + "node_modules/@esbuild/linux-arm64": { 170 + "version": "0.25.12", 171 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", 172 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 173 + "cpu": [ 174 + "arm64" 175 + ], 176 + "dev": true, 177 + "license": "MIT", 178 + "optional": true, 179 + "os": [ 180 + "linux" 181 + ], 182 + "engines": { 183 + "node": ">=18" 184 + } 185 + }, 186 + "node_modules/@esbuild/linux-ia32": { 187 + "version": "0.25.12", 188 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", 189 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 190 + "cpu": [ 191 + "ia32" 192 + ], 193 + "dev": true, 194 + "license": "MIT", 195 + "optional": true, 196 + "os": [ 197 + "linux" 198 + ], 199 + "engines": { 200 + "node": ">=18" 201 + } 202 + }, 203 + "node_modules/@esbuild/linux-loong64": { 204 + "version": "0.25.12", 205 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", 206 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 207 + "cpu": [ 208 + "loong64" 209 + ], 210 + "dev": true, 211 + "license": "MIT", 212 + "optional": true, 213 + "os": [ 214 + "linux" 215 + ], 216 + "engines": { 217 + "node": ">=18" 218 + } 219 + }, 220 + "node_modules/@esbuild/linux-mips64el": { 221 + "version": "0.25.12", 222 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", 223 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 224 + "cpu": [ 225 + "mips64el" 226 + ], 227 + "dev": true, 228 + "license": "MIT", 229 + "optional": true, 230 + "os": [ 231 + "linux" 232 + ], 233 + "engines": { 234 + "node": ">=18" 235 + } 236 + }, 237 + "node_modules/@esbuild/linux-ppc64": { 238 + "version": "0.25.12", 239 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", 240 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 241 + "cpu": [ 242 + "ppc64" 243 + ], 244 + "dev": true, 245 + "license": "MIT", 246 + "optional": true, 247 + "os": [ 248 + "linux" 249 + ], 250 + "engines": { 251 + "node": ">=18" 252 + } 253 + }, 254 + "node_modules/@esbuild/linux-riscv64": { 255 + "version": "0.25.12", 256 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", 257 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 258 + "cpu": [ 259 + "riscv64" 260 + ], 261 + "dev": true, 262 + "license": "MIT", 263 + "optional": true, 264 + "os": [ 265 + "linux" 266 + ], 267 + "engines": { 268 + "node": ">=18" 269 + } 270 + }, 271 + "node_modules/@esbuild/linux-s390x": { 272 + "version": "0.25.12", 273 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", 274 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 275 + "cpu": [ 276 + "s390x" 277 + ], 278 + "dev": true, 279 + "license": "MIT", 280 + "optional": true, 281 + "os": [ 282 + "linux" 283 + ], 284 + "engines": { 285 + "node": ">=18" 286 + } 287 + }, 288 + "node_modules/@esbuild/linux-x64": { 289 + "version": "0.25.12", 290 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", 291 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 292 + "cpu": [ 293 + "x64" 294 + ], 295 + "dev": true, 296 + "license": "MIT", 297 + "optional": true, 298 + "os": [ 299 + "linux" 300 + ], 301 + "engines": { 302 + "node": ">=18" 303 + } 304 + }, 305 + "node_modules/@esbuild/netbsd-arm64": { 306 + "version": "0.25.12", 307 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", 308 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 309 + "cpu": [ 310 + "arm64" 311 + ], 312 + "dev": true, 313 + "license": "MIT", 314 + "optional": true, 315 + "os": [ 316 + "netbsd" 317 + ], 318 + "engines": { 319 + "node": ">=18" 320 + } 321 + }, 322 + "node_modules/@esbuild/netbsd-x64": { 323 + "version": "0.25.12", 324 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", 325 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 326 + "cpu": [ 327 + "x64" 328 + ], 329 + "dev": true, 330 + "license": "MIT", 331 + "optional": true, 332 + "os": [ 333 + "netbsd" 334 + ], 335 + "engines": { 336 + "node": ">=18" 337 + } 338 + }, 339 + "node_modules/@esbuild/openbsd-arm64": { 340 + "version": "0.25.12", 341 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", 342 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 343 + "cpu": [ 344 + "arm64" 345 + ], 346 + "dev": true, 347 + "license": "MIT", 348 + "optional": true, 349 + "os": [ 350 + "openbsd" 351 + ], 352 + "engines": { 353 + "node": ">=18" 354 + } 355 + }, 356 + "node_modules/@esbuild/openbsd-x64": { 357 + "version": "0.25.12", 358 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", 359 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 360 + "cpu": [ 361 + "x64" 362 + ], 363 + "dev": true, 364 + "license": "MIT", 365 + "optional": true, 366 + "os": [ 367 + "openbsd" 368 + ], 369 + "engines": { 370 + "node": ">=18" 371 + } 372 + }, 373 + "node_modules/@esbuild/openharmony-arm64": { 374 + "version": "0.25.12", 375 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", 376 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 377 + "cpu": [ 378 + "arm64" 379 + ], 380 + "dev": true, 381 + "license": "MIT", 382 + "optional": true, 383 + "os": [ 384 + "openharmony" 385 + ], 386 + "engines": { 387 + "node": ">=18" 388 + } 389 + }, 390 + "node_modules/@esbuild/sunos-x64": { 391 + "version": "0.25.12", 392 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", 393 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 394 + "cpu": [ 395 + "x64" 396 + ], 397 + "dev": true, 398 + "license": "MIT", 399 + "optional": true, 400 + "os": [ 401 + "sunos" 402 + ], 403 + "engines": { 404 + "node": ">=18" 405 + } 406 + }, 407 + "node_modules/@esbuild/win32-arm64": { 408 + "version": "0.25.12", 409 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", 410 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 411 + "cpu": [ 412 + "arm64" 413 + ], 414 + "dev": true, 415 + "license": "MIT", 416 + "optional": true, 417 + "os": [ 418 + "win32" 419 + ], 420 + "engines": { 421 + "node": ">=18" 422 + } 423 + }, 424 + "node_modules/@esbuild/win32-ia32": { 425 + "version": "0.25.12", 426 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", 427 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 428 + "cpu": [ 429 + "ia32" 430 + ], 431 + "dev": true, 432 + "license": "MIT", 433 + "optional": true, 434 + "os": [ 435 + "win32" 436 + ], 437 + "engines": { 438 + "node": ">=18" 439 + } 440 + }, 441 + "node_modules/@esbuild/win32-x64": { 442 + "version": "0.25.12", 443 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", 444 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 445 + "cpu": [ 446 + "x64" 447 + ], 448 + "dev": true, 449 + "license": "MIT", 450 + "optional": true, 451 + "os": [ 452 + "win32" 453 + ], 454 + "engines": { 455 + "node": ">=18" 456 + } 457 + }, 458 + "node_modules/@jridgewell/gen-mapping": { 459 + "version": "0.3.13", 460 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 461 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 462 + "dev": true, 463 + "license": "MIT", 464 + "dependencies": { 465 + "@jridgewell/sourcemap-codec": "^1.5.0", 466 + "@jridgewell/trace-mapping": "^0.3.24" 467 + } 468 + }, 469 + "node_modules/@jridgewell/remapping": { 470 + "version": "2.3.5", 471 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 472 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 473 + "dev": true, 474 + "license": "MIT", 475 + "dependencies": { 476 + "@jridgewell/gen-mapping": "^0.3.5", 477 + "@jridgewell/trace-mapping": "^0.3.24" 478 + } 479 + }, 480 + "node_modules/@jridgewell/resolve-uri": { 481 + "version": "3.1.2", 482 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 483 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 484 + "dev": true, 485 + "license": "MIT", 486 + "engines": { 487 + "node": ">=6.0.0" 488 + } 489 + }, 490 + "node_modules/@jridgewell/sourcemap-codec": { 491 + "version": "1.5.5", 492 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 493 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 494 + "dev": true, 495 + "license": "MIT" 496 + }, 497 + "node_modules/@jridgewell/trace-mapping": { 498 + "version": "0.3.31", 499 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 500 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 501 + "dev": true, 502 + "license": "MIT", 503 + "dependencies": { 504 + "@jridgewell/resolve-uri": "^3.1.0", 505 + "@jridgewell/sourcemap-codec": "^1.4.14" 506 + } 507 + }, 508 + "node_modules/@rollup/rollup-android-arm-eabi": { 509 + "version": "4.60.2", 510 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", 511 + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", 512 + "cpu": [ 513 + "arm" 514 + ], 515 + "dev": true, 516 + "license": "MIT", 517 + "optional": true, 518 + "os": [ 519 + "android" 520 + ] 521 + }, 522 + "node_modules/@rollup/rollup-android-arm64": { 523 + "version": "4.60.2", 524 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", 525 + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", 526 + "cpu": [ 527 + "arm64" 528 + ], 529 + "dev": true, 530 + "license": "MIT", 531 + "optional": true, 532 + "os": [ 533 + "android" 534 + ] 535 + }, 536 + "node_modules/@rollup/rollup-darwin-arm64": { 537 + "version": "4.60.2", 538 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", 539 + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", 540 + "cpu": [ 541 + "arm64" 542 + ], 543 + "dev": true, 544 + "license": "MIT", 545 + "optional": true, 546 + "os": [ 547 + "darwin" 548 + ] 549 + }, 550 + "node_modules/@rollup/rollup-darwin-x64": { 551 + "version": "4.60.2", 552 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", 553 + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", 554 + "cpu": [ 555 + "x64" 556 + ], 557 + "dev": true, 558 + "license": "MIT", 559 + "optional": true, 560 + "os": [ 561 + "darwin" 562 + ] 563 + }, 564 + "node_modules/@rollup/rollup-freebsd-arm64": { 565 + "version": "4.60.2", 566 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", 567 + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", 568 + "cpu": [ 569 + "arm64" 570 + ], 571 + "dev": true, 572 + "license": "MIT", 573 + "optional": true, 574 + "os": [ 575 + "freebsd" 576 + ] 577 + }, 578 + "node_modules/@rollup/rollup-freebsd-x64": { 579 + "version": "4.60.2", 580 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", 581 + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", 582 + "cpu": [ 583 + "x64" 584 + ], 585 + "dev": true, 586 + "license": "MIT", 587 + "optional": true, 588 + "os": [ 589 + "freebsd" 590 + ] 591 + }, 592 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 593 + "version": "4.60.2", 594 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", 595 + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", 596 + "cpu": [ 597 + "arm" 598 + ], 599 + "dev": true, 600 + "license": "MIT", 601 + "optional": true, 602 + "os": [ 603 + "linux" 604 + ] 605 + }, 606 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 607 + "version": "4.60.2", 608 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", 609 + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", 610 + "cpu": [ 611 + "arm" 612 + ], 613 + "dev": true, 614 + "license": "MIT", 615 + "optional": true, 616 + "os": [ 617 + "linux" 618 + ] 619 + }, 620 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 621 + "version": "4.60.2", 622 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", 623 + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", 624 + "cpu": [ 625 + "arm64" 626 + ], 627 + "dev": true, 628 + "license": "MIT", 629 + "optional": true, 630 + "os": [ 631 + "linux" 632 + ] 633 + }, 634 + "node_modules/@rollup/rollup-linux-arm64-musl": { 635 + "version": "4.60.2", 636 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", 637 + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", 638 + "cpu": [ 639 + "arm64" 640 + ], 641 + "dev": true, 642 + "license": "MIT", 643 + "optional": true, 644 + "os": [ 645 + "linux" 646 + ] 647 + }, 648 + "node_modules/@rollup/rollup-linux-loong64-gnu": { 649 + "version": "4.60.2", 650 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", 651 + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", 652 + "cpu": [ 653 + "loong64" 654 + ], 655 + "dev": true, 656 + "license": "MIT", 657 + "optional": true, 658 + "os": [ 659 + "linux" 660 + ] 661 + }, 662 + "node_modules/@rollup/rollup-linux-loong64-musl": { 663 + "version": "4.60.2", 664 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", 665 + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", 666 + "cpu": [ 667 + "loong64" 668 + ], 669 + "dev": true, 670 + "license": "MIT", 671 + "optional": true, 672 + "os": [ 673 + "linux" 674 + ] 675 + }, 676 + "node_modules/@rollup/rollup-linux-ppc64-gnu": { 677 + "version": "4.60.2", 678 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", 679 + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", 680 + "cpu": [ 681 + "ppc64" 682 + ], 683 + "dev": true, 684 + "license": "MIT", 685 + "optional": true, 686 + "os": [ 687 + "linux" 688 + ] 689 + }, 690 + "node_modules/@rollup/rollup-linux-ppc64-musl": { 691 + "version": "4.60.2", 692 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", 693 + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", 694 + "cpu": [ 695 + "ppc64" 696 + ], 697 + "dev": true, 698 + "license": "MIT", 699 + "optional": true, 700 + "os": [ 701 + "linux" 702 + ] 703 + }, 704 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 705 + "version": "4.60.2", 706 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", 707 + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", 708 + "cpu": [ 709 + "riscv64" 710 + ], 711 + "dev": true, 712 + "license": "MIT", 713 + "optional": true, 714 + "os": [ 715 + "linux" 716 + ] 717 + }, 718 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 719 + "version": "4.60.2", 720 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", 721 + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", 722 + "cpu": [ 723 + "riscv64" 724 + ], 725 + "dev": true, 726 + "license": "MIT", 727 + "optional": true, 728 + "os": [ 729 + "linux" 730 + ] 731 + }, 732 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 733 + "version": "4.60.2", 734 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", 735 + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", 736 + "cpu": [ 737 + "s390x" 738 + ], 739 + "dev": true, 740 + "license": "MIT", 741 + "optional": true, 742 + "os": [ 743 + "linux" 744 + ] 745 + }, 746 + "node_modules/@rollup/rollup-linux-x64-gnu": { 747 + "version": "4.60.2", 748 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", 749 + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", 750 + "cpu": [ 751 + "x64" 752 + ], 753 + "dev": true, 754 + "license": "MIT", 755 + "optional": true, 756 + "os": [ 757 + "linux" 758 + ] 759 + }, 760 + "node_modules/@rollup/rollup-linux-x64-musl": { 761 + "version": "4.60.2", 762 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", 763 + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", 764 + "cpu": [ 765 + "x64" 766 + ], 767 + "dev": true, 768 + "license": "MIT", 769 + "optional": true, 770 + "os": [ 771 + "linux" 772 + ] 773 + }, 774 + "node_modules/@rollup/rollup-openbsd-x64": { 775 + "version": "4.60.2", 776 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", 777 + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", 778 + "cpu": [ 779 + "x64" 780 + ], 781 + "dev": true, 782 + "license": "MIT", 783 + "optional": true, 784 + "os": [ 785 + "openbsd" 786 + ] 787 + }, 788 + "node_modules/@rollup/rollup-openharmony-arm64": { 789 + "version": "4.60.2", 790 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", 791 + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", 792 + "cpu": [ 793 + "arm64" 794 + ], 795 + "dev": true, 796 + "license": "MIT", 797 + "optional": true, 798 + "os": [ 799 + "openharmony" 800 + ] 801 + }, 802 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 803 + "version": "4.60.2", 804 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", 805 + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", 806 + "cpu": [ 807 + "arm64" 808 + ], 809 + "dev": true, 810 + "license": "MIT", 811 + "optional": true, 812 + "os": [ 813 + "win32" 814 + ] 815 + }, 816 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 817 + "version": "4.60.2", 818 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", 819 + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", 820 + "cpu": [ 821 + "ia32" 822 + ], 823 + "dev": true, 824 + "license": "MIT", 825 + "optional": true, 826 + "os": [ 827 + "win32" 828 + ] 829 + }, 830 + "node_modules/@rollup/rollup-win32-x64-gnu": { 831 + "version": "4.60.2", 832 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", 833 + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", 834 + "cpu": [ 835 + "x64" 836 + ], 837 + "dev": true, 838 + "license": "MIT", 839 + "optional": true, 840 + "os": [ 841 + "win32" 842 + ] 843 + }, 844 + "node_modules/@rollup/rollup-win32-x64-msvc": { 845 + "version": "4.60.2", 846 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", 847 + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", 848 + "cpu": [ 849 + "x64" 850 + ], 851 + "dev": true, 852 + "license": "MIT", 853 + "optional": true, 854 + "os": [ 855 + "win32" 856 + ] 857 + }, 858 + "node_modules/@sveltejs/acorn-typescript": { 859 + "version": "1.0.9", 860 + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", 861 + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", 862 + "dev": true, 863 + "license": "MIT", 864 + "peerDependencies": { 865 + "acorn": "^8.9.0" 866 + } 867 + }, 868 + "node_modules/@sveltejs/vite-plugin-svelte": { 869 + "version": "5.1.1", 870 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", 871 + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", 872 + "dev": true, 873 + "license": "MIT", 874 + "dependencies": { 875 + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", 876 + "debug": "^4.4.1", 877 + "deepmerge": "^4.3.1", 878 + "kleur": "^4.1.5", 879 + "magic-string": "^0.30.17", 880 + "vitefu": "^1.0.6" 881 + }, 882 + "engines": { 883 + "node": "^18.0.0 || ^20.0.0 || >=22" 884 + }, 885 + "peerDependencies": { 886 + "svelte": "^5.0.0", 887 + "vite": "^6.0.0" 888 + } 889 + }, 890 + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 891 + "version": "4.0.1", 892 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", 893 + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", 894 + "dev": true, 895 + "license": "MIT", 896 + "dependencies": { 897 + "debug": "^4.3.7" 898 + }, 899 + "engines": { 900 + "node": "^18.0.0 || ^20.0.0 || >=22" 901 + }, 902 + "peerDependencies": { 903 + "@sveltejs/vite-plugin-svelte": "^5.0.0", 904 + "svelte": "^5.0.0", 905 + "vite": "^6.0.0" 906 + } 907 + }, 908 + "node_modules/@types/estree": { 909 + "version": "1.0.8", 910 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 911 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 912 + "dev": true, 913 + "license": "MIT" 914 + }, 915 + "node_modules/@types/trusted-types": { 916 + "version": "2.0.7", 917 + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", 918 + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", 919 + "dev": true, 920 + "license": "MIT" 921 + }, 922 + "node_modules/acorn": { 923 + "version": "8.16.0", 924 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", 925 + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", 926 + "dev": true, 927 + "license": "MIT", 928 + "bin": { 929 + "acorn": "bin/acorn" 930 + }, 931 + "engines": { 932 + "node": ">=0.4.0" 933 + } 934 + }, 935 + "node_modules/aria-query": { 936 + "version": "5.3.1", 937 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", 938 + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", 939 + "dev": true, 940 + "license": "Apache-2.0", 941 + "engines": { 942 + "node": ">= 0.4" 943 + } 944 + }, 945 + "node_modules/axobject-query": { 946 + "version": "4.1.0", 947 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 948 + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 949 + "dev": true, 950 + "license": "Apache-2.0", 951 + "engines": { 952 + "node": ">= 0.4" 953 + } 954 + }, 955 + "node_modules/clsx": { 956 + "version": "2.1.1", 957 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 958 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 959 + "dev": true, 960 + "license": "MIT", 961 + "engines": { 962 + "node": ">=6" 963 + } 964 + }, 965 + "node_modules/debug": { 966 + "version": "4.4.3", 967 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 968 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 969 + "dev": true, 970 + "license": "MIT", 971 + "dependencies": { 972 + "ms": "^2.1.3" 973 + }, 974 + "engines": { 975 + "node": ">=6.0" 976 + }, 977 + "peerDependenciesMeta": { 978 + "supports-color": { 979 + "optional": true 980 + } 981 + } 982 + }, 983 + "node_modules/deepmerge": { 984 + "version": "4.3.1", 985 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 986 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 987 + "dev": true, 988 + "license": "MIT", 989 + "engines": { 990 + "node": ">=0.10.0" 991 + } 992 + }, 993 + "node_modules/devalue": { 994 + "version": "5.7.1", 995 + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", 996 + "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", 997 + "dev": true, 998 + "license": "MIT" 999 + }, 1000 + "node_modules/esbuild": { 1001 + "version": "0.25.12", 1002 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", 1003 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 1004 + "dev": true, 1005 + "hasInstallScript": true, 1006 + "license": "MIT", 1007 + "bin": { 1008 + "esbuild": "bin/esbuild" 1009 + }, 1010 + "engines": { 1011 + "node": ">=18" 1012 + }, 1013 + "optionalDependencies": { 1014 + "@esbuild/aix-ppc64": "0.25.12", 1015 + "@esbuild/android-arm": "0.25.12", 1016 + "@esbuild/android-arm64": "0.25.12", 1017 + "@esbuild/android-x64": "0.25.12", 1018 + "@esbuild/darwin-arm64": "0.25.12", 1019 + "@esbuild/darwin-x64": "0.25.12", 1020 + "@esbuild/freebsd-arm64": "0.25.12", 1021 + "@esbuild/freebsd-x64": "0.25.12", 1022 + "@esbuild/linux-arm": "0.25.12", 1023 + "@esbuild/linux-arm64": "0.25.12", 1024 + "@esbuild/linux-ia32": "0.25.12", 1025 + "@esbuild/linux-loong64": "0.25.12", 1026 + "@esbuild/linux-mips64el": "0.25.12", 1027 + "@esbuild/linux-ppc64": "0.25.12", 1028 + "@esbuild/linux-riscv64": "0.25.12", 1029 + "@esbuild/linux-s390x": "0.25.12", 1030 + "@esbuild/linux-x64": "0.25.12", 1031 + "@esbuild/netbsd-arm64": "0.25.12", 1032 + "@esbuild/netbsd-x64": "0.25.12", 1033 + "@esbuild/openbsd-arm64": "0.25.12", 1034 + "@esbuild/openbsd-x64": "0.25.12", 1035 + "@esbuild/openharmony-arm64": "0.25.12", 1036 + "@esbuild/sunos-x64": "0.25.12", 1037 + "@esbuild/win32-arm64": "0.25.12", 1038 + "@esbuild/win32-ia32": "0.25.12", 1039 + "@esbuild/win32-x64": "0.25.12" 1040 + } 1041 + }, 1042 + "node_modules/esm-env": { 1043 + "version": "1.2.2", 1044 + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", 1045 + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", 1046 + "dev": true, 1047 + "license": "MIT" 1048 + }, 1049 + "node_modules/esrap": { 1050 + "version": "2.2.5", 1051 + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.5.tgz", 1052 + "integrity": "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==", 1053 + "dev": true, 1054 + "license": "MIT", 1055 + "dependencies": { 1056 + "@jridgewell/sourcemap-codec": "^1.4.15" 1057 + }, 1058 + "peerDependencies": { 1059 + "@typescript-eslint/types": "^8.2.0" 1060 + }, 1061 + "peerDependenciesMeta": { 1062 + "@typescript-eslint/types": { 1063 + "optional": true 1064 + } 1065 + } 1066 + }, 1067 + "node_modules/fdir": { 1068 + "version": "6.5.0", 1069 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 1070 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 1071 + "dev": true, 1072 + "license": "MIT", 1073 + "engines": { 1074 + "node": ">=12.0.0" 1075 + }, 1076 + "peerDependencies": { 1077 + "picomatch": "^3 || ^4" 1078 + }, 1079 + "peerDependenciesMeta": { 1080 + "picomatch": { 1081 + "optional": true 1082 + } 1083 + } 1084 + }, 1085 + "node_modules/fsevents": { 1086 + "version": "2.3.3", 1087 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1088 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1089 + "dev": true, 1090 + "hasInstallScript": true, 1091 + "license": "MIT", 1092 + "optional": true, 1093 + "os": [ 1094 + "darwin" 1095 + ], 1096 + "engines": { 1097 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1098 + } 1099 + }, 1100 + "node_modules/is-reference": { 1101 + "version": "3.0.3", 1102 + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", 1103 + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 1104 + "dev": true, 1105 + "license": "MIT", 1106 + "dependencies": { 1107 + "@types/estree": "^1.0.6" 1108 + } 1109 + }, 1110 + "node_modules/kleur": { 1111 + "version": "4.1.5", 1112 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1113 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1114 + "dev": true, 1115 + "license": "MIT", 1116 + "engines": { 1117 + "node": ">=6" 1118 + } 1119 + }, 1120 + "node_modules/locate-character": { 1121 + "version": "3.0.0", 1122 + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1123 + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1124 + "dev": true, 1125 + "license": "MIT" 1126 + }, 1127 + "node_modules/magic-string": { 1128 + "version": "0.30.21", 1129 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 1130 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 1131 + "dev": true, 1132 + "license": "MIT", 1133 + "dependencies": { 1134 + "@jridgewell/sourcemap-codec": "^1.5.5" 1135 + } 1136 + }, 1137 + "node_modules/ms": { 1138 + "version": "2.1.3", 1139 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1140 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1141 + "dev": true, 1142 + "license": "MIT" 1143 + }, 1144 + "node_modules/nanoid": { 1145 + "version": "3.3.11", 1146 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1147 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1148 + "dev": true, 1149 + "funding": [ 1150 + { 1151 + "type": "github", 1152 + "url": "https://github.com/sponsors/ai" 1153 + } 1154 + ], 1155 + "license": "MIT", 1156 + "bin": { 1157 + "nanoid": "bin/nanoid.cjs" 1158 + }, 1159 + "engines": { 1160 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1161 + } 1162 + }, 1163 + "node_modules/picocolors": { 1164 + "version": "1.1.1", 1165 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1166 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1167 + "dev": true, 1168 + "license": "ISC" 1169 + }, 1170 + "node_modules/picomatch": { 1171 + "version": "4.0.4", 1172 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", 1173 + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", 1174 + "dev": true, 1175 + "license": "MIT", 1176 + "engines": { 1177 + "node": ">=12" 1178 + }, 1179 + "funding": { 1180 + "url": "https://github.com/sponsors/jonschlinkert" 1181 + } 1182 + }, 1183 + "node_modules/postcss": { 1184 + "version": "8.5.12", 1185 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", 1186 + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", 1187 + "dev": true, 1188 + "funding": [ 1189 + { 1190 + "type": "opencollective", 1191 + "url": "https://opencollective.com/postcss/" 1192 + }, 1193 + { 1194 + "type": "tidelift", 1195 + "url": "https://tidelift.com/funding/github/npm/postcss" 1196 + }, 1197 + { 1198 + "type": "github", 1199 + "url": "https://github.com/sponsors/ai" 1200 + } 1201 + ], 1202 + "license": "MIT", 1203 + "dependencies": { 1204 + "nanoid": "^3.3.11", 1205 + "picocolors": "^1.1.1", 1206 + "source-map-js": "^1.2.1" 1207 + }, 1208 + "engines": { 1209 + "node": "^10 || ^12 || >=14" 1210 + } 1211 + }, 1212 + "node_modules/rollup": { 1213 + "version": "4.60.2", 1214 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", 1215 + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", 1216 + "dev": true, 1217 + "license": "MIT", 1218 + "dependencies": { 1219 + "@types/estree": "1.0.8" 1220 + }, 1221 + "bin": { 1222 + "rollup": "dist/bin/rollup" 1223 + }, 1224 + "engines": { 1225 + "node": ">=18.0.0", 1226 + "npm": ">=8.0.0" 1227 + }, 1228 + "optionalDependencies": { 1229 + "@rollup/rollup-android-arm-eabi": "4.60.2", 1230 + "@rollup/rollup-android-arm64": "4.60.2", 1231 + "@rollup/rollup-darwin-arm64": "4.60.2", 1232 + "@rollup/rollup-darwin-x64": "4.60.2", 1233 + "@rollup/rollup-freebsd-arm64": "4.60.2", 1234 + "@rollup/rollup-freebsd-x64": "4.60.2", 1235 + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", 1236 + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", 1237 + "@rollup/rollup-linux-arm64-gnu": "4.60.2", 1238 + "@rollup/rollup-linux-arm64-musl": "4.60.2", 1239 + "@rollup/rollup-linux-loong64-gnu": "4.60.2", 1240 + "@rollup/rollup-linux-loong64-musl": "4.60.2", 1241 + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", 1242 + "@rollup/rollup-linux-ppc64-musl": "4.60.2", 1243 + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", 1244 + "@rollup/rollup-linux-riscv64-musl": "4.60.2", 1245 + "@rollup/rollup-linux-s390x-gnu": "4.60.2", 1246 + "@rollup/rollup-linux-x64-gnu": "4.60.2", 1247 + "@rollup/rollup-linux-x64-musl": "4.60.2", 1248 + "@rollup/rollup-openbsd-x64": "4.60.2", 1249 + "@rollup/rollup-openharmony-arm64": "4.60.2", 1250 + "@rollup/rollup-win32-arm64-msvc": "4.60.2", 1251 + "@rollup/rollup-win32-ia32-msvc": "4.60.2", 1252 + "@rollup/rollup-win32-x64-gnu": "4.60.2", 1253 + "@rollup/rollup-win32-x64-msvc": "4.60.2", 1254 + "fsevents": "~2.3.2" 1255 + } 1256 + }, 1257 + "node_modules/source-map-js": { 1258 + "version": "1.2.1", 1259 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1260 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1261 + "dev": true, 1262 + "license": "BSD-3-Clause", 1263 + "engines": { 1264 + "node": ">=0.10.0" 1265 + } 1266 + }, 1267 + "node_modules/svelte": { 1268 + "version": "5.55.5", 1269 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.5.tgz", 1270 + "integrity": "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==", 1271 + "dev": true, 1272 + "license": "MIT", 1273 + "dependencies": { 1274 + "@jridgewell/remapping": "^2.3.4", 1275 + "@jridgewell/sourcemap-codec": "^1.5.0", 1276 + "@sveltejs/acorn-typescript": "^1.0.5", 1277 + "@types/estree": "^1.0.5", 1278 + "@types/trusted-types": "^2.0.7", 1279 + "acorn": "^8.12.1", 1280 + "aria-query": "5.3.1", 1281 + "axobject-query": "^4.1.0", 1282 + "clsx": "^2.1.1", 1283 + "devalue": "^5.6.4", 1284 + "esm-env": "^1.2.1", 1285 + "esrap": "^2.2.4", 1286 + "is-reference": "^3.0.3", 1287 + "locate-character": "^3.0.0", 1288 + "magic-string": "^0.30.11", 1289 + "zimmerframe": "^1.1.2" 1290 + }, 1291 + "engines": { 1292 + "node": ">=18" 1293 + } 1294 + }, 1295 + "node_modules/tinyglobby": { 1296 + "version": "0.2.16", 1297 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", 1298 + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", 1299 + "dev": true, 1300 + "license": "MIT", 1301 + "dependencies": { 1302 + "fdir": "^6.5.0", 1303 + "picomatch": "^4.0.4" 1304 + }, 1305 + "engines": { 1306 + "node": ">=12.0.0" 1307 + }, 1308 + "funding": { 1309 + "url": "https://github.com/sponsors/SuperchupuDev" 1310 + } 1311 + }, 1312 + "node_modules/vite": { 1313 + "version": "6.4.2", 1314 + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", 1315 + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", 1316 + "dev": true, 1317 + "license": "MIT", 1318 + "dependencies": { 1319 + "esbuild": "^0.25.0", 1320 + "fdir": "^6.4.4", 1321 + "picomatch": "^4.0.2", 1322 + "postcss": "^8.5.3", 1323 + "rollup": "^4.34.9", 1324 + "tinyglobby": "^0.2.13" 1325 + }, 1326 + "bin": { 1327 + "vite": "bin/vite.js" 1328 + }, 1329 + "engines": { 1330 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1331 + }, 1332 + "funding": { 1333 + "url": "https://github.com/vitejs/vite?sponsor=1" 1334 + }, 1335 + "optionalDependencies": { 1336 + "fsevents": "~2.3.3" 1337 + }, 1338 + "peerDependencies": { 1339 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1340 + "jiti": ">=1.21.0", 1341 + "less": "*", 1342 + "lightningcss": "^1.21.0", 1343 + "sass": "*", 1344 + "sass-embedded": "*", 1345 + "stylus": "*", 1346 + "sugarss": "*", 1347 + "terser": "^5.16.0", 1348 + "tsx": "^4.8.1", 1349 + "yaml": "^2.4.2" 1350 + }, 1351 + "peerDependenciesMeta": { 1352 + "@types/node": { 1353 + "optional": true 1354 + }, 1355 + "jiti": { 1356 + "optional": true 1357 + }, 1358 + "less": { 1359 + "optional": true 1360 + }, 1361 + "lightningcss": { 1362 + "optional": true 1363 + }, 1364 + "sass": { 1365 + "optional": true 1366 + }, 1367 + "sass-embedded": { 1368 + "optional": true 1369 + }, 1370 + "stylus": { 1371 + "optional": true 1372 + }, 1373 + "sugarss": { 1374 + "optional": true 1375 + }, 1376 + "terser": { 1377 + "optional": true 1378 + }, 1379 + "tsx": { 1380 + "optional": true 1381 + }, 1382 + "yaml": { 1383 + "optional": true 1384 + } 1385 + } 1386 + }, 1387 + "node_modules/vitefu": { 1388 + "version": "1.1.3", 1389 + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", 1390 + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", 1391 + "dev": true, 1392 + "license": "MIT", 1393 + "workspaces": [ 1394 + "tests/deps/*", 1395 + "tests/projects/*", 1396 + "tests/projects/workspace/packages/*" 1397 + ], 1398 + "peerDependencies": { 1399 + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" 1400 + }, 1401 + "peerDependenciesMeta": { 1402 + "vite": { 1403 + "optional": true 1404 + } 1405 + } 1406 + }, 1407 + "node_modules/zimmerframe": { 1408 + "version": "1.1.4", 1409 + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", 1410 + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", 1411 + "dev": true, 1412 + "license": "MIT" 1413 + } 1414 + } 1415 + }
+16
star-lite/viz/package.json
··· 1 + { 2 + "name": "star-lite-viz", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "vite build", 9 + "preview": "vite preview" 10 + }, 11 + "devDependencies": { 12 + "@sveltejs/vite-plugin-svelte": "^5.0.0", 13 + "svelte": "^5.0.0", 14 + "vite": "^6.0.0" 15 + } 16 + }
+215
star-lite/viz/src/App.svelte
··· 1 + <script> 2 + import { computeSnapshots, describeEvent } from './lib/algorithm.js'; 3 + import { demos } from './lib/dataset.js'; 4 + import { parseStarLite } from './lib/star.js'; 5 + import { computeMstLayers } from './lib/mst.js'; 6 + import Viz from './components/Viz.svelte'; 7 + import Controls from './components/Controls.svelte'; 8 + 9 + let datasetName = $state('small'); 10 + let customDataset = $state(null); // { label, dataset, headerCidHex } | null 11 + let loadingMessage = $state(null); 12 + let loadingError = $state(null); 13 + 14 + let dataset = $derived( 15 + datasetName === 'custom' && customDataset ? customDataset.dataset : demos[datasetName], 16 + ); 17 + let snapshots = $derived(computeSnapshots(dataset)); 18 + 19 + let i = $state(0); 20 + let playing = $state(false); 21 + let speed = $state(1); 22 + 23 + let snap = $derived(snapshots[Math.min(i, snapshots.length - 1)]); 24 + 25 + // reset when dataset changes 26 + $effect(() => { 27 + datasetName; 28 + i = 0; 29 + playing = false; 30 + }); 31 + 32 + // play loop 33 + $effect(() => { 34 + if (!playing) return; 35 + const ms = Math.max(60, 800 / speed); 36 + const handle = setInterval(() => { 37 + if (i < snapshots.length - 1) { 38 + i = i + 1; 39 + } else { 40 + playing = false; 41 + } 42 + }, ms); 43 + return () => clearInterval(handle); 44 + }); 45 + 46 + function step(d) { 47 + i = Math.max(0, Math.min(snapshots.length - 1, i + d)); 48 + } 49 + function reset() { 50 + i = 0; 51 + playing = false; 52 + } 53 + 54 + async function onFileSelected(e) { 55 + const file = e.target.files[0]; 56 + if (!file) return; 57 + loadingError = null; 58 + loadingMessage = `parsing ${file.name}…`; 59 + try { 60 + const buf = await file.arrayBuffer(); 61 + const parsed = parseStarLite(buf); 62 + loadingMessage = `computing layers for ${parsed.records.length} keys…`; 63 + const layers = await computeMstLayers(parsed.records.map((r) => r.key)); 64 + const dataset = parsed.records.map((r, idx) => ({ key: r.key, layer: layers[idx] })); 65 + customDataset = { 66 + label: file.name, 67 + dataset, 68 + headerCidHex: parsed.headerCidHex, 69 + }; 70 + datasetName = 'custom'; 71 + const layerHisto = layers.reduce((m, L) => ((m[L] = (m[L] ?? 0) + 1), m), {}); 72 + const histoStr = Object.keys(layerHisto) 73 + .sort((a, b) => +a - +b) 74 + .map((L) => `L${L}:${layerHisto[L]}`) 75 + .join(' '); 76 + loadingMessage = `loaded ${file.name} — ${dataset.length} keys (${histoStr})`; 77 + } catch (err) { 78 + console.error(err); 79 + loadingError = `failed to load ${file.name}: ${err.message}`; 80 + loadingMessage = null; 81 + } finally { 82 + e.target.value = ''; 83 + } 84 + } 85 + 86 + let pickerEntries = $derived([ 87 + ...Object.keys(demos).map((name) => ({ 88 + value: name, 89 + label: `${name} (${demos[name].length})`, 90 + })), 91 + ...(customDataset 92 + ? [{ value: 'custom', label: `${customDataset.label} (${customDataset.dataset.length})` }] 93 + : []), 94 + ]); 95 + </script> 96 + 97 + <main> 98 + <header> 99 + <h1>STAR-lite verification</h1> 100 + <p> 101 + step <span class="ev">{i + 1} / {snapshots.length}</span> &middot; 102 + <span class="ev">{snap.event.type}</span> &middot; 103 + {describeEvent(snap.event)} 104 + </p> 105 + </header> 106 + 107 + <div class="dataset-picker"> 108 + {#each pickerEntries as entry} 109 + <label> 110 + <input type="radio" bind:group={datasetName} value={entry.value} /> 111 + {entry.label} 112 + </label> 113 + {/each} 114 + <span class="spacer"></span> 115 + <label class="file-button"> 116 + <input type="file" accept=".star,application/octet-stream" onchange={onFileSelected} hidden /> 117 + load .star file… 118 + </label> 119 + </div> 120 + 121 + {#if loadingError} 122 + <p class="msg err">{loadingError}</p> 123 + {:else if loadingMessage} 124 + <p class="msg ok">{loadingMessage}</p> 125 + {/if} 126 + 127 + {#if datasetName === 'custom' && customDataset} 128 + <p class="msg muted">header CID digest: <code>{customDataset.headerCidHex}</code></p> 129 + {/if} 130 + 131 + <Viz snapshot={snap} {dataset} cursorIndex={snap.cursor} /> 132 + 133 + <Controls 134 + bind:i 135 + bind:playing 136 + bind:speed 137 + total={snapshots.length} 138 + onStep={step} 139 + onReset={reset} 140 + /> 141 + 142 + <footer> 143 + <p> 144 + Stream is at the bottom (lex-ordered keys, layer tags below). The cursor sweeps left to 145 + right. Each MST node lives in its layer's row, spanning the keys it covers. Active 146 + (in-stack) nodes glow cyan; frozen nodes fade to gray once their CID has been linked into 147 + a parent. The final root node lights up amber. 148 + </p> 149 + <p> 150 + For loaded .star files, layers come from <code>floor(leading_zero_bits(sha256(key)) / 2)</code> (atproto MST fanout 4). 151 + Record CIDs and node CIDs in this viz are placeholders — visualizing the structure 152 + doesn't require the actual DAG-CBOR encoding step. 153 + </p> 154 + <p> 155 + Node labels: <code>Ne</code> = N direct entries (key/value pairs at this layer); 156 + <code>Ns</code> = N subtree links (left + per-entry right) into lower layers. 157 + A non-root MST node always has at least 1 entry; subtree count is bounded by 158 + <code>entries + 1</code>. 159 + </p> 160 + </footer> 161 + </main> 162 + 163 + <style> 164 + .dataset-picker { 165 + display: flex; 166 + gap: 14px; 167 + margin-bottom: 8px; 168 + color: #8a93a3; 169 + font-size: 13px; 170 + flex-wrap: wrap; 171 + align-items: center; 172 + } 173 + .dataset-picker label { 174 + display: flex; 175 + gap: 5px; 176 + align-items: center; 177 + cursor: pointer; 178 + } 179 + .dataset-picker input[type='radio'] { accent-color: #6cd0ff; } 180 + .dataset-picker .spacer { flex: 1; } 181 + .file-button { 182 + background: #1f2530; 183 + color: #d4d8e0; 184 + border: 1px solid #2a3140; 185 + padding: 6px 10px; 186 + border-radius: 4px; 187 + cursor: pointer; 188 + font-size: 12px; 189 + } 190 + .file-button:hover { background: #2a3140; } 191 + 192 + .msg { 193 + margin: 6px 0; 194 + font: 12px ui-monospace, monospace; 195 + } 196 + .msg.ok { color: #6cd0ff; } 197 + .msg.err { color: #ff6c6c; } 198 + .msg.muted { color: #8a93a3; } 199 + .msg code { color: #d4d8e0; } 200 + 201 + footer { 202 + margin-top: 16px; 203 + color: #6b7280; 204 + font-size: 12px; 205 + max-width: 720px; 206 + line-height: 1.5; 207 + } 208 + footer p { margin: 6px 0; } 209 + footer code { 210 + color: #8a93a3; 211 + background: #14171c; 212 + padding: 1px 5px; 213 + border-radius: 3px; 214 + } 215 + </style>
+33
star-lite/viz/src/app.css
··· 1 + * { box-sizing: border-box; } 2 + html, body { 3 + margin: 0; 4 + padding: 0; 5 + background: #0a0b0e; 6 + color: #d4d8e0; 7 + font-family: -apple-system, BlinkMacSystemFont, system-ui, sans-serif; 8 + } 9 + main { 10 + padding: 16px; 11 + min-height: 100vh; 12 + } 13 + header { margin-bottom: 12px; } 14 + header h1 { 15 + margin: 0; 16 + font-size: 18px; 17 + font-weight: 600; 18 + letter-spacing: 0.2px; 19 + } 20 + header p { 21 + margin: 4px 0 0; 22 + font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; 23 + color: #8a93a3; 24 + } 25 + header p .ev { 26 + color: #6cd0ff; 27 + } 28 + .viz-wrap { 29 + overflow-x: auto; 30 + background: #0e0f13; 31 + border: 1px solid #1c1f26; 32 + border-radius: 6px; 33 + }
+79
star-lite/viz/src/components/Controls.svelte
··· 1 + <script> 2 + let { 3 + i = $bindable(), 4 + playing = $bindable(), 5 + speed = $bindable(), 6 + total, 7 + onStep, 8 + onReset, 9 + } = $props(); 10 + </script> 11 + 12 + <div class="controls"> 13 + <button onclick={onReset} title="reset to start">⏮</button> 14 + <button onclick={() => onStep(-1)} title="step back">◀</button> 15 + <button class="play" onclick={() => (playing = !playing)} title={playing ? 'pause' : 'play'}> 16 + {playing ? '⏸' : '▶'} 17 + </button> 18 + <button onclick={() => onStep(1)} title="step forward">▶</button> 19 + <input 20 + class="scrub" 21 + type="range" 22 + min="0" 23 + max={total - 1} 24 + bind:value={i} 25 + /> 26 + <label class="speed"> 27 + speed 28 + <input type="range" min="0.25" max="4" step="0.25" bind:value={speed} /> 29 + <span>{speed.toFixed(2)}×</span> 30 + </label> 31 + <span class="counter">{i + 1} / {total}</span> 32 + </div> 33 + 34 + <style> 35 + .controls { 36 + display: flex; 37 + gap: 10px; 38 + align-items: center; 39 + padding: 12px; 40 + background: #14171c; 41 + border: 1px solid #1c1f26; 42 + border-radius: 6px; 43 + margin-top: 10px; 44 + } 45 + button { 46 + background: #1f2530; 47 + color: #d4d8e0; 48 + border: 1px solid #2a3140; 49 + padding: 6px 10px; 50 + border-radius: 4px; 51 + cursor: pointer; 52 + font-size: 13px; 53 + line-height: 1; 54 + } 55 + button:hover { background: #2a3140; } 56 + button.play { background: #2c4a70; border-color: #4070b0; min-width: 36px; } 57 + button.play:hover { background: #355a85; } 58 + .scrub { flex: 1; min-width: 100px; accent-color: #6cd0ff; } 59 + .speed { 60 + display: flex; 61 + align-items: center; 62 + gap: 6px; 63 + color: #8a93a3; 64 + font-size: 12px; 65 + } 66 + .speed input { width: 100px; accent-color: #6cd0ff; } 67 + .speed span { 68 + color: #d4d8e0; 69 + font-family: ui-monospace, monospace; 70 + min-width: 42px; 71 + text-align: right; 72 + } 73 + .counter { 74 + color: #8a93a3; 75 + font: 12px ui-monospace, monospace; 76 + min-width: 64px; 77 + text-align: right; 78 + } 79 + </style>
+265
star-lite/viz/src/components/Viz.svelte
··· 1 + <script> 2 + let { snapshot, dataset, cursorIndex } = $props(); 3 + 4 + // layout constants 5 + const PAD_X = 24; 6 + const KEY_H = 28; 7 + const KEY_LABEL_H = 16; 8 + const STREAM_GAP = 18; 9 + const LAYER_H = 56; 10 + const LAYER_GAP = 10; 11 + const TOP_PAD = 16; 12 + 13 + const TARGET_VIEW_WIDTH = 1800; 14 + const KEY_W_MIN = 4; 15 + const KEY_W_MAX = 50; 16 + const LABEL_THRESHOLD = 22; 17 + 18 + let totalKeys = $derived(dataset.length); 19 + 20 + let KEY_W = $derived( 21 + totalKeys === 0 22 + ? KEY_W_MAX 23 + : Math.max( 24 + KEY_W_MIN, 25 + Math.min(KEY_W_MAX, (TARGET_VIEW_WIDTH - 2 * PAD_X) / totalKeys), 26 + ), 27 + ); 28 + let showLabels = $derived(KEY_W >= LABEL_THRESHOLD); 29 + 30 + function xLeft(idx) { return PAD_X + idx * KEY_W; } 31 + function xRight(idx) { return PAD_X + (idx + 1) * KEY_W; } 32 + function xCenter(idx) { return PAD_X + idx * KEY_W + KEY_W / 2; } 33 + 34 + let svgWidth = $derived(PAD_X * 2 + totalKeys * KEY_W); 35 + 36 + let observedMaxLayer = $derived( 37 + Math.max(0, snapshot.stack.length - 1, ...snapshot.frozen.map((f) => f.layer)), 38 + ); 39 + let datasetMaxLayer = $derived(dataset.reduce((m, k) => Math.max(m, k.layer), 0)); 40 + let maxLayer = $derived(Math.max(observedMaxLayer, datasetMaxLayer)); 41 + 42 + let streamY = $derived(TOP_PAD + (maxLayer + 1) * (LAYER_H + LAYER_GAP) + STREAM_GAP); 43 + let svgHeight = $derived(streamY + KEY_H + KEY_LABEL_H + 12); 44 + 45 + function yLayerTop(L) { 46 + return TOP_PAD + (maxLayer - L) * (LAYER_H + LAYER_GAP); 47 + } 48 + 49 + let cursorX = $derived( 50 + snapshot.cursor < 0 51 + ? PAD_X 52 + : snapshot.cursor >= totalKeys 53 + ? xRight(totalKeys - 1) 54 + : xLeft(snapshot.cursor), 55 + ); 56 + 57 + let pulse = $derived.by(() => { 58 + const ev = snapshot.event; 59 + if (!ev) return null; 60 + if (ev.type === 'linkRecord') return { kind: 'activeNode', layer: ev.keyLayer }; 61 + if (ev.type === 'freezeNode' || ev.type === 'finalFreezeNode') 62 + return { kind: 'frozenCid', cid: ev.cid }; 63 + if (ev.type === 'freezeSkipEmpty' || ev.type === 'finalFreezeSkipEmpty') 64 + return { kind: 'skipLayer', layer: ev.layer }; 65 + if (ev.type === 'read') return { kind: 'streamCell', idx: ev.keyIdx }; 66 + return null; 67 + }); 68 + 69 + // auto-scroll the wrap to keep the cursor in view when stepping/playing 70 + let wrapEl = $state(); 71 + $effect(() => { 72 + if (!wrapEl) return; 73 + const cx = cursorX; 74 + const left = wrapEl.scrollLeft; 75 + const right = left + wrapEl.clientWidth; 76 + const margin = Math.min(120, wrapEl.clientWidth / 4); 77 + if (cx < left + margin || cx > right - margin) { 78 + wrapEl.scrollLeft = Math.max(0, cx - wrapEl.clientWidth / 2); 79 + } 80 + }); 81 + 82 + // tints for stream cells in high-density mode 83 + const layerTints = ['#1a1d24', '#1f3550', '#3a3214', '#4a1e3e', '#3e2c5a', '#1f4a3a']; 84 + function layerColor(L) { return layerTints[Math.min(L, layerTints.length - 1)]; } 85 + </script> 86 + 87 + <div class="viz-wrap" bind:this={wrapEl}> 88 + <svg width={svgWidth} height={svgHeight} xmlns="http://www.w3.org/2000/svg"> 89 + {#each Array(maxLayer + 1) as _, L} 90 + <g class="layer-bg"> 91 + <text x={4} y={yLayerTop(L) + LAYER_H / 2 + 4} class="layer-label">L{L}</text> 92 + <line 93 + x1={PAD_X - 2} 94 + x2={svgWidth - PAD_X + 2} 95 + y1={yLayerTop(L) + LAYER_H + LAYER_GAP / 2} 96 + y2={yLayerTop(L) + LAYER_H + LAYER_GAP / 2} 97 + class="layer-divider" 98 + /> 99 + </g> 100 + {/each} 101 + 102 + {#each snapshot.frozen as f (f.cid)} 103 + {@const x = xLeft(f.firstKeyIdx)} 104 + {@const w = xRight(f.lastKeyIdx) - xLeft(f.firstKeyIdx)} 105 + {@const y = yLayerTop(f.layer)} 106 + {@const subtreeCount = (f.leftSubtree ? 1 : 0) + f.entries.filter((e) => e.rightSubtree).length} 107 + <g 108 + class="node frozen" 109 + class:isRoot={f.isRoot} 110 + class:pulse-cid={pulse?.kind === 'frozenCid' && pulse.cid === f.cid} 111 + > 112 + <rect {x} {y} width={w} height={LAYER_H} rx="5" /> 113 + {#if w >= 60} 114 + <text x={x + 7} y={y + 14} class="title"> 115 + L{f.layer} · {f.entries.length}e{subtreeCount > 0 ? ` + ${subtreeCount}s` : ''}{f.isRoot ? ' · root' : ''} 116 + </text> 117 + <text x={x + 7} y={y + 28} class="cid">{f.cid}</text> 118 + {/if} 119 + {#if KEY_W >= 8} 120 + {#each f.entries as e} 121 + <circle cx={xCenter(e.keyIdx)} cy={y + LAYER_H - 12} r={Math.min(3, KEY_W / 3)} class="entry-dot" /> 122 + {/each} 123 + {/if} 124 + </g> 125 + {/each} 126 + 127 + {#each snapshot.stack as node, layer} 128 + {#if !node.isEmpty} 129 + {@const x = xLeft(node.firstKeyIdx)} 130 + {@const xEnd = xRight(node.lastKeyIdx)} 131 + {@const y = yLayerTop(layer)} 132 + {@const subtreeCount = (node.leftSubtree ? 1 : 0) + node.entries.filter((e) => e.rightSubtree).length} 133 + <g 134 + class="node active" 135 + class:pulse-active={pulse?.kind === 'activeNode' && pulse.layer === layer} 136 + > 137 + <rect {x} {y} width={xEnd - x} height={LAYER_H} rx="5" /> 138 + {#if xEnd - x >= 60} 139 + <text x={x + 7} y={y + 14} class="title"> 140 + L{layer} · {node.entries.length}e{subtreeCount > 0 ? ` + ${subtreeCount}s` : ''} 141 + </text> 142 + <text x={x + 7} y={y + 28} class="cid">building…</text> 143 + {/if} 144 + {#if KEY_W >= 8} 145 + {#each node.entries as e} 146 + <circle cx={xCenter(e.keyIdx)} cy={y + LAYER_H - 12} r={Math.min(3.5, KEY_W / 3)} class="entry-dot active" /> 147 + {/each} 148 + {/if} 149 + </g> 150 + {:else if pulse?.kind === 'skipLayer' && pulse.layer === layer} 151 + <rect 152 + x={cursorX - 28} 153 + y={yLayerTop(layer)} 154 + width={56} 155 + height={LAYER_H} 156 + rx="5" 157 + class="ghost-skip" 158 + /> 159 + <text 160 + x={cursorX} 161 + y={yLayerTop(layer) + LAYER_H / 2 + 4} 162 + text-anchor="middle" 163 + class="ghost-label" 164 + > 165 + ∅ skip 166 + </text> 167 + {/if} 168 + {/each} 169 + 170 + <line 171 + x1={cursorX} 172 + x2={cursorX} 173 + y1={TOP_PAD - 4} 174 + y2={streamY + KEY_H + KEY_LABEL_H + 4} 175 + class="cursor" 176 + /> 177 + 178 + {#each dataset as kv, idx} 179 + <g 180 + class="stream-cell" 181 + class:past={idx < snapshot.cursor} 182 + class:current={idx === snapshot.cursor} 183 + class:future={idx > snapshot.cursor} 184 + class:pulse-cell={pulse?.kind === 'streamCell' && pulse.idx === idx} 185 + > 186 + <rect 187 + x={xLeft(idx)} 188 + y={streamY} 189 + width={KEY_W} 190 + height={KEY_H} 191 + fill={layerColor(kv.layer)} 192 + /> 193 + {#if showLabels} 194 + <text x={xCenter(idx)} y={streamY + 18} text-anchor="middle" class="key">{kv.key}</text> 195 + <text x={xCenter(idx)} y={streamY + KEY_H + 12} text-anchor="middle" class="layer-tag">L{kv.layer}</text> 196 + {:else if kv.layer > 0} 197 + <line 198 + x1={xLeft(idx) + KEY_W / 2} 199 + x2={xLeft(idx) + KEY_W / 2} 200 + y1={streamY + KEY_H} 201 + y2={streamY + KEY_H + Math.min(KEY_LABEL_H, 4 + kv.layer * 4)} 202 + class="layer-tick" 203 + style:stroke={layerColor(kv.layer + 1) || '#6cd0ff'} 204 + /> 205 + {/if} 206 + </g> 207 + {/each} 208 + </svg> 209 + </div> 210 + 211 + <style> 212 + .viz-wrap { 213 + overflow-x: auto; 214 + background: #0e0f13; 215 + border: 1px solid #1c1f26; 216 + border-radius: 6px; 217 + } 218 + svg { display: block; } 219 + 220 + .layer-label { fill: #4a505c; font: 10px ui-monospace, monospace; } 221 + .layer-divider { stroke: #14171c; stroke-width: 1; } 222 + 223 + .stream-cell rect { stroke: #2a2f3a; stroke-width: 0.5; } 224 + .stream-cell.past rect { opacity: 0.55; } 225 + .stream-cell.current rect { stroke: #6ea2ff; stroke-width: 1.5; } 226 + .stream-cell.pulse-cell rect { stroke: #ffd86c; stroke-width: 2; } 227 + .stream-cell .key { fill: #d4d8e0; font: 12px ui-monospace, monospace; } 228 + .stream-cell.past .key { fill: #5b626d; } 229 + .stream-cell.current .key { fill: #eaf3ff; font-weight: 600; } 230 + .stream-cell .layer-tag { fill: #5b626d; font: 9px ui-monospace, monospace; } 231 + .layer-tick { stroke-width: 2; } 232 + 233 + .node rect { fill: #14171c; stroke: #2a3140; } 234 + .node .title { font: 11px ui-monospace, monospace; } 235 + .node .cid { font: 10px ui-monospace, monospace; opacity: 0.8; } 236 + 237 + .node.active rect { fill: #1f3550; stroke: #6cd0ff; stroke-width: 1.5; } 238 + .node.active .title { fill: #d4ecff; } 239 + .node.active .cid { fill: #6cd0ff; } 240 + .node.active.pulse-active rect { stroke: #ffd86c; stroke-width: 2; } 241 + .node.active .entry-dot.active { fill: #6cd0ff; } 242 + 243 + .node.frozen rect { fill: #11141a; stroke: #232830; opacity: 0.85; } 244 + .node.frozen .title { fill: #6b7280; } 245 + .node.frozen .cid { fill: #4a4f59; } 246 + .node.frozen .entry-dot { fill: #2f3540; } 247 + .node.frozen.pulse-cid rect { stroke: #ffd86c; stroke-width: 2; opacity: 1; } 248 + .node.frozen.isRoot rect { fill: #1a1c14; stroke: #ffd86c; stroke-width: 1.5; opacity: 1; } 249 + .node.frozen.isRoot .title, .node.frozen.isRoot .cid { fill: #ffe8a3; } 250 + 251 + .ghost-skip { 252 + fill: none; 253 + stroke: #3a3f48; 254 + stroke-dasharray: 4 4; 255 + opacity: 0.6; 256 + } 257 + .ghost-label { fill: #5b626d; font: 11px ui-monospace, monospace; } 258 + 259 + .cursor { 260 + stroke: #6ea2ff; 261 + stroke-width: 1; 262 + stroke-dasharray: 3 3; 263 + opacity: 0.6; 264 + } 265 + </style>
+167
star-lite/viz/src/lib/algorithm.js
··· 1 + // verification algorithm with state snapshots for visualization. 2 + // faithful to the pseudocode in ../../../readme.md, with an extra 3 + // per-event snapshot push so the viz can step through it. 4 + 5 + let cidCounter = 0; 6 + function fakeCid(prefix) { 7 + return `${prefix}#${(++cidCounter).toString(16).padStart(3, '0')}`; 8 + } 9 + function resetCidCounter() { cidCounter = 0; } 10 + 11 + class MstNode { 12 + constructor() { 13 + this.entries = []; // [{ key, recordCid, keyIdx, rightSubtree }] 14 + this.leftSubtree = null; 15 + this.firstKeyIdx = null; // span: leftmost key index covered (incl. subtrees) 16 + this.lastKeyIdx = null; // span: rightmost key index covered 17 + } 18 + isEmpty() { 19 + return this.leftSubtree === null && this.entries.length === 0; 20 + } 21 + reset() { 22 + this.entries = []; 23 + this.leftSubtree = null; 24 + this.firstKeyIdx = null; 25 + this.lastKeyIdx = null; 26 + } 27 + linkRecord(key, recordCid, keyIdx) { 28 + this.entries.push({ key, recordCid, keyIdx, rightSubtree: null }); 29 + if (this.firstKeyIdx === null) this.firstKeyIdx = keyIdx; 30 + this.lastKeyIdx = keyIdx; 31 + } 32 + linkSubtree(cid, spanFirst, spanLast) { 33 + if (this.entries.length === 0) { 34 + this.leftSubtree = cid; 35 + } else { 36 + this.entries[this.entries.length - 1].rightSubtree = cid; 37 + } 38 + if (this.firstKeyIdx === null || spanFirst < this.firstKeyIdx) this.firstKeyIdx = spanFirst; 39 + if (this.lastKeyIdx === null || spanLast > this.lastKeyIdx) this.lastKeyIdx = spanLast; 40 + } 41 + snapshot() { 42 + return { 43 + entries: this.entries.map(e => ({ ...e })), 44 + leftSubtree: this.leftSubtree, 45 + firstKeyIdx: this.firstKeyIdx, 46 + lastKeyIdx: this.lastKeyIdx, 47 + isEmpty: this.isEmpty(), 48 + }; 49 + } 50 + } 51 + 52 + function snap(state, event) { 53 + return { 54 + cursor: state.cursor, 55 + prevLayer: state.prevLayer, 56 + stack: state.stack.map(n => n.snapshot()), 57 + // frozen records are never mutated after push, so we can share them across snapshots 58 + frozen: state.frozen.slice(), 59 + event, 60 + }; 61 + } 62 + 63 + function freezeNode(state, layer, finalCascade) { 64 + const node = state.stack[layer]; 65 + const parent = state.stack[layer + 1]; 66 + if (node.isEmpty()) { 67 + return [snap(state, { 68 + type: finalCascade ? 'finalFreezeSkipEmpty' : 'freezeSkipEmpty', 69 + layer, 70 + })]; 71 + } 72 + const cid = fakeCid(`n${layer}`); 73 + const frozenRecord = { 74 + layer, 75 + firstKeyIdx: node.firstKeyIdx, 76 + lastKeyIdx: node.lastKeyIdx, 77 + entries: node.entries.map(e => ({ ...e })), 78 + leftSubtree: node.leftSubtree, 79 + cid, 80 + }; 81 + state.frozen.push(frozenRecord); 82 + parent.linkSubtree(cid, node.firstKeyIdx, node.lastKeyIdx); 83 + node.reset(); 84 + return [snap(state, { 85 + type: finalCascade ? 'finalFreezeNode' : 'freezeNode', 86 + layer, 87 + cid, 88 + frozenRecord, 89 + })]; 90 + } 91 + 92 + export function computeSnapshots(keyLayerPairs) { 93 + resetCidCounter(); 94 + const state = { cursor: -1, prevLayer: -1, stack: [], frozen: [] }; 95 + const out = []; 96 + out.push(snap(state, { type: 'init' })); 97 + 98 + for (let i = 0; i < keyLayerPairs.length; i++) { 99 + const { key, layer: keyLayer } = keyLayerPairs[i]; 100 + state.cursor = i; 101 + out.push(snap(state, { type: 'read', key, keyLayer, keyIdx: i })); 102 + 103 + while (state.stack.length <= keyLayer) { 104 + state.stack.push(new MstNode()); 105 + out.push(snap(state, { type: 'growStack', layer: state.stack.length - 1 })); 106 + } 107 + 108 + if (keyLayer > state.prevLayer) { 109 + for (let l = 0; l < keyLayer; l++) { 110 + out.push(...freezeNode(state, l, false)); 111 + } 112 + } 113 + 114 + const recordCid = fakeCid('r'); 115 + state.stack[keyLayer].linkRecord(key, recordCid, i); 116 + out.push(snap(state, { type: 'linkRecord', key, keyLayer, keyIdx: i, recordCid })); 117 + state.prevLayer = keyLayer; 118 + } 119 + 120 + state.cursor = keyLayerPairs.length; 121 + out.push(snap(state, { type: 'streamEnd' })); 122 + 123 + for (let l = 0; l < state.stack.length - 1; l++) { 124 + out.push(...freezeNode(state, l, true)); 125 + } 126 + 127 + let rootCid; 128 + if (state.stack.length > 0) { 129 + const topL = state.stack.length - 1; 130 + const root = state.stack[topL]; 131 + if (!root.isEmpty()) { 132 + rootCid = fakeCid('root'); 133 + state.frozen.push({ 134 + layer: topL, 135 + firstKeyIdx: root.firstKeyIdx, 136 + lastKeyIdx: root.lastKeyIdx, 137 + entries: root.entries.map(e => ({ ...e })), 138 + leftSubtree: root.leftSubtree, 139 + cid: rootCid, 140 + isRoot: true, 141 + }); 142 + root.reset(); 143 + } else { 144 + rootCid = 'bafyreih…(empty mst)'; 145 + } 146 + } else { 147 + rootCid = 'bafyreih…(empty mst)'; 148 + } 149 + out.push(snap(state, { type: 'rootCid', rootCid })); 150 + return out; 151 + } 152 + 153 + export function describeEvent(ev) { 154 + switch (ev.type) { 155 + case 'init': return 'idle — stream not yet read'; 156 + case 'read': return `read key "${ev.key}" (layer ${ev.keyLayer})`; 157 + case 'growStack': return `grow stack to include layer ${ev.layer}`; 158 + case 'freezeSkipEmpty': return `cascade: layer ${ev.layer} empty — skip`; 159 + case 'freezeNode': return `cascade: freeze layer ${ev.layer} → CID ${ev.cid}, link into layer ${ev.layer + 1}`; 160 + case 'linkRecord': return `link record "${ev.key}" into layer ${ev.keyLayer} (record CID ${ev.recordCid})`; 161 + case 'streamEnd': return 'stream end — final rollup'; 162 + case 'finalFreezeSkipEmpty': return `final rollup: layer ${ev.layer} empty — skip`; 163 + case 'finalFreezeNode': return `final rollup: freeze layer ${ev.layer} → CID ${ev.cid}, link into layer ${ev.layer + 1}`; 164 + case 'rootCid': return `root CID: ${ev.rootCid}`; 165 + default: return ev.type; 166 + } 167 + }
+44
star-lite/viz/src/lib/dataset.js
··· 1 + // hand-crafted demo datasets. layers are assigned to make the freeze cascades 2 + // visually interesting; in real STAR data the layer comes from sha256(key). 3 + 4 + export const demoSmall = [ 5 + { key: 'aa', layer: 0 }, 6 + { key: 'ab', layer: 0 }, 7 + { key: 'ac', layer: 0 }, 8 + { key: 'ad', layer: 1 }, // freeze L0 [aa,ab,ac] → leftSubtree of L1 9 + { key: 'ae', layer: 0 }, 10 + { key: 'af', layer: 0 }, 11 + { key: 'ag', layer: 0 }, 12 + { key: 'ah', layer: 1 }, // freeze L0 [ae,af,ag] → right of "ad" in L1 13 + { key: 'ai', layer: 0 }, 14 + { key: 'aj', layer: 2 }, // dramatic: freeze L0 [ai] then freeze L1 [ad,ah,…] 15 + { key: 'ak', layer: 0 }, 16 + { key: 'al', layer: 0 }, 17 + { key: 'am', layer: 1 }, // freeze L0 [ak,al] 18 + { key: 'an', layer: 0 }, 19 + { key: 'ao', layer: 0 }, 20 + { key: 'ap', layer: 0 }, 21 + ]; 22 + 23 + export const demoTiny = [ 24 + { key: 'aa', layer: 0 }, 25 + { key: 'ab', layer: 0 }, 26 + { key: 'ac', layer: 1 }, 27 + { key: 'ad', layer: 0 }, 28 + { key: 'ae', layer: 0 }, 29 + ]; 30 + 31 + export const demoEmptyBottom = [ 32 + // exercises the "skip possible empty bottom-most nodes" branch 33 + { key: 'aa', layer: 1 }, 34 + { key: 'ab', layer: 1 }, 35 + { key: 'ac', layer: 2 }, // L0 is empty here — freeze cascade should skip it 36 + { key: 'ad', layer: 0 }, 37 + { key: 'ae', layer: 0 }, 38 + ]; 39 + 40 + export const demos = { 41 + small: demoSmall, 42 + tiny: demoTiny, 43 + emptyBottom: demoEmptyBottom, 44 + };
+35
star-lite/viz/src/lib/mst.js
··· 1 + // MST layer derivation for atproto. 2 + // layer = floor(leading_zero_bits(sha256(key)) / 2) 3 + // (atproto MST uses fanout 4, so each layer represents 2 bits of the hash — 4 + // matches the reference impl's `leadingZerosOnHash`, which counts 2-bit groups) 5 + 6 + const enc = new TextEncoder(); 7 + 8 + async function sha256(bytes) { 9 + const buf = await crypto.subtle.digest('SHA-256', bytes); 10 + return new Uint8Array(buf); 11 + } 12 + 13 + function leadingZeroBits(bytes) { 14 + let count = 0; 15 + for (const b of bytes) { 16 + if (b === 0) { 17 + count += 8; 18 + continue; 19 + } 20 + // clz32 of an 8-bit value: 24 leading zeros from the upper 24 bits, plus 0..7 from the byte 21 + count += Math.clz32(b) - 24; 22 + return count; 23 + } 24 + return count; 25 + } 26 + 27 + export async function computeMstLayer(key) { 28 + const digest = await sha256(enc.encode(key)); 29 + return Math.floor(leadingZeroBits(digest) / 2); 30 + } 31 + 32 + export async function computeMstLayers(keys) { 33 + // crypto.subtle is async; let the runtime parallelize 34 + return Promise.all(keys.map(computeMstLayer)); 35 + }
+106
star-lite/viz/src/lib/star.js
··· 1 + // STAR-lite binary parser. format spec: ../../../readme.md 2 + // 3 + // header: magic(3) | cid(36) | len varint | partial commit cbor (len bytes) 4 + // record: key_len varint | key utf-8 | record_len varint | record cbor 5 + // 6 + // we only retain (key, recordSize) — record bytes are skipped, since this viz 7 + // uses fake record CIDs. 8 + 9 + const STAR_MAGIC = [0x2a, 0x6c, 0x00]; 10 + const CID_PREFIX = [0x01, 0x71, 0x12, 0x20]; 11 + const HEADER_CID_LEN = 36; 12 + const HEADER_CBOR_MAX = 4096; 13 + const KEY_MAX = 830; 14 + const RECORD_MAX = 1024 * 1024; 15 + 16 + function readVarint(bytes, offset) { 17 + let value = 0; 18 + let mult = 1; 19 + let i = offset; 20 + while (i < bytes.length) { 21 + const b = bytes[i++]; 22 + value += (b & 0x7f) * mult; 23 + if ((b & 0x80) === 0) { 24 + if (!Number.isSafeInteger(value)) throw new Error('varint overflow'); 25 + return [value, i - offset]; 26 + } 27 + mult *= 128; 28 + if (mult > 2 ** 49) throw new Error('varint too long'); 29 + } 30 + throw new Error('varint truncated at end of buffer'); 31 + } 32 + 33 + function hex(bytes) { 34 + return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join(''); 35 + } 36 + 37 + export function parseStarLite(buffer) { 38 + const bytes = new Uint8Array(buffer); 39 + let off = 0; 40 + 41 + if (bytes.length < 3 + HEADER_CID_LEN + 1) { 42 + throw new Error('file too short to contain a STAR-lite header'); 43 + } 44 + 45 + for (let i = 0; i < 3; i++) { 46 + if (bytes[off + i] !== STAR_MAGIC[i]) { 47 + throw new Error(`bad magic at offset 0: expected 2a 6c 00, got ${hex(bytes.slice(0, 3))}`); 48 + } 49 + } 50 + off += 3; 51 + 52 + const cidBytes = bytes.slice(off, off + HEADER_CID_LEN); 53 + for (let i = 0; i < 4; i++) { 54 + if (cidBytes[i] !== CID_PREFIX[i]) { 55 + throw new Error(`bad CID prefix: expected 01 71 12 20, got ${hex(cidBytes.slice(0, 4))}`); 56 + } 57 + } 58 + const headerCidDigest = cidBytes.slice(4); 59 + off += HEADER_CID_LEN; 60 + 61 + const [cborLen, vlen] = readVarint(bytes, off); 62 + off += vlen; 63 + if (cborLen > HEADER_CBOR_MAX) { 64 + throw new Error(`partial commit cbor len ${cborLen} exceeds max ${HEADER_CBOR_MAX}`); 65 + } 66 + if (off + cborLen > bytes.length) { 67 + throw new Error('truncated partial commit cbor'); 68 + } 69 + const partialCommit = cborLen > 0 ? bytes.slice(off, off + cborLen) : null; 70 + off += cborLen; 71 + 72 + const utf8 = new TextDecoder('utf-8', { fatal: true }); 73 + const records = []; 74 + while (off < bytes.length) { 75 + const [keyLen, kvlen] = readVarint(bytes, off); 76 + off += kvlen; 77 + if (keyLen > KEY_MAX) throw new Error(`record ${records.length}: key len ${keyLen} exceeds max ${KEY_MAX}`); 78 + if (off + keyLen > bytes.length) throw new Error(`record ${records.length}: truncated key`); 79 + let key; 80 + try { 81 + key = utf8.decode(bytes.slice(off, off + keyLen)); 82 + } catch (e) { 83 + throw new Error(`record ${records.length}: key is not valid utf-8`); 84 + } 85 + off += keyLen; 86 + 87 + const [recordLen, rvlen] = readVarint(bytes, off); 88 + off += rvlen; 89 + if (recordLen > RECORD_MAX) throw new Error(`record ${records.length}: record len ${recordLen} exceeds max ${RECORD_MAX}`); 90 + if (off + recordLen > bytes.length) throw new Error(`record ${records.length}: truncated record body`); 91 + off += recordLen; 92 + 93 + if (records.length > 0 && key <= records[records.length - 1].key) { 94 + throw new Error(`record ${records.length}: key "${key}" not in strict lex order after "${records[records.length - 1].key}"`); 95 + } 96 + 97 + records.push({ key, recordSize: recordLen }); 98 + } 99 + 100 + return { 101 + headerCidDigest, 102 + headerCidHex: hex(headerCidDigest), 103 + partialCommit, 104 + records, 105 + }; 106 + }
+6
star-lite/viz/src/main.js
··· 1 + import { mount } from 'svelte'; 2 + import App from './App.svelte'; 3 + import './app.css'; 4 + 5 + const app = mount(App, { target: document.getElementById('app') }); 6 + export default app;
+6
star-lite/viz/vite.config.js
··· 1 + import { defineConfig } from 'vite'; 2 + import { svelte } from '@sveltejs/vite-plugin-svelte'; 3 + 4 + export default defineConfig({ 5 + plugins: [svelte()], 6 + });