From c879c6edf09e359435bf70383c05b65e824ee457 Mon Sep 17 00:00:00 2001 From: webreflection Date: Mon, 20 Oct 2025 11:19:44 +0200 Subject: [PATCH 1/3] Augment Pyodide with pre-fetched packages details --- docs/index.js | 2 +- docs/index.js.map | 2 +- docs/zip-COrdYVp5.js | 13 + docs/zip-COrdYVp5.js.map | 1 + docs/zip-CakRHzZu.js | 2 + docs/zip-CakRHzZu.js.map | 1 + esm/interpreter/pyodide.js | 26 +- esm/interpreter/pyodide_graph.js | 4033 +++++++++++++++++ esm/interpreters.js | 3 +- node.importmap | 2 +- package-lock.json | 363 +- package.json | 16 +- rollup/build_pyodide_graph.js | 74 + rollup/pyodide_graph.json | 4033 +++++++++++++++++ test/index.js | 2 +- test/integration.html | 2 +- .../interpreter/pyodide/packages.html | 19 + .../interpreter/pyodide/packages.toml | 1 + test/integration/pyodide.js | 13 + versions/pyodide | 2 +- 20 files changed, 8404 insertions(+), 206 deletions(-) create mode 100644 docs/zip-COrdYVp5.js create mode 100644 docs/zip-COrdYVp5.js.map create mode 100644 docs/zip-CakRHzZu.js create mode 100644 docs/zip-CakRHzZu.js.map create mode 100644 esm/interpreter/pyodide_graph.js create mode 100644 rollup/build_pyodide_graph.js create mode 100644 rollup/pyodide_graph.json create mode 100644 test/integration/interpreter/pyodide/packages.html create mode 100644 test/integration/interpreter/pyodide/packages.toml diff --git a/docs/index.js b/docs/index.js index 73f8adb7..feedfb97 100644 --- a/docs/index.js +++ b/docs/index.js @@ -1,2 +1,2 @@ -const e=(e,t=document)=>[...t.querySelectorAll(e)],t=(e,t=document)=>{const n=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),r=[];for(let e=0,{snapshotLength:t}=n;e"function"==typeof e,s={get:(e,t)=>n.hasOwnProperty(t)?((e,t,{get:n,value:s})=>n||!r(s)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,n[t]):((e,t)=>r(t)?t.bind(e):t)(e,e[t])};var o=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),s);const{assign:a}=Object,i="entries",c="readonly",l="readwrite",u={durability:"default",prefix:"IDBMap"},p=({target:{result:e}})=>e;class f extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(i,t,this.#t);return new Promise((t,r)=>a(e(n.objectStore(i)),{onsuccess:t,onerror:r}))}constructor(e,{durability:t=u.durability,prefix:n=u.prefix}=u){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise((t,n)=>{a(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(i),n.oncomplete=()=>t(e)},onsuccess(e){t(p(e))},onerror(e){n(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?a(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),c).then(p)}async clear(){await this.#r(e=>e.clear(),l)}async delete(e){await this.#r(t=>t.delete(e),l)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),c).then(p)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),c).then(p)}async keys(){return await this.#r(e=>e.getAllKeys(),c).then(p)}async set(e,t){return await this.#r(n=>n.put(t,e),l),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}class d extends Map{#s;#o;constructor(...e){super(),this.#s=new f(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}var h=Promise.withResolvers.bind(Promise);const y=new Proxy(new Map,{get:(e,t)=>(e.has(t)||e.set(t,h()),e.get(t))}),m=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),g=new Proxy(Object.freeze({}),{get:(e,t)=>"string"!=typeof t||m.has(t)?void 0:y[t].promise.then(e=>e.sync)});let w=0;const b=w++,_=w++,A=w++,v=w++,k=w++,E=w++,S=w++,$=w++,x=w++,j=w++,B=w++,M=w++,T=w++,F=w++,R=w++;w++;const P=w++,D=w++;const L=globalThis.ImageData||class{},O=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),C=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},W=e=>O.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),I=Object.defineProperty,U=Object.assign,H=Array.from,N=Array.isArray,J=ArrayBuffer.isView,q=(e,t)=>[e,t],z=e=>e,K={},G=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r0===e?t:C(t),X=e=>"string"==typeof e?q(0,e):q(16,W(e)),Y=(e,t)=>{for(let n=e.push,r=0,s=t.length;rt in globalThis?t:ne(Q(Z(e.constructor),[0])),re=(e,t)=>[t?e:H(new Uint8Array(e)),e.resizable?e.maxByteLength:0],se=/\[('|")?(.+?)\1\]/g,oe=(e,t)=>e?.[t];var ae=(e,t)=>t.replace(se,".$2").split(".").reduce(oe,e),ie=(e,...t)=>t.map(ce,e);function ce(e){return"string"==typeof e?ae(this,e):this[e]}const le=globalThis.Node||class{},{apply:ue,construct:pe,defineProperty:fe,deleteProperty:de,get:he,getOwnPropertyDescriptor:ye,getPrototypeOf:me,has:ge,isExtensible:we,ownKeys:be,set:_e,setPrototypeOf:Ae}=Reflect;var ve=({reflect:e=z,transform:t=z,remote:n=z,module:r=e=>import(e),buffer:s=!1,timeout:o=-1}=K)=>{const a=(t,r=new Map)=>{if(!N(t))return t;const[s,o]=t;switch(s){case 2:{if(null===o)return globalThis;let e=r.get(t);if(!e){e=o,r.set(t,o);for(const e in o)o[e]=a(o[e],r)}return e}case 4:return r.get(t)||(r.set(t,o),c(o,r));case 8:{let t=g.get(o),r=t?.deref();return r||(t&&O.unregister(t),r=function(...t){n.apply(this,t);for(let e=0,n=t.length;e{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return w;const n=t(e);return H&&I.has(n)||n instanceof L?q(0,n):J(n)?q(68,((e,t)=>{const{BYTES_PER_ELEMENT:n,byteOffset:r,buffer:s,length:o}=e;return[ne(e),re(s,t),r,o!==(s.byteLength-r)/n?o:0]})(n,s)):n instanceof ArrayBuffer?q(64,re(n,s)):q(N(n)?5:3,f(n))}case"function":return q(9,f(t(e)));case"symbol":return q(16,W(e));case"bigint":return q(32,e.toString())}return e},c=G(a),l=G(V),u=G(X),{clear:p,id:f,ref:d,unref:h}=((e=0,t=new Map,n=new Map)=>({clear:()=>{t.clear(),n.clear()},id:r=>{let s=n.get(r);if(void 0===s){for(;t.has(s=e++););t.set(s,r),n.set(r,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}))(),y=/^(?:[0-9]+|length)$/,m=-1{g.delete(t),e(b,t)});let I,H=!1;return{assign:U,gather:ie,query:ae,direct:e=>(H||(H=!0,I=new WeakSet),I.add(e),e),evaluate:(e,...t)=>ue(e,null,t),reflect(e,t,...n){const s=null===t,o=s?globalThis:d(t);switch(e){case j:{const e=V(n[0]),t=s&&"import"===e,a=t?r:he(o,e),c=i(a);if(!m)return c;let l,u=t,p=o;if(!t&&!(p instanceof le||N(p)&&"string"==typeof e&&y.test(e)))if(e in o){for(;!(l=ye(p,e))&&(p=me(p),p););u=!!l&&"value"in l}else u=!0;return[u,c]}case E:{const e=new Map;return i(ue(o,a(n[0],e),c(n[1],e)))}case P:return _e(o,V(n[0]),a(n[1]));case T:return ge(o,V(n[0]));case R:return u(be(o),g);case S:return i(pe(o,c(n[0])));case B:{const e=ye(o,V(n[0]));if(e)for(const t in e)e[t]=i(e[t]);return e}case $:return fe(o,V(n[0]),a(n[1]));case x:return de(o,V(n[0]));case M:return i(me(o));case D:return Ae(o,a(n[0]));case _:return void U(o,a(n[0]));case A:{const e=a(n[0]),t=Function(`return(${e}).apply(null,arguments)`);return i(ue(t,null,c(n[1])))}case v:for(let e,t=0,r=(n=l(n[0],g)).length;t{const r=n.get(e),s=!r;return s?(nt.setUint32(0,t.length,!0),n.set(e,[rt[0],rt[1],rt[2],rt[3]])):t.push(Ye,r[0],r[1],r[2],r[3]),s},ut=(e,t,n)=>{nt.setUint32(0,n,!0),e.push(t,rt[0],rt[1],rt[2],rt[3])},pt=(e,t,n)=>{switch(typeof e){case"number":e&&ot(e)?at(e)&&e<256&&-1(n,r)=>{const s=new t(r,e);ft=t.push,pt(n,s,new Map);const o=s.length;return s.sync(!0),o},ht="dbf1617e",yt="="+ht,mt="-"+ht;var gt=(e=e=>e)=>{const t=new Map;let n=0;return[()=>{let r;do{r=e(n++)}while(t.has(r));const s=h();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const wt=[],bt=new WeakSet,_t=(...e)=>(bt.add(e),e);let{SharedArrayBuffer:At}=globalThis,vt=!0;try{new At(4,{maxByteLength:8})}catch(e){vt=!1,At=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{assign:kt,create:Et}=Object,St=`coincident-${vt?crypto.randomUUID():Math.random().toString(36).substring(2)}`,$t={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},xt=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},jt=e=>{e.stopImmediatePropagation(),e.preventDefault()},Bt=(e,t=-1)=>e?.reflected_ffi_timeout??t,{defineProperty:Mt}=Object,[Tt,Ft]=gt();let[Rt,Pt]=Tt(),Dt=()=>Pt,{Atomics:Lt,MessageChannel:Ot,Worker:Ct}=globalThis;if(vt)Ft(Rt);else{const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){t(globalThis,"message",e=>{jt(e),Ft(Rt,e.data)},{once:!0});const{wait:n}=Lt,{parse:r}=JSON,s=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${i}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${a}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),s(t)}},o=(e,t)=>(e.set(r(t.responseText)),"ok");let a,i;Lt={wait:(t,...r)=>e.has(t)?o(t,s(t)):n(t,...r)},Pt=Pt.then(e=>{[a,i]=e})}else{const n=[St,Math.random()].join("-").replace(/\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const s=t=>{const[n,r,s]=t.data;e.set(r,[n,h()]),Mt(t,"data",{value:s})};Ot=class extends Ot{constructor(){super(),t(this.port1,"message",s)}},Ct=class extends Ct{constructor(e,t){super(e,t),super.postMessage([n,a])}};const{notify:o}=Lt;Lt={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):o(t,...n)}};let a="",i=null;const c=(e,n)=>{let r,s=!0;e.getRegistration(a).then(t=>t??e.register(a,n)).then(function n(o){const{controller:i}=e;if(s=s&&!!i,r=o.installing||o.waiting||o.active,"activated"===r.state){if(s){if(i.scriptURL===a)return Ft(Rt);o.unregister()}location.reload()}else t(r,"statechange",()=>n(o),{once:!0})})};Dt=(e,t)=>{if(!i){const n=new URL(e,location.href);a=`${n.protocol}//${n.host}${n.pathname}`,c(navigator.serviceWorker,t),i=Pt}return i}}}const Wt="InstallTrigger"in globalThis?St:"",It=e=>e,Ut=e=>e===yt?"main":e===mt?"worker":e;class Ht extends Event{#a;constructor(e){super("message"),this.#a=e}get data(){return this.#a}}var Nt=e=>{const t=e?.transform,n=Bt(e),r=(e?.encoder||dt)($t),s=!1!==e?.transfer;return{Worker:class extends Ct{constructor(e,o){const a=vt?"":o?.serviceWorker||"",{notify:i}=a?Lt:Atomics,{port1:c,port2:l}=new(a?Ot:MessageChannel),[u,p]=gt(It),f=new Map,d=Et(null);a&&Dt(a);let h="";super(e,kt({type:"module"},o)),this.proxy=new Proxy(d,{get:(e,n)=>{if("then"===n)return;let r=f.get(n);return r||f.set(n,r=(...e)=>{const r=((e,t)=>{let n=wt;return e&&bt.has(t.at(-1)||wt)&&(n=t.pop(),bt.delete(n)),n})(s,e),[o,a]=u();return c.postMessage([o,n,t?e.map(t):e],r),((e,t)=>{if(h){const n=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${Ut(h)}() awaiting proxy.${Ut(t)}() ?`);e=e.then(e=>(clearTimeout(n),e),e=>(clearTimeout(n),Promise.reject(e)))}return e})(a,n)}),r},set:xt}),Wt&&(vt||a)&&super.addEventListener("message",e=>{const{data:t}=e;t?.ID===Wt&&(jt(e),c.dispatchEvent(new Ht(t.data)))}),super.postMessage([Wt,a,Bt(o,n)],[l]),c.addEventListener("message",async({data:e})=>{const n=e[0],s=typeof n;if("number"===s)p.apply(null,e);else if(h=e[1],await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,d,t),h="","string"===s)c.postMessage(e);else{const t=e[2]||e[1];n[1]=void 0===t?0:r(t,n.buffer),n[0]=1,i(n,0)}}),c.start()}},native:vt,transfer:_t}};const{url:Jt}=import.meta,qt=/import\((['"])([^)]+?\.js)\1\)/g,zt=(e,t,n)=>`import(${t}${new URL(n,Jt).href}${t})`,Kt=Symbol.for("polyscript.js_modules");let Gt;const{Worker:Vt}=(e=>{const t=e?.import,n=Bt(e),r=Nt({...e,encoder:e?.encoder||dt});class s extends r.Worker{#i;constructor(e,r){const{proxy:s}=super(e,r),o=ve({...r,buffer:!0,reflect:s[mt],timeout:Bt(r,n),remote(e){e instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e,s=Ee.get(t||n)?.get(r);if(s)for(const t of s)e[t]()})(e)},module:r?.import||t||(e=>import(new URL(e,location).href))});this.#i=o.terminate,this.ffi={assign:o.assign,direct:o.direct,evaluate:o.evaluate,gather:o.gather,query:o.query},s[yt]=o.reflect}terminate(){this.#i(),super.terminate()}}return{...r,Worker:s}})({transfer:!1,transform:e=>(Gt||(Gt=globalThis[Kt]?.get("-T-")))?.(e)??e});const Xt=new WeakMap,Yt=e=>{const t=e||console,n={buffered:Qt,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return Xt.set(t,n),t}}},Zt=new TextDecoder,Qt=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(Zt.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},en=new Map,tn=e=>en.get(e),nn=(e,t)=>{try{return Function("require",t)(tn)}catch(t){Xt.get(e).stderr(t)}};var rn={type:"dummy",module:()=>"data:text/javascript,",engine:e=>Yt().get(e),registerJSModule(e,t,n){en.set(t,n)},run:nn,runAsync:nn,runEvent:async(e,t,n)=>{try{await Function("require","e",`return ${t}(e)`)(tn,n)}catch(t){Xt.get(e).stderr(t)}},transform:(e,t)=>t,writeFile(){}};const sn={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n",">":">","'":"'","'":"'",""":'"',""":'"'},ln=e=>cn[e],un=(e,...t)=>sn[typeof e](e,...t),pn=e=>on.call(e,an,ln),{isArray:fn}=Array,{assign:dn,create:hn,defineProperties:yn,defineProperty:mn,entries:gn}=Object,{all:wn,resolve:bn}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),_n=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function An(e){return e.startsWith(".")?_n(e,this):e}let vn=0;const kn=(e,t)=>({id:e.id||(e.id=`${t}-w${vn++}`),tag:e.tagName}),En=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},Sn=(e,t,n,r)=>({type:t,config:n,interpreter:r,io:Xt.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}),$n=e=>e.replace(/^(?:\n|\r\n)/,""),xn=(e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,$n(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,$n(t),...o);return r&&await s(e,r,...o),a}},jn=Symbol.for("polyscript.js_modules"),Bn=new Map;mn(globalThis,jn,{value:Bn});const Mn=new Proxy(Bn,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]}),Tn=(e,t)=>!t.startsWith("_"),Fn=(e,t)=>new Proxy(e,{has:Tn,get:(e,n)=>e[t][n]}),Rn=(e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,Fn(r,e));t.registerJSModule(n,s,r)},Pn=(e,t)=>import(e).then(e=>{Bn.set(t,{...e})}),Dn=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(dn(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),Ln=e=>/\.css$/i.test(new URL(e).pathname),On=e=>/^(?:false|0|no)$/i.test(e.getAttribute("async")),Cn=!globalThis.window,Wn=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Un(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},In=e=>{const t=e.split("/");return t.pop(),t.join("/")},Un=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},Hn=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\/+/,"/")},Nn=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},Jn=(e,t)=>o(_n(e,t)).arrayBuffer(),qn=(e,t,n,r)=>wn((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(fn(r))return r.map(n=>({url:Nn([e,n]),path:Nn([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Nn([t,s])}]})})(n).map(({url:n,path:s})=>Jn(n,r).then(n=>e.writeFile(t,s,n)))),zn=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,Kn=(e,t)=>e.replace(/\{.+?\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),Gn=(e,t,n,r)=>wn((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of gn(e))if(/^\{.+\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,Kn(o,t))}else{const e=Kn(s,t),a=zn(e,Kn(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>Jn(n,r).then(r=>e.writeFile(t,s,r,n)))),Vn=({main:e,worker:t},n)=>{const r=[];if(t&&Cn)for(let[e,s]of gn(t))e=_n(e,n),r.push(Pn(e,s));if(e&&!Cn)for(let[t,s]of gn(e))t=_n(t,n),Ln(t)?Dn(t):r.push(Pn(t,s));return wn(r)},Xn=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))},Yn=(e,t,n)=>(e.set(t,n),n),Zn=e=>{rt[0]=e[tr++],rt[1]=e[tr++],rt[2]=e[tr++],rt[3]=e[tr++],rt[4]=e[tr++],rt[5]=e[tr++],rt[6]=e[tr++],rt[7]=e[tr++]},Qn=e=>(rt[0]=e[tr++],rt[1]=e[tr++],rt[2]=e[tr++],rt[3]=e[tr++],nt.getUint32(0,!0)),er=(e,t)=>{switch(e[tr++]){case Me:return Zn(e),nt.getFloat64(0,!0);case Te:return e[tr++];case ze:{const n=Yn(t,tr-1,{});for(let r=0,s=Qn(e);r(tr=0,er(e,new Map)),stringify:e=>{const t=[];return ft=Y,pt(e,t,new Map),t}},rr=new WeakMap,sr=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await Gn(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await qn(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await Vn(r.js_modules,s),t("Loaded JS modules"))},or=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await rr.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new d(e);return await t.sync(),t},n.JSON=nr),e.registerJsModule(t,n)},ar=(e,t)=>{if(e.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},ir=(e,t,...n)=>{try{return e.runPython(un(t),...n)}catch(t){Xt.get(e).stderr(t)}},cr=async(e,t,...n)=>{try{return await e.runPythonAsync(un(t),...n)}catch(t){Xt.get(e).stderr(t)}},lr=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){Xt.get(e).stderr(t)}};var ur=(new TextEncoder).encode("_F='github:'\n_E='user-agent'\n_D=True\n_C=False\n_B='/'\n_A=None\nfrom uio import StringIO\nimport sys\nclass Response:\n\tdef __init__(A,f):A.raw=f;A.encoding='utf-8';A._cached=_A\n\tdef close(A):\n\t\tif A.raw:A.raw.close();A.raw=_A\n\t\tA._cached=_A\n\t@property\n\tdef content(self):\n\t\tA=self\n\t\tif A._cached is _A:\n\t\t\ttry:A._cached=A.raw.read()\n\t\t\tfinally:A.raw.close();A.raw=_A\n\t\treturn A._cached\n\t@property\n\tdef text(self):return str(self.content,self.encoding)\n\tdef json(A):import ujson;return ujson.loads(A.content)\nHEADERS_TO_IGNORE=_E,\ntry:import js\nexcept Exception as err:raise OSError('This version of urequests can only be used in the browser')\nHEADERS_TO_IGNORE=_E,\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\n\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\n\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\n\telse:A.open(D,url,_C)\n\tfor(F,J)in headers.items():\n\t\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\n\tif E:A.timeout=int(E*1000)\n\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader('Content-Type','application/json')\n\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\ndef get(url,**A):return request('GET',url,**A)\n_PACKAGE_INDEX=const('https://micropython.org/pi/v2')\n_CHUNK_SIZE=128\ndef _ensure_path_exists(path):\n\timport os;A=path.split(_B)\n\tif not A[0]:A.pop(0);A[0]=_B+A[0]\n\tB=''\n\tfor C in range(len(A)-1):\n\t\tB+=A[C]\n\t\ttry:os.stat(B)\n\t\texcept:os.mkdir(B)\n\t\tB+=_B\ndef _chunk(src,dest):\n\tA=memoryview(bytearray(_CHUNK_SIZE))\n\twhile _D:\n\t\tB=src.readinto(A)\n\t\tif B==0:break\n\t\tdest(A if B==_CHUNK_SIZE else A[:B])\ndef _check_exists(path,short_hash):\n\tA=short_hash;import os\n\ttry:\n\t\timport binascii as C,hashlib as D\n\t\twith open(path,'rb')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],'utf-8');return F==A\n\texcept:return _C\ndef _rewrite_url(url,branch=_A):\n\tB=branch;A=url\n\tif not B:B='HEAD'\n\tif A.startswith(_F):A=A[7:].split(_B);A='https://raw.githubusercontent.com/'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\n\treturn A\ndef _download_file(url,dest):\n\tB=dest;A=get(url)\n\ttry:\n\t\tif A.status_code!=200:print('Error',A.status_code,'requesting',url);return _C\n\t\tprint('Copying:',B);_ensure_path_exists(B)\n\t\twith open(B,'wb')as C:_chunk(A.raw,C.write)\n\t\treturn _D\n\tfinally:A.close()\ndef _install_json(package_json_url,index,target,version,mpy):\n\tK='File not found: {} {}';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\n\ttry:\n\t\tif E.status_code!=200:print('Package not found:',G);return _C\n\t\tF=E.json()\n\tfinally:E.close()\n\tfor(A,C)in F.get('hashes',()):\n\t\tB=D+_B+A\n\t\tif _check_exists(B,C):print('Exists:',B)\n\t\telse:\n\t\t\tL='{}/file/{}/{}'.format(H,C[:2],C)\n\t\t\tif not _download_file(L,B):print(K.format(A,C));return _C\n\tfor(A,J)in F.get('urls',()):\n\t\tB=D+_B+A\n\t\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\n\tfor(M,N)in F.get('deps',()):\n\t\tif not _install_package(M,H,D,N,mpy):return _C\n\treturn _D\ndef _install_package(package,index,target,version,mpy):\n\tD=index;C=target;B=version;A=package\n\tif A.startswith('http://')or A.startswith('https://')or A.startswith(_F):\n\t\tif A.endswith('.py')or A.endswith('.mpy'):print('Downloading {} to {}'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\n\t\telse:\n\t\t\tif not A.endswith('.json'):\n\t\t\t\tif not A.endswith(_B):A+=_B\n\t\t\t\tA+='package.json'\n\t\t\tprint('Installing {} to {}'.format(A,C))\n\telse:\n\t\tif not B:B='latest'\n\t\tprint('Installing {} ({}) from {} to {}'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,'_mpy')else'py';A='{}/package/{}/{}/{}.json'.format(D,'py',A,B)\n\treturn _install_json(A,D,C,B,mpy)\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\n\tB=target;A=index\n\tif not B:\n\t\tfor C in sys.path:\n\t\t\tif C.endswith('/lib'):B=C;break\n\t\telse:print('Unable to find lib dir in sys.path');return\n\tif not A:A=_PACKAGE_INDEX\n\tif _install_package(package,A.rstrip(_B),B,version,mpy):print('Done')\n\telse:print('Package may be partially installed')");const pr=async e=>(await import("./toml-BK2RWy-G.js")).parse(e);async function fr(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function dr(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await hr(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):Un(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path '${e}' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path '${e}' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory '${e}' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await fr(t,!0),{syncfs:async()=>await fr(t,!1)}}}const hr=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:yr}=JSON,mr=(e,t)=>new URL(e,t).href,gr=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},wr=(e,t,n)=>{for(const r in t)gr(e,mr(r,n),t[r])},br=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},wr(e[n],s,r))},_r=async(e,t=e.packages,n=new Set)=>{const r=[];for(const s of t){if(n.has(s))continue;n.add(s);const t=s.endsWith(".toml");if(t||s.endsWith(".json")){const a=await o(s).text(),{name:i,files:c,js_modules:l,packages:u}=t?await pr(a):yr(a);if(n.has(i))throw new Error(`Unable to process ${i} @ ${s}`);n.add(i),u&&r.push(...await _r(e,u,n)),l&&(e.js_modules??={},br(e.js_modules,l,"main",s),br(e.js_modules,l,"worker",s)),c&&(e.files??={},wr(e.files,c,s))}else r.push(s)}return r},Ar=(e,t)=>{try{e.mkdir(t)}catch(e){}},vr=Xn("mpy");var kr={type:"micropython",module:(e="1.27.0-preview-283")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=Yt({stderr:Qt(console.error),stdout:Qt(console.log)});n=n.replace(/\.m?js$/,".wasm"),vr("Loading MicroPython");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n}));globalThis[jn].set("-T-",this.transform.bind(this,i));const c=Er.bind(this,i,r);return rr.set(i,c),await sr(this,vr,i,t,r),this.writeFile(i,"./mip.py",ur),t.packages&&(t.experimental_remote_packages&&(vr("Loading remote packages"),t.packages=await _r(t),vr("Loaded remote packages")),vr("Loading packages"),await c(t.packages.map(An,r)),vr("Loaded packages")),vr("Loaded MicroPython"),i.mountNativeFS||(i.mountNativeFS=dr(i._module)),i},registerJSModule:or,run:ir,runAsync:cr,runEvent:lr,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=ar(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-D8wJncBv.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)Ar(s,i);else{Ar(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return Wn(i,t,n),void e.runPython(`\n import os, gzip, tarfile\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\n for f in tar:\n name = f"${r}{f.name}"\n if f.type == tarfile.DIRTYPE:\n if f.name != "./":\n os.mkdir(name.strip("/"))\n else:\n dir = os.path.dirname(name)\n if not os.path.exists(dir):\n os.mkdir(dir)\n source = tar.extractfile(f)\n with open(name, "wb") as dest:\n dest.write(source.read())\n dest.close()\n tar.close()\n os.remove("${t}")\n `)}}}return Wn(i,t,n)}};async function Er(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=_n(s,t),r=await o(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Sr={dict_converter:Object.fromEntries},{stringify:$r}=JSON,{apply:xr}=Reflect,jr=Function.prototype,Br=e=>function(...t){return xr(e,this,t)};let Mr,Tr;const Fr=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},n,r,s){Rr("Loading Pyodide");let{packages:o,index_urls:a}=n;o&&(o=o.map(An,s)),Rr("Loading Storage");const i=r.slice(0,r.lastIndexOf("/")),c=new d(`${i}@${t}`),l={indexURL:i},u="never"!==n.packages_cache&&"0.28.0"!==t;if(await c.sync(),Rr("Loaded Storage"),u||c.clear(),o&&(n.experimental_remote_packages&&(Rr("Loading remote packages"),n.packages=o=await _r(n,o),Rr("Loaded remote packages")),u))if("passthrough"===n.packages_cache)l.packages=o,o=null,c.clear();else{o=o.sort();const e=$r(o);if(c.has(e)){const n=c.get(e);if(l.packages=o.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});l.lockFileURL=URL.createObjectURL(e)}else l.lockFileContents=n;o=null}}const{stderr:p,stdout:f,get:h}=Yt();Rr("Loading interpreter");const y=await h(e({stderr:p,stdout:f,...l}));Rr("Loaded interpreter"),globalThis[jn].set("-T-",this.transform.bind(this,y)),n.debug&&y.setDebug(!0);const m=Or.bind(y);return a&&Pr.set(y,a),rr.set(y,m),await sr(this,Rr,y,n,s),o&&await m(o,c,u),await c.close(),l.lockFileURL&&URL.revokeObjectURL(l.lockFileURL),Rr("Loaded Pyodide"),"auto"===n.experimental_create_proxy&&(y.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:y.toPy({})}),Tr=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Mr]=Reflect.ownKeys(Tr).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),Fr(!0)),y},registerJSModule:or,run:Br(ir),runAsync:Br(cr),runEvent:Br(lr),transform:(e,t)=>xr(Lr,e,[t]),writeFile:(e,t,n,r)=>{const s=ar(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return Wn({FS:o,PATH:a,PATH_FS:i},t,n)}};function Lr(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(Sr);if(e instanceof Map)return new Map([...e.entries()]);if(fn(e))return e.map(Lr,this)}return e}async function Or(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,Rr(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(Pr.has(this)&&o.set_index_urls(Pr.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof d){const n=o.freeze();t.set($r(e),n)}o.destroy()}const Cr="ruby-wasm-wasi",Wr=Cr.replace(/\W+/g,"_");var Ir={type:Cr,experimental:!0,module:(e="2.7.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\/browser\/\+esm$/,"/ruby.wasm");const s=await o(n).arrayBuffer(),a=await WebAssembly.compile(s),{vm:i}=await e(a);return t.files&&await Gn(this,i,t.files,r),t.fetch&&await qn(this,i,t.fetch,r),t.js_modules&&await Vn(t.js_modules,r),i},registerJSModule(e,t,n){t=t.replace(/\W+/g,"__");const r=`__module_${Wr}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(un(t),...n),runAsync:(e,t,...n)=>e.evalAsync(un(t),...n),async runEvent(e,t,n){if(/^xworker\.(on\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${Wr}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${Cr}`)}};var Ur={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=Yt(),c=await i((new e).createEngine());return c.global.getTable(t.Base,e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)}),n.files&&await Gn(this,c,n.files,s),n.fetch&&await qn(this,c,n.fetch,s),n.js_modules&&await Vn(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(un(t),...n)}catch(t){Xt.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(un(t),...n)}catch(t){Xt.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){Xt.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(Un(e,In(t)),t=Hn(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const Hr=new WeakMap,Nr=new FinalizationRegistry(e=>e()),Jr=async(e,t)=>{const{shelter:n,destroy:r,io:s}=Hr.get(e),{output:o,result:a}=await n.captureR(un(t));for(const{type:e,data:t}of o)s[e](t);return Nr.register(a,r),a};var qr={type:"webr",experimental:!0,module:(e="0.5.6")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=Yt(),o=new e.WebR;await s(o.init().then(()=>o));const a=await new o.Shelter;return Hr.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:Xt.get(o)}),t.files&&await Gn(this,o,t.files,r),t.fetch&&await qn(this,o,t.fetch,r),t.js_modules&&await Vn(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:Jr,runAsync:Jr,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>t,writeFile:()=>{}};const zr=new Map,Kr=new Map,Gr=[],Vr=[],Xr=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=zr.get(n),o=/^(?:\.?\.?\/|[a-z0-9-]+:\/\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(Kr.set(t,e),s(r,e,n,o)))}}),Yr=e=>{for(const t of[].concat(e.type))zr.set(t,e),Gr.push(`script[type="${t}"]`),Vr.push(`${t}-`)};for(const e of[rn,kr,Dr,Ir,Ur,qr])Yr(e);const{parse:Zr}=JSON,Qr=(e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[_n(e),n]},es=(e,t,n={})=>{const[r,s]=Qr(e,t);return"json"===s?n=o(r).json():"toml"===s?n=o(r).text().then(pr):"string"===s?n=ts(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=ts(n)),[n,e=r]},ts=e=>{try{return Zr(e)}catch(t){return pr(e)}},ns=(e,t,n,r={})=>(t&&([r,t]=es(t,n,r)),bn(r).then(n=>Xr[e](n,t))),rs=(e,t="")=>`${e}@${t}`.replace(/@$/,"");function ss(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}const os="BeforeRun",as="AfterRun",is=[`code${os}`,`code${os}Async`,`code${as}`,`code${as}Async`],cs=["onWorker","onReady",`on${os}`,`on${os}Async`,`on${as}`,`on${as}Async`];function ls(e,t){const{run:n,runAsync:r}=zr.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const us=(e,t,n,r,s,o)=>{if(s||o){const a=ls.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let ps=class{constructor(e,t={}){const{main:n,worker:r}=t;this.interpreter=e,this.onWorker=n?.onWorker;for(const e of cs.slice(1))this[e]=r?.[e];for(const e of is)this[e]=r?.[e]}toJSON(){const e={};for(const t of cs.slice(1))this[t]&&(e[t]=ss(this[t]));for(const t of is)this[t]&&(e[t]=un(this[t]()));return e}};var fs=(...e)=>function(t,n){if(e.length){const[t,r]=e;(n=dn({},n||{type:t,version:r})).type||(n.type=t)}const[r]=Qr(n.config,n.configURL),s=((...e)=>new Vt(URL.createObjectURL(new Blob(["/*@*/"+'const{assign:e}=Object,t="entries",n="readonly",r="readwrite",s={durability:"default",prefix:"IDBMap"},o=({target:{result:e}})=>e;class a extends EventTarget{#e;#t;#n;async#r(n,r){const s=(await this.#e).transaction(t,r,this.#t);return new Promise((r,o)=>e(n(s.objectStore(t)),{onsuccess:r,onerror:o}))}constructor(n,{durability:r=s.durability,prefix:a=s.prefix}=s){super(),this.#n=a,this.#t={durability:r},this.#e=new Promise((r,s)=>{e(indexedDB.open(`${this.#n}/${n}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(t),n.oncomplete=()=>r(e)},onsuccess(e){r(o(e))},onerror(e){s(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(t){const{type:n,message:r,isTrusted:s}=t;return super.dispatchEvent(s?e(new Event(n),{message:r}):t)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),n).then(o)}async clear(){await this.#r(e=>e.clear(),r)}async delete(e){await this.#r(t=>t.delete(e),r)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),n).then(o)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),n).then(o)}async keys(){return await this.#r(e=>e.getAllKeys(),n).then(o)}async set(e,t){return await this.#r(n=>n.put(t,e),r),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}class i extends Map{#s;#o;constructor(...e){super(),this.#s=new a(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}const c="dbf1617e",l="="+c,u="-"+c;let p=0;const d=p++,f=p++,h=p++,y=p++,m=p++,g=p++,w=p++,_=p++,b=p++,A=p++,E=p++,k=p++,v=p++,S=p++,$=p++,x=p++,j=p++,B=p++,M=p++,F=p++,P=p++,T=p++,R=p++,D=p++,L=p++,O=p++;const C=globalThis.ImageData||class{},I=new TextDecoder,U=new TextEncoder,H=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),W=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},N=e=>H.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),J=Object.defineProperty,q=Object.assign,z=Array.isArray,K=ArrayBuffer.isView,G=(e,t)=>[e,t],V=e=>e,X=[],Y={},Z=function(){},Q=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r0===e?t:W(t),te=e=>"string"==typeof e?G(0,e):G(16,N(e)),ne=(e,t)=>{for(let n=e.push,r=0,s=t.length;r(e.set(t,n),n),ie=e=>{oe[0]=e[ue++],oe[1]=e[ue++],oe[2]=e[ue++],oe[3]=e[ue++],oe[4]=e[ue++],oe[5]=e[ue++],oe[6]=e[ue++],oe[7]=e[ue++]},ce=e=>(oe[0]=e[ue++],oe[1]=e[ue++],oe[2]=e[ue++],oe[3]=e[ue++],se.getUint32(0,!0)),le=(e,t)=>{switch(e[ue++]){case m:return ie(e),se.getFloat64(0,!0);case g:return e[ue++];case P:{const n=ae(t,ue-1,{});for(let r=0,s=ce(e);r(ue=0,le(e,new Map)),de=({byteOffset:e=0}={})=>(t,n)=>pe(new Uint8Array(n,e,t));let fe=0;const he=fe++,ye=fe++,me=fe++,ge=fe++,we=fe++,_e=fe++,be=fe++,Ae=fe++,Ee=fe++,ke=fe++,ve=fe++,Se=fe++,$e=fe++,xe=fe++,je=fe++;fe++;const Be=fe++,Me=fe++,{getPrototypeOf:Fe}=Object,{construct:Pe}=Reflect,{toStringTag:Te}=Symbol,{toString:Re}=Y,De=(e,t=Re.call(e).slice(8,-1))=>t in globalThis?t:De(Fe(e)||Y),Le=(e,t=e[Te])=>t in globalThis?t:Le(Pe(Fe(e.constructor),[0])),Oe=(e,t)=>new ArrayBuffer(e,{maxByteLength:t}),Ce=([e,t],n)=>{const r=n?e.byteLength:e.length;if(n){if(t){const n=Oe(r,t);new Uint8Array(n).set(new Uint8Array(e)),e=n}}else{const n=t?Oe(r,t):new ArrayBuffer(r);new Uint8Array(n).set(e),e=n}return e};const Ie=/\\[(\'|")?(.+?)\\1\\]/g,Ue=(e,t)=>e?.[t];var He=e=>{const t=[],n=e=>{const n=t.splice(e);for(;e{t.push(r,s)<3&&setTimeout(n,e,0)})(super.set(r,s),r),s}}},We=({reflect:e=V,transform:t=V,released:n=V,buffer:r=!1,timeout:s=-1}=Y)=>{const o=Q(ee),a=Q(te),i=e=>{if(!z(e))return e;const[t,n]=e;if(1&t)return u(t,n);switch(t){case 2:return $;case 0:return n;case 16:return W(n);case 32:return BigInt(n);case 68:return(([e,t,n,r],s)=>{const o=Ce(t,s),a=globalThis[e];return r?new a(o,n,r):new a(o,n)})(n,r);case 64:return Ce(n,r)}},c=(e,n=new Map)=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return S;if(v in e)return g;let r=n.get(e);if(!r){const s=t(e);if(w||!m.has(s)){if(z(s)){const t=[];r=G(4,t),n.set(e,r);for(let e=0,r=s.length;e{let n=k.get(t),r=n?.deref();return r||(n&&x.unregister(n),r=9===e?new Proxy(Z,new y(e,t)):new Proxy(3===e?Y:X,new h(e,t)),n=new WeakRef(r),k.set(t,n),x.register(r,t,n)),r},p=e=>{switch(typeof e){case"object":if(null===e)break;case"function":return v in e}return!1},d=-1this.apply(e,t,n);case"call":return(t,...n)=>this.apply(e,t,n);default:return super.get(e,t)}}}let m,g,w=!0;const{apply:_}=Reflect,{id:b,ref:A,unref:E}=((e=0,t=new Map,n=new Map)=>({clear:()=>{t.clear(),n.clear()},id:r=>{let s=n.get(r);if(void 0===s){for(;t.has(s=e++););t.set(s,r),n.set(r,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}))(),k=new Map,v=Symbol("reflected-ffi"),S=G(2,null),$=new Proxy(Y,new h(2,null)),x=new FinalizationRegistry(t=>{k.delete(t),e(he,t)});return{global:$,isProxy:p,assign(t,...n){const r=p(t),s=q(r?{}:t,...n);return r&&e(ye,g[1],c(s)),t},direct:e=>(w&&(w=!1,m=new WeakSet),m.add(e),e),evaluate:(t,...n)=>i(e(me,null,function(e=this){return String(e).replace(/^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}(t),l(n))),gather(t,...n){const r=p(t),s=r?i:e=>t[e];r&&(n=e(ge,g[1],a(n,k)));for(let e=0;ep(t)?i(e(we,g[1],n)):((e,t)=>t.replace(Ie,".$2").split(".").reduce(Ue,e))(t,n),reflect:async(e,t,...r)=>{switch(e){case _e:{const[e,n]=r;for(let e=0,t=n.length;ee)=>{const t=new Map;let n=0;return[()=>{let r;do{r=e(n++)}while(t.has(r));const s=Ne();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const qe=[],ze=new WeakSet,Ke=(...e)=>(ze.add(e),e);let{SharedArrayBuffer:Ge}=globalThis,Ve=!0;try{new Ge(4,{maxByteLength:8})}catch(e){Ve=!1,Ge=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{create:Xe}=Object,Ye=`coincident-${Ve?crypto.randomUUID():Math.random().toString(36).substring(2)}`,Ze=2*Int32Array.BYTES_PER_ELEMENT,Qe={byteOffset:Ze},et=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},tt=e=>{e.stopImmediatePropagation(),e.preventDefault()},[nt,rt]=Je();let[st,ot]=nt(),at=()=>ot,it=()=>{},{Atomics:ct,MessagePort:lt,SharedArrayBuffer:ut,postMessage:pt}=globalThis;if(Ve)rt(st);else{ut=Ge;const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){it=t=>{e.set(t,null)};const n=t=>{const n=t[0],r=p++;return e.set(n,r),[r,n,t]},r=pt;pt=function(e,t){if(u){const s={ID:e.ID,data:n(e.data)};r(s,t)}else ot.then(()=>this.postMessage(e,t))},lt=class extends lt{postMessage(e,t){u?super.postMessage(n(e),t):ot.then(()=>this.postMessage(e,t))}},t(globalThis,"message",e=>{tt(e),rt(st,e.data)},{once:!0});const{wait:s}=ct,{parse:o}=JSON,a=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${l}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${c}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),a(t)}},i=(e,t)=>(e.set(o(t.responseText)),"ok");ct={wait:(t,...n)=>e.has(t)?i(t,a(t)):s(t,...n)};let c,l,u=!1,p=Math.random();ot=ot.then(e=>{[c,l]=e,u=!0})}else{const n=[Ye,Math.random()].join("-").replace(/\\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const{notify:s}=ct;ct={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):s(t,...n)}};let o="",a=null;const i=(e,n)=>{let r,s=!0;e.getRegistration(o).then(t=>t??e.register(o,n)).then(function n(a){const{controller:i}=e;if(s=s&&!!i,r=a.installing||a.waiting||a.active,"activated"===r.state){if(s){if(i.scriptURL===o)return rt(st);a.unregister()}location.reload()}else t(r,"statechange",()=>n(a),{once:!0})})};at=(e,t)=>{if(!a){const n=new URL(e,location.href);o=`${n.protocol}//${n.host}${n.pathname}`,i(navigator.serviceWorker,t),a=ot}return a}}}const{setPrototypeOf:dt}=Reflect;let{postMessage:ft}=globalThis;const ht=Ne(),yt=lt.prototype;addEventListener("message",e=>{tt(e);const[t,n,r]=e.data,[s]=e.ports;n&&(dt(s,yt),t&&(ft=pt)),ht.resolve([t,n,r,s])},{once:!0});var mt=async e=>{const[t,n,r,s]=await at().then(()=>ht.promise),o=!!t,a=Ve||!!n,i=e?.transform,c=(e?.decoder||de)(Qe),l=!1!==e?.transfer;let u,p,d,f;if(a){const t=new(n?ut:SharedArrayBuffer)(e?.minByteLength||32767,{maxByteLength:e?.maxByteLength||16777216});u=new Int32Array(t),n?(({wait:f}=ct),it(u)):(({load:p,pause:d,wait:f}=Atomics),d&&(f=(e,t)=>{do{d()}while(p(e,t)<1)}))}const[h,y]=Je(String),m=new Map,g=Xe(null),w=new Proxy(g,{get(e,n){if("then"===n)return;let r=m.get(n);return r||m.set(n,r=(...e)=>{const r=((e,t)=>{let n=qe;return e&&ze.has(t.at(-1)||qe)&&(n=t.pop(),ze.delete(n)),n})(l,e),p=[u,n,i?e.map(i):e];if(a){o?ft({ID:t,data:p},r):s.postMessage(p,r),f(u,0),u[0]=0;const e=u[1]?c(u[1],u.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=h();return p[0]=e,s.postMessage(p,r),t}}),r},set:et});return s.addEventListener("message",async({data:e})=>{"string"==typeof e[0]?y.apply(null,e):(await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,g,i),s.postMessage(e))}),s.start(),{native:Ve,proxy:w,ffi_timeout:r,sync:a,transfer:Ke}};const gt={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n{const t=e||console,n={buffered:At,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return wt.set(t,n),t}}},bt=new TextDecoder,At=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(bt.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},Et=(e,...t)=>gt[typeof e](e,...t),{isArray:kt}=Array,{assign:vt,create:St,defineProperty:$t,entries:xt}=Object,{all:jt,resolve:Bt}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),Mt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function Ft(e){return e.startsWith(".")?Mt(e,this):e}const Pt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},Tt=e=>Function(`\'use strict\';return (${e})`)(),Rt=e=>e.replace(/^(?:\\n|\\r\\n)/,""),Dt=Symbol.for("polyscript.js_modules"),Lt=new Map;$t(globalThis,Dt,{value:Lt}),new Proxy(Lt,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Ot=(e,t)=>!t.startsWith("_"),Ct=(e,t)=>new Proxy(e,{has:Ot,get:(e,n)=>e[t][n]}),It=(e,t)=>import(e).then(e=>{Lt.set(t,{...e})}),Ut=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(vt(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),Ht=e=>/\\.css$/i.test(new URL(e).pathname),Wt=(e,t)=>e.has(t),Nt=e=>[...e.keys()];var Jt=(e,t,n,r)=>{const s=globalThis[Dt];if(n)for(let[e,t]of xt(n)){let n=s.get(t);n&&!kt(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:Wt,ownKeys:Nt,get:(e,s)=>{let o=e.get(s);if(kt(o)){let a=o;o=null;for(let e of a)e=Mt(e,r),Ht(e)?n.importCSS(e):(n.importJS(e,s),o=t[Dt].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const qt=new Map,zt=e=>qt.get(e),Kt=(e,t)=>{try{return Function("require",t)(zt)}catch(t){wt.get(e).stderr(t)}};var Gt={type:"dummy",module:()=>"data:text/javascript,",engine:e=>_t().get(e),registerJSModule(e,t,n){qt.set(t,n)},run:Kt,runAsync:Kt,runEvent:async(e,t,n)=>{try{await Function("require","e",`return ${t}(e)`)(zt,n)}catch(t){wt.get(e).stderr(t)}},transform:(e,t)=>t,writeFile(){}};const Vt=Object.getOwnPropertyDescriptors(Response.prototype),Xt=e=>"function"==typeof e,Yt={get:(e,t)=>Vt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!Xt(r)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,Vt[t]):((e,t)=>Xt(t)?t.bind(e):t)(e,e[t])};var Zt=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),Yt);const Qt=!globalThis.window,en=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):nn(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},tn=e=>{const t=e.split("/");return t.pop(),t.join("/")},nn=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},rn=(e,t)=>{const n=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":n.pop();break;default:n.push(e)}return[e.cwd()].concat(n).join("/").replace(/^\\/+/,"/")},sn=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},on=(e,t)=>Zt(Mt(e,t)).arrayBuffer(),an=(e,t,n,r)=>jt((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${r}, please supply \'to_file\' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(kt(r))return r.map(n=>({url:sn([e,n]),path:sn([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:sn([t,s])}]})})(n).map(({url:n,path:s})=>on(n,r).then(n=>e.writeFile(t,s,n)))),cn=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,ln=(e,t)=>e.replace(/\\{.+?\\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),un=(e,t,n,r)=>jt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of xt(e))if(/^\\{.+\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,ln(o,t))}else{const e=ln(s,t),a=cn(e,ln(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>on(n,r).then(r=>e.writeFile(t,s,r,n)))),pn=({main:e,worker:t},n)=>{const r=[];if(t&&Qt)for(let[e,s]of xt(t))e=Mt(e,n),r.push(It(e,s));if(e&&!Qt)for(let[t,s]of xt(e))t=Mt(t,n),Ht(t)?Ut(t):r.push(It(t,s));return jt(r)},dn=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))},{isNaN:fn,isFinite:hn,isInteger:yn}=Number,{ownKeys:mn}=Reflect,{is:gn}=Object,wn=(e,t,n)=>{const r=n.get(e),s=!r;return s?(se.setUint32(0,t.length,!0),n.set(e,[oe[0],oe[1],oe[2],oe[3]])):t.push(O,r[0],r[1],r[2],r[3]),s},_n=(e,t,n)=>{se.setUint32(0,n,!0),e.push(t,oe[0],oe[1],oe[2],oe[3])},bn=(e,t,n)=>{switch(typeof e){case"number":e&&hn(e)?yn(e)&&e<256&&-1{const t=[];return An=ne,bn(e,t,new Map),t}},kn=new WeakMap,vn=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await un(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await an(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await pn(r.js_modules,s),t("Loaded JS modules"))},Sn=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await kn.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new i(e);return await t.sync(),t},n.JSON=En),e.registerJsModule(t,n)},$n=(e,t)=>{if(e.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},xn=(e,t,...n)=>{try{return e.runPython(Et(t),...n)}catch(t){wt.get(e).stderr(t)}},jn=async(e,t,...n)=>{try{return await e.runPythonAsync(Et(t),...n)}catch(t){wt.get(e).stderr(t)}},Bn=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){wt.get(e).stderr(t)}};var Mn=(new TextEncoder).encode("_F=\'github:\'\\n_E=\'user-agent\'\\n_D=True\\n_C=False\\n_B=\'/\'\\n_A=None\\nfrom uio import StringIO\\nimport sys\\nclass Response:\\n\\tdef __init__(A,f):A.raw=f;A.encoding=\'utf-8\';A._cached=_A\\n\\tdef close(A):\\n\\t\\tif A.raw:A.raw.close();A.raw=_A\\n\\t\\tA._cached=_A\\n\\t@property\\n\\tdef content(self):\\n\\t\\tA=self\\n\\t\\tif A._cached is _A:\\n\\t\\t\\ttry:A._cached=A.raw.read()\\n\\t\\t\\tfinally:A.raw.close();A.raw=_A\\n\\t\\treturn A._cached\\n\\t@property\\n\\tdef text(self):return str(self.content,self.encoding)\\n\\tdef json(A):import ujson;return ujson.loads(A.content)\\nHEADERS_TO_IGNORE=_E,\\ntry:import js\\nexcept Exception as err:raise OSError(\'This version of urequests can only be used in the browser\')\\nHEADERS_TO_IGNORE=_E,\\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\\n\\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\\n\\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\\n\\telse:A.open(D,url,_C)\\n\\tfor(F,J)in headers.items():\\n\\t\\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\\n\\tif E:A.timeout=int(E*1000)\\n\\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader(\'Content-Type\',\'application/json\')\\n\\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\\ndef get(url,**A):return request(\'GET\',url,**A)\\n_PACKAGE_INDEX=const(\'https://micropython.org/pi/v2\')\\n_CHUNK_SIZE=128\\ndef _ensure_path_exists(path):\\n\\timport os;A=path.split(_B)\\n\\tif not A[0]:A.pop(0);A[0]=_B+A[0]\\n\\tB=\'\'\\n\\tfor C in range(len(A)-1):\\n\\t\\tB+=A[C]\\n\\t\\ttry:os.stat(B)\\n\\t\\texcept:os.mkdir(B)\\n\\t\\tB+=_B\\ndef _chunk(src,dest):\\n\\tA=memoryview(bytearray(_CHUNK_SIZE))\\n\\twhile _D:\\n\\t\\tB=src.readinto(A)\\n\\t\\tif B==0:break\\n\\t\\tdest(A if B==_CHUNK_SIZE else A[:B])\\ndef _check_exists(path,short_hash):\\n\\tA=short_hash;import os\\n\\ttry:\\n\\t\\timport binascii as C,hashlib as D\\n\\t\\twith open(path,\'rb\')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],\'utf-8\');return F==A\\n\\texcept:return _C\\ndef _rewrite_url(url,branch=_A):\\n\\tB=branch;A=url\\n\\tif not B:B=\'HEAD\'\\n\\tif A.startswith(_F):A=A[7:].split(_B);A=\'https://raw.githubusercontent.com/\'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\\n\\treturn A\\ndef _download_file(url,dest):\\n\\tB=dest;A=get(url)\\n\\ttry:\\n\\t\\tif A.status_code!=200:print(\'Error\',A.status_code,\'requesting\',url);return _C\\n\\t\\tprint(\'Copying:\',B);_ensure_path_exists(B)\\n\\t\\twith open(B,\'wb\')as C:_chunk(A.raw,C.write)\\n\\t\\treturn _D\\n\\tfinally:A.close()\\ndef _install_json(package_json_url,index,target,version,mpy):\\n\\tK=\'File not found: {} {}\';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\\n\\ttry:\\n\\t\\tif E.status_code!=200:print(\'Package not found:\',G);return _C\\n\\t\\tF=E.json()\\n\\tfinally:E.close()\\n\\tfor(A,C)in F.get(\'hashes\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif _check_exists(B,C):print(\'Exists:\',B)\\n\\t\\telse:\\n\\t\\t\\tL=\'{}/file/{}/{}\'.format(H,C[:2],C)\\n\\t\\t\\tif not _download_file(L,B):print(K.format(A,C));return _C\\n\\tfor(A,J)in F.get(\'urls\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\\n\\tfor(M,N)in F.get(\'deps\',()):\\n\\t\\tif not _install_package(M,H,D,N,mpy):return _C\\n\\treturn _D\\ndef _install_package(package,index,target,version,mpy):\\n\\tD=index;C=target;B=version;A=package\\n\\tif A.startswith(\'http://\')or A.startswith(\'https://\')or A.startswith(_F):\\n\\t\\tif A.endswith(\'.py\')or A.endswith(\'.mpy\'):print(\'Downloading {} to {}\'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\\n\\t\\telse:\\n\\t\\t\\tif not A.endswith(\'.json\'):\\n\\t\\t\\t\\tif not A.endswith(_B):A+=_B\\n\\t\\t\\t\\tA+=\'package.json\'\\n\\t\\t\\tprint(\'Installing {} to {}\'.format(A,C))\\n\\telse:\\n\\t\\tif not B:B=\'latest\'\\n\\t\\tprint(\'Installing {} ({}) from {} to {}\'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,\'_mpy\')else\'py\';A=\'{}/package/{}/{}/{}.json\'.format(D,\'py\',A,B)\\n\\treturn _install_json(A,D,C,B,mpy)\\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\\n\\tB=target;A=index\\n\\tif not B:\\n\\t\\tfor C in sys.path:\\n\\t\\t\\tif C.endswith(\'/lib\'):B=C;break\\n\\t\\telse:print(\'Unable to find lib dir in sys.path\');return\\n\\tif not A:A=_PACKAGE_INDEX\\n\\tif _install_package(package,A.rstrip(_B),B,version,mpy):print(\'Done\')\\n\\telse:print(\'Package may be partially installed\')");const Fn=async e=>(await import("./toml-BK2RWy-G.js")).parse(e);async function Pn(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function Tn(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await Rn(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument \'fileSystemHandle\' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):nn(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path \'${e}\' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path \'${e}\' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory \'${e}\' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await Pn(t,!0),{syncfs:async()=>await Pn(t,!1)}}}const Rn=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:Dn}=JSON,Ln=(e,t)=>new URL(e,t).href,On=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},Cn=(e,t,n)=>{for(const r in t)On(e,Ln(r,n),t[r])},In=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},Cn(e[n],s,r))},Un=async(e,t=e.packages,n=new Set)=>{const r=[];for(const s of t){if(n.has(s))continue;n.add(s);const t=s.endsWith(".toml");if(t||s.endsWith(".json")){const o=await Zt(s).text(),{name:a,files:i,js_modules:c,packages:l}=t?await Fn(o):Dn(o);if(n.has(a))throw new Error(`Unable to process ${a} @ ${s}`);n.add(a),l&&r.push(...await Un(e,l,n)),c&&(e.js_modules??={},In(e.js_modules,c,"main",s),In(e.js_modules,c,"worker",s)),i&&(e.files??={},Cn(e.files,i,s))}else r.push(s)}return r},Hn=(e,t)=>{try{e.mkdir(t)}catch(e){}},Wn=dn("mpy");var Nn={type:"micropython",module:(e="1.27.0-preview-283")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=_t({stderr:At(console.error),stdout:At(console.log)});n=n.replace(/\\.m?js$/,".wasm"),Wn("Loading MicroPython");const i=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n}));globalThis[Dt].set("-T-",this.transform.bind(this,i));const c=Jn.bind(this,i,r);return kn.set(i,c),await vn(this,Wn,i,t,r),this.writeFile(i,"./mip.py",Mn),t.packages&&(t.experimental_remote_packages&&(Wn("Loading remote packages"),t.packages=await Un(t),Wn("Loaded remote packages")),Wn("Loading packages"),await c(t.packages.map(Ft,r)),Wn("Loaded packages")),Wn("Loaded MicroPython"),i.mountNativeFS||(i.mountNativeFS=Tn(i._module)),i},registerJSModule:Sn,run:xn,runAsync:jn,runEvent:Bn,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=$n(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-D8wJncBv.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)Hn(s,i);else{Hn(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return en(i,t,n),void e.runPython(`\\n import os, gzip, tarfile\\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\\n for f in tar:\\n name = f"${r}{f.name}"\\n if f.type == tarfile.DIRTYPE:\\n if f.name != "./":\\n os.mkdir(name.strip("/"))\\n else:\\n dir = os.path.dirname(name)\\n if not os.path.exists(dir):\\n os.mkdir(dir)\\n source = tar.extractfile(f)\\n with open(name, "wb") as dest:\\n dest.write(source.read())\\n dest.close()\\n tar.close()\\n os.remove("${t}")\\n `)}}}return en(i,t,n)}};async function Jn(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=Mt(s,t),r=await Zt(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const qn={dict_converter:Object.fromEntries},{stringify:zn}=JSON,{apply:Kn}=Reflect,Gn=Function.prototype,Vn=e=>function(...t){return Kn(e,this,t)};let Xn,Yn;const Zn=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},n,r,s){Qn("Loading Pyodide");let{packages:o,index_urls:a}=n;o&&(o=o.map(Ft,s)),Qn("Loading Storage");const c=r.slice(0,r.lastIndexOf("/")),l=new i(`${c}@${t}`),u={indexURL:c},p="never"!==n.packages_cache&&"0.28.0"!==t;if(await l.sync(),Qn("Loaded Storage"),p||l.clear(),o&&(n.experimental_remote_packages&&(Qn("Loading remote packages"),n.packages=o=await Un(n,o),Qn("Loaded remote packages")),p))if("passthrough"===n.packages_cache)u.packages=o,o=null,l.clear();else{o=o.sort();const e=zn(o);if(l.has(e)){const n=l.get(e);if(u.packages=o.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});u.lockFileURL=URL.createObjectURL(e)}else u.lockFileContents=n;o=null}}const{stderr:d,stdout:f,get:h}=_t();Qn("Loading interpreter");const y=await h(e({stderr:d,stdout:f,...u}));Qn("Loaded interpreter"),globalThis[Dt].set("-T-",this.transform.bind(this,y)),n.debug&&y.setDebug(!0);const m=rr.bind(y);return a&&er.set(y,a),kn.set(y,m),await vn(this,Qn,y,n,s),o&&await m(o,l,p),await l.close(),u.lockFileURL&&URL.revokeObjectURL(u.lockFileURL),Qn("Loaded Pyodide"),"auto"===n.experimental_create_proxy&&(y.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:y.toPy({})}),Yn=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Xn]=Reflect.ownKeys(Yn).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),Zn(!0)),y},registerJSModule:Sn,run:Vn(xn),runAsync:Vn(jn),runEvent:Vn(Bn),transform:(e,t)=>Kn(nr,e,[t]),writeFile:(e,t,n,r)=>{const s=$n(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return en({FS:o,PATH:a,PATH_FS:i},t,n)}};function nr(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(qn);if(e instanceof Map)return new Map([...e.entries()]);if(kt(e))return e.map(nr,this)}return e}async function rr(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,Qn(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(er.has(this)&&o.set_index_urls(er.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof i){const n=o.freeze();t.set(zn(e),n)}o.destroy()}const sr="ruby-wasm-wasi",or=sr.replace(/\\W+/g,"_");var ar={type:sr,experimental:!0,module:(e="2.7.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${e}/dist/browser/+esm`,async engine({DefaultRubyVM:e},t,n,r){n=n.replace(/\\/browser\\/\\+esm$/,"/ruby.wasm");const s=await Zt(n).arrayBuffer(),o=await WebAssembly.compile(s),{vm:a}=await e(o);return t.files&&await un(this,a,t.files,r),t.fetch&&await an(this,a,t.fetch,r),t.js_modules&&await pn(t.js_modules,r),a},registerJSModule(e,t,n){t=t.replace(/\\W+/g,"__");const r=`__module_${or}_${t}`;globalThis[r]=n,this.run(e,`require "js";$${t}=JS.global[:${r}]`),delete globalThis[r]},run:(e,t,...n)=>e.eval(Et(t),...n),runAsync:(e,t,...n)=>e.evalAsync(Et(t),...n),async runEvent(e,t,n){if(/^xworker\\.(on\\w+)$/.test(t)){const{$1:t}=RegExp,r=`__module_${or}_event`;globalThis[r]=n,this.run(e,`require "js";$xworker.call("${t}",JS.global[:${r}])`),delete globalThis[r]}else{const r=this.run(e,`method(:${t})`);await r.call(t,e.wrap(n))}},transform:(e,t)=>t,writeFile:()=>{throw new Error(`writeFile is not supported in ${sr}`)}};var ir={type:"wasmoon",module:(e="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},n,r,s){const{stderr:o,stdout:a,get:i}=_t(),c=await i((new e).createEngine());return c.global.getTable(t.Base,e=>{c.global.setField(e,"print",a),c.global.setField(e,"printErr",o)}),n.files&&await un(this,c,n.files,s),n.fetch&&await an(this,c,n.fetch,s),n.js_modules&&await pn(n.js_modules,s),c},registerJSModule:(e,t,n)=>{e.global.set(t,n)},run:(e,t,...n)=>{try{return e.doStringSync(Et(t),...n)}catch(t){wt.get(e).stderr(t)}},runAsync:async(e,t,...n)=>{try{return await e.doString(Et(t),...n)}catch(t){wt.get(e).stderr(t)}},runEvent:async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.global.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){wt.get(e).stderr(t)}},transform:(e,t)=>t,writeFile:({cmodule:{module:{FS:e}}},t,n)=>((e,t,n)=>(nn(e,tn(t)),t=rn(e,t),e.writeFile(t,new Uint8Array(n),{canOwn:!0})))(e,t,n)};const cr=new WeakMap,lr=new FinalizationRegistry(e=>e()),ur=async(e,t)=>{const{shelter:n,destroy:r,io:s}=cr.get(e),{output:o,result:a}=await n.captureR(Et(t));for(const{type:e,data:t}of o)s[e](t);return lr.register(a,r),a};var pr={type:"webr",experimental:!0,module:(e="0.5.6")=>`https://cdn.jsdelivr.net/npm/webr@${e}/dist/webr.mjs`,async engine(e,t,n,r){const{get:s}=_t(),o=new e.WebR;await s(o.init().then(()=>o));const a=await new o.Shelter;return cr.set(o,{module:e,shelter:a,destroy:a.destroy.bind(a),io:wt.get(o)}),t.files&&await un(this,o,t.files,r),t.fetch&&await an(this,o,t.fetch,r),t.js_modules&&await pn(t.js_modules,r),o},registerJSModule(e,t){console.warn(`Experimental interpreter: module ${t} is not supported (yet)`)},run:ur,runAsync:ur,async runEvent(e,t,n){await e.evalRVoid(`${t}(event)`,{env:{event:{type:[n.type]}}})},transform:(e,t)=>t,writeFile:()=>{}};const dr=new Map,fr=new Map,hr=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=dr.get(n),o=/^(?:\\.?\\.?\\/|[a-z0-9-]+:\\/\\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(fr.set(t,e),s(r,e,n,o)))}}),yr=e=>{for(const t of[].concat(e.type))dr.set(t,e)};for(const e of[Gt,Nn,tr,ar,ir,pr])yr(e);const{parse:mr}=JSON,gr=(e,t,n={})=>{const[r,s]=((e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[Mt(e),n]})(e,t);return"json"===s?n=Zt(r).json():"toml"===s?n=Zt(r).text().then(Fn):"string"===s?n=wr(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=wr(n)),[n,e=r]},wr=e=>{try{return mr(e)}catch(t){return Fn(e)}},_r="BeforeRun",br="AfterRun",Ar=[`code${_r}`,`code${_r}Async`,`code${br}`,`code${br}Async`],Er=["onWorker","onReady",`on${_r}`,`on${_r}Async`,`on${br}`,`on${br}Async`];function kr(e,t){const{run:n,runAsync:r}=dr.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const vr=(e,t,n,r,s,o)=>{if(s||o){const a=kr.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let Sr,$r,xr;const jr=(e,t)=>{addEventListener(e,t||(async t=>{try{await Sr,$r(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{proxy:Br,sync:Mr,native:Fr,window:Pr,isWindowProxy:Tr,ffi:Rr}=await(async e=>{const t=await mt({...e,decoder:e?.decoder||de}),n=We({...e,buffer:!0,reflect:t.proxy[l],timeout:t.ffi_timeout});return t.proxy[u]=n.reflect,{...t,window:n.global,isWindowProxy:n.isProxy,ffi:{assign:n.assign,direct:n.direct,evaluate:n.evaluate,gather:n.gather,query:n.query}}})({transfer:!1,transform:e=>xr?xr(e):e}),Dr={polyfill:Mr,sync:Br,window:Fr||Mr?Pr:null,isWindowProxy:Tr,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};jr("message",({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{Sr=(async()=>{try{const{id:o,tag:c,type:l,custom:u,version:p,config:d,async:f}=e,h=((e,t="")=>`${e}@${t}`.replace(/@$/,""))(l,p),y=await((e,t,n,r={})=>(t&&([r,t]=gr(t,n,r)),Bt(r).then(n=>hr[e](n,t))))(h,t,n,d),{js_modules:m}=fr.get(h),g=m?.main,w=St(dr.get(l)),_=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:wt.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(w,u||l,d||{},y);let b="run";if(f&&(b+="Async"),s){let e,t,n="",r="";for(const e of Ar){const t=s[e];if(t){const s=e.endsWith("Async");(s&&f||!s&&!f)&&(e.startsWith("codeBefore")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,Rt(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,Rt(t),...o);return r&&await s(e,r,...o),a}})(w,b,n,r);for(const n of Er.slice(2)){const r=s[n];if(r){const s=n.endsWith("Async");if(s&&f||!s&&!f){const s=Tt(r);n.startsWith("onBefore")?e=s:t=s}}}vr(w,_,Dr,f,e,t)}let A,E,k,v=null,S="";(Fr||Mr)&&(({CustomEvent:A,document:E}=Pr),v=o&&E.getElementById(o)||null,k=e=>Pt(v,u||l,e,!0,A));const $=Jt(Pr,Br,g,t);if(((e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,Ct(r,e));t.registerJSModule(n,s,r)})(l,w,y,$),w.registerJSModule(y,"polyscript",{IDBMap:a,IDBMapSync:i,xworker:Dr,currentScript:v,config:_.config,js_modules:$,ffi:Rr,get target(){return!S&&v&&("SCRIPT"===c?v.after(vt(Pr.document.createElement(`script-${u||l}`),{id:S=`${o}-target`})):(S=o,v.replaceChildren(),v.style.display="block")),S}}),$r=w.runEvent.bind(w,y),xr=w.transform.bind(w,y),v&&k("ready"),s?.onReady&&Tt(s?.onReady).call(w,kr.call(w,_,y),Dr),await w[b](y,r),["micropython","pyodide"].includes(w.type)){const e="polyscript",t=`__${e}_workers__`,n="__export__";y.runPython([`import js as ${t}`,`${t}.${t} = "${n}" in locals() and ${n} or []`,`del ${t}`].join("\\n"));const r=[...globalThis[t]];delete globalThis[t],r.length&&y.runPython([`from ${e} import xworker as ${t}`,...r.map(e=>`${t}.sync.${e} = ${e}`),`del ${t}`].join("\\n"))}return v&&k("done"),postMessage("polyscript:done"),y}catch(e){postMessage(e)}})(),jr("error"),jr("message"),jr("messageerror"),(Fr||Mr)&&addEventListener("py:progress",({type:e,detail:t})=>{Pr.dispatchEvent(new Pr.CustomEvent(e,{detail:t}))})});\n'.replace(qt,zt)],{type:"text/javascript"})),...e))({serviceWorker:n?.serviceWorker||n?.service_worker,reflected_ffi_timeout:globalThis.reflected_ffi_timeout??-1}),{postMessage:a}=s,i=this instanceof ps,c=dn(s.proxy,{importJS:Pn,importCSS:Dn}),l=h();let u=o(t).text().then(e=>{const t=i?this.toJSON():void 0;a.call(s,{options:n,config:r,code:e,hooks:t})}).then(()=>{u={then:e=>e()}});return yn(s,{sync:{value:c},ready:{value:l.promise},postMessage:{value:(e,...t)=>u.then(()=>a.call(s,e,...t))},onerror:{writable:!0,configurable:!0,value:console.error}}),s.addEventListener("message",e=>{const{data:t}=e,n=t instanceof Error;(n||"polyscript:done"===t)&&(e.stopImmediatePropagation(),n?(l.reject(t),s.onerror(hn(e,{type:{value:"error"},error:{value:t}}))):l.resolve(s))}),i&&this.onWorker?.(this.interpreter,s),s};const ds="Invalid content",hs="Invalid worker attribute",ys="Invalid worker attribute";var ms=e=>{const{src:t,worker:n}=e.attributes;if(n){let{value:r}=n;if(r)throw new SyntaxError(ys);if(r=t?.value,!r){if(t)throw new SyntaxError(hs);if(e.childElementCount){const{innerHTML:t,localName:n,type:s}=e,o=s||n.replace(/-script$/,"");r=pn(t),console.warn(`Deprecated: use `; + document.head.innerHTML = ``; await tick(); assert(pyodide.content, dedent(content)); assert(pyodide.target.tagName, "PYODIDE-SCRIPT"); diff --git a/test/integration.html b/test/integration.html index 0c42b0a7..0b7f60b0 100644 --- a/test/integration.html +++ b/test/integration.html @@ -5,5 +5,5 @@ polyscript integration tests - + diff --git a/test/integration/interpreter/pyodide/packages.html b/test/integration/interpreter/pyodide/packages.html new file mode 100644 index 00000000..61b28e87 --- /dev/null +++ b/test/integration/interpreter/pyodide/packages.html @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/test/integration/interpreter/pyodide/packages.toml b/test/integration/interpreter/pyodide/packages.toml new file mode 100644 index 00000000..3a9d8d7d --- /dev/null +++ b/test/integration/interpreter/pyodide/packages.toml @@ -0,0 +1 @@ +packages = ['unknown_package_name'] diff --git a/test/integration/pyodide.js b/test/integration/pyodide.js index 0b36c0cf..410b73e2 100644 --- a/test/integration/pyodide.js +++ b/test/integration/pyodide.js @@ -13,6 +13,19 @@ export default (playwright, baseURL) => { test('Pyodide config as JSON', python.configAsJSON(playwright, baseURL)); + test('Pyodide unknown package', async ({ page }) => { + const errors = []; + page.on('console', message => { + if (message.type() === 'error') { + errors.push(message.text()); + } + }); + await page.goto(`${baseURL}/packages.html`); + await page.waitForSelector('html.error'); + await expect(errors.length).toBe(1); + await expect(errors[0]).toBe('These packages are not supported in Pyodide 0.29.0: unknown_package_name'); + }); + test('Pyodide config with passthrough', async ({ page }) => { // Test that a config passed as object works out of the box. const logs = []; diff --git a/versions/pyodide b/versions/pyodide index b79f04f4..ae6dd4e2 100644 --- a/versions/pyodide +++ b/versions/pyodide @@ -1 +1 @@ -0.28.3 +0.29.0 From cefdff09bb3c47b8265c3f12715d86b9c947798a Mon Sep 17 00:00:00 2001 From: webreflection Date: Tue, 21 Oct 2025 11:16:02 +0200 Subject: [PATCH 2/3] 0.19.4 --- docs/index.js | 2 +- docs/index.js.map | 2 +- esm/interpreter/pyodide.js | 36 +++++++++++++++++++----------------- package-lock.json | 4 ++-- package.json | 4 ++-- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/docs/index.js b/docs/index.js index feedfb97..e1994ce9 100644 --- a/docs/index.js +++ b/docs/index.js @@ -1,2 +1,2 @@ -const t=(t,e=document)=>[...e.querySelectorAll(t)],e=(t,e=document)=>{const s=(new XPathEvaluator).createExpression(t).evaluate(e,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),o=[];for(let t=0,{snapshotLength:e}=s;t"function"==typeof t,r={get:(t,e)=>s.hasOwnProperty(e)?((t,e,{get:s,value:r})=>s||!o(r)?t.then(t=>t[e]):(...s)=>t.then(t=>t[e](...s)))(t,e,s[e]):((t,e)=>o(e)?e.bind(t):e)(t,t[e])};var i=(t,...e)=>new Proxy(fetch(t,...e).then(e=>e.ok?e:Promise.reject(new Error(`[${e.status}] Unable to fetch ${t}`))),r);const{assign:a}=Object,n="entries",p="readonly",c="readwrite",l={durability:"default",prefix:"IDBMap"},y=({target:{result:t}})=>t;class d extends EventTarget{#t;#e;#s;async#o(t,e){const s=(await this.#t).transaction(n,e,this.#e);return new Promise((e,o)=>a(t(s.objectStore(n)),{onsuccess:e,onerror:o}))}constructor(t,{durability:e=l.durability,prefix:s=l.prefix}=l){super(),this.#s=s,this.#e={durability:e},this.#t=new Promise((e,s)=>{a(indexedDB.open(`${this.#s}/${t}`),{onupgradeneeded({target:{result:t,transaction:s}}){t.objectStoreNames.length||t.createObjectStore(n),s.oncomplete=()=>e(t)},onsuccess(t){e(y(t))},onerror(t){s(t),this.dispatchEvent(t)}})}).then(t=>{const e=this.dispatchEvent.bind(this);for(const s in t)s.startsWith("on")&&(t[s]=e);return t})}dispatchEvent(t){const{type:e,message:s,isTrusted:o}=t;return super.dispatchEvent(o?a(new Event(e),{message:s}):t)}async close(){(await this.#t).close()}get size(){return this.#o(t=>t.count(),p).then(y)}async clear(){await this.#o(t=>t.clear(),c)}async delete(t){await this.#o(e=>e.delete(t),c)}async entries(){const t=await this.keys();return Promise.all(t.map(t=>this.get(t).then(e=>[t,e])))}async forEach(t,e=this){for(const[s,o]of await this.entries())await t.call(e,o,s,this)}async get(t){return await this.#o(e=>e.get(t),p).then(y)}async has(t){return void 0!==await this.#o(e=>e.getKey(t),p).then(y)}async keys(){return await this.#o(t=>t.getAllKeys(),p).then(y)}async set(t,e){return await this.#o(s=>s.put(e,t),c),this}async values(){const t=await this.keys();return Promise.all(t.map(t=>this.get(t)))}get[Symbol.toStringTag](){return this.#s}}class u extends Map{#r;#i;constructor(...t){super(),this.#r=new d(...t),this.#i=this.#r.entries().then(t=>{for(const[e,s]of t)super.set(e,s)})}async close(){await this.#i,await this.#r.close()}async sync(){await this.#i}clear(){return this.#i=this.#i.then(()=>this.#r.clear()),super.clear()}delete(t){return this.#i=this.#i.then(()=>this.#r.delete(t)),super.delete(t)}set(t,e){return this.#i=this.#i.then(()=>this.#r.set(t,e)),super.set(t,e)}}var m=Promise.withResolvers.bind(Promise);const h=new Proxy(new Map,{get:(t,e)=>(t.has(e)||t.set(e,m()),t.get(e))}),g=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),f=new Proxy(Object.freeze({}),{get:(t,e)=>"string"!=typeof e||g.has(e)?void 0:h[e].promise.then(t=>t.sync)});let b=0;const w=b++,k=b++,x=b++,_=b++,v=b++,j=b++,z=b++,A=b++,E=b++,P=b++,S=b++,$=b++,M=b++,R=b++,q=b++;b++;const B=b++,F=b++;const D=globalThis.ImageData||class{},T=new Map(Reflect.ownKeys(Symbol).map(t=>[Symbol[t],`@${String(t)}`])),L=t=>{switch(t[0]){case"@":return Symbol[t.slice(1)];case"#":return Symbol.for(t.slice(1));case"!":return Symbol(t.slice(1));default:return Symbol()}},O=t=>T.get(t)||((t,e)=>void 0===e?"?":void 0===Symbol.keyFor(t)?`!${e}`:`#${e}`)(t,t.description),C=Object.defineProperty,I=Object.assign,W=Array.from,J=Array.isArray,U=ArrayBuffer.isView,H=(t,e)=>[t,e],N=t=>t,K={},G=t=>(e,s=new Map)=>{for(let o=0,r=e.length;o0===t?e:L(e),V=t=>"string"==typeof t?H(0,t):H(16,O(t)),Y=(t,e)=>{for(let s=t.push,o=0,r=e.length;oe in globalThis?e:st(Z(Q(t.constructor),[0])),ot=(t,e)=>[e?t:W(new Uint8Array(t)),t.resizable?t.maxByteLength:0],rt=/\[('|")?(.+?)\1\]/g,it=(t,e)=>t?.[e];var at=(t,e)=>e.replace(rt,".$2").split(".").reduce(it,t),nt=(t,...e)=>e.map(pt,t);function pt(t){return"string"==typeof t?at(this,t):this[t]}const ct=globalThis.Node||class{},{apply:lt,construct:yt,defineProperty:dt,deleteProperty:ut,get:mt,getOwnPropertyDescriptor:ht,getPrototypeOf:gt,has:ft,isExtensible:bt,ownKeys:wt,set:kt,setPrototypeOf:xt}=Reflect;var _t=({reflect:t=N,transform:e=N,remote:s=N,module:o=t=>import(t),buffer:r=!1,timeout:i=-1}=K)=>{const a=(e,o=new Map)=>{if(!J(e))return e;const[r,i]=e;switch(r){case 2:{if(null===i)return globalThis;let t=o.get(e);if(!t){t=i,o.set(e,i);for(const t in i)i[t]=a(i[t],o)}return t}case 4:return o.get(e)||(o.set(e,i),p(i,o));case 8:{let e=f.get(i),o=e?.deref();return o||(e&&T.unregister(e),o=function(...e){s.apply(this,e);for(let t=0,s=e.length;t{switch(typeof t){case"object":{if(null===t)break;if(t===globalThis)return b;const s=e(t);return W&&C.has(s)||s instanceof D?H(0,s):U(s)?H(68,((t,e)=>{const{BYTES_PER_ELEMENT:s,byteOffset:o,buffer:r,length:i}=t;return[st(t),ot(r,e),o,i!==(r.byteLength-o)/s?i:0]})(s,r)):s instanceof ArrayBuffer?H(64,ot(s,r)):H(J(s)?5:3,d(s))}case"function":return H(9,d(e(t)));case"symbol":return H(16,O(t));case"bigint":return H(32,t.toString())}return t},p=G(a),c=G(X),l=G(V),{clear:y,id:d,ref:u,unref:m}=((t=0,e=new Map,s=new Map)=>({clear:()=>{e.clear(),s.clear()},id:o=>{let r=s.get(o);if(void 0===r){for(;e.has(r=t++););e.set(r,o),s.set(o,r)}return r},ref:t=>e.get(t),unref:t=>(s.delete(e.get(t)),e.delete(t))}))(),h=/^(?:[0-9]+|length)$/,g=-1{f.delete(e),t(w,e)});let C,W=!1;return{assign:I,gather:nt,query:at,direct:t=>(W||(W=!0,C=new WeakSet),C.add(t),t),evaluate:(t,...e)=>lt(t,null,e),reflect(t,e,...s){const r=null===e,i=r?globalThis:u(e);switch(t){case P:{const t=X(s[0]),e=r&&"import"===t,a=e?o:mt(i,t),p=n(a);if(!g)return p;let c,l=e,y=i;if(!e&&!(y instanceof ct||J(y)&&"string"==typeof t&&h.test(t)))if(t in i){for(;!(c=ht(y,t))&&(y=gt(y),y););l=!!c&&"value"in c}else l=!0;return[l,p]}case j:{const t=new Map;return n(lt(i,a(s[0],t),p(s[1],t)))}case B:return kt(i,X(s[0]),a(s[1]));case M:return ft(i,X(s[0]));case q:return l(wt(i),f);case z:return n(yt(i,p(s[0])));case S:{const t=ht(i,X(s[0]));if(t)for(const e in t)t[e]=n(t[e]);return t}case A:return dt(i,X(s[0]),a(s[1]));case E:return ut(i,X(s[0]));case $:return n(gt(i));case F:return xt(i,a(s[0]));case k:return void I(i,a(s[0]));case x:{const t=a(s[0]),e=Function(`return(${t}).apply(null,arguments)`);return n(lt(e,null,p(s[1])))}case _:for(let t,e=0,o=(s=c(s[0],f)).length;e{const o=s.get(t),r=!o;return r?(se.setUint32(0,e.length,!0),s.set(t,[oe[0],oe[1],oe[2],oe[3]])):e.push(Yt,o[0],o[1],o[2],o[3]),r},le=(t,e,s)=>{se.setUint32(0,s,!0),t.push(e,oe[0],oe[1],oe[2],oe[3])},ye=(t,e,s)=>{switch(typeof t){case"number":t&&ie(t)?ae(t)&&t<256&&-1(s,o)=>{const r=new e(o,t);de=e.push,ye(s,r,new Map);const i=r.length;return r.sync(!0),i},me="a27fb202",he="="+me,ge="-"+me;var fe=(t=t=>t)=>{const e=new Map;let s=0;return[()=>{let o;do{o=t(s++)}while(e.has(o));const r=m();return e.set(o,r),[o,r.promise]},(t,s,o)=>{const r=e.get(t);e.delete(t),o?r?.reject(o):r?.resolve(s)}]};const be=[],we=new WeakSet,ke=(...t)=>(we.add(t),t);let{SharedArrayBuffer:xe}=globalThis,_e=!0;try{new xe(4,{maxByteLength:8})}catch(t){_e=!1,xe=class extends ArrayBuffer{get growable(){return super.resizable}grow(t){super.resize(t)}}}const{assign:ve,create:je}=Object,ze=`coincident-${_e?crypto.randomUUID():Math.random().toString(36).substring(2)}`,Ae={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},Ee=(t,e,s)=>{const o="then"!==e;return o&&(t[e]=s),o},Pe=t=>{t.stopImmediatePropagation(),t.preventDefault()},Se=(t,e=-1)=>t?.reflected_ffi_timeout??e,{defineProperty:$e}=Object,[Me,Re]=fe();let[qe,Be]=Me(),Fe=()=>Be,{Atomics:De,MessageChannel:Te,Worker:Le}=globalThis;if(_e)Re(qe);else{const t=new Map,e=(t,...e)=>{t.addEventListener(...e)};if("importScripts"in globalThis){e(globalThis,"message",t=>{Pe(t),Re(qe,t.data)},{once:!0});const{wait:s}=De,{parse:o}=JSON,r=e=>{const s=new XMLHttpRequest;try{if(s.timeout=3e3,s.open("POST",`${n}?sabayon`,!1),s.setRequestHeader("Content-Type","application/json"),s.send(`["${a}",${t.get(e)}]`),200===s.status)return s;throw s}catch{return s.abort(),r(e)}},i=(t,e)=>(t.set(o(e.responseText)),"ok");let a,n;De={wait:(e,...o)=>t.has(e)?i(e,r(e)):s(e,...o)},Be=Be.then(t=>{[a,n]=t})}else{const s=[ze,Math.random()].join("-").replace(/\W/g,"-"),o=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");o.onmessage=async e=>{const[r,i,a]=e.data;if(i===s)for(const[e,[s,i]]of t)if(s===a){await i.promise;let t=e.length;for(;t--&&!e[t];);o.postMessage([r,e.slice(0,t+1)]);break}};const r=e=>{const[s,o,r]=e.data;t.set(o,[s,m()]),$e(e,"data",{value:r})};Te=class extends Te{constructor(){super(),e(this.port1,"message",r)}},Le=class extends Le{constructor(t,e){super(t,e),super.postMessage([s,a])}};const{notify:i}=De;De={notify(e,...s){const o=t.get(e);return o?(o[1].resolve(),0):i(e,...s)}};let a="",n=null;const p=(t,s)=>{let o,r=!0;t.getRegistration(a).then(e=>e??t.register(a,s)).then(function s(i){const{controller:n}=t;if(r=r&&!!n,o=i.installing||i.waiting||i.active,"activated"===o.state){if(r){if(n.scriptURL===a)return Re(qe);i.unregister()}location.reload()}else e(o,"statechange",()=>s(i),{once:!0})})};Fe=(t,e)=>{if(!n){const s=new URL(t,location.href);a=`${s.protocol}//${s.host}${s.pathname}`,p(navigator.serviceWorker,e),n=Be}return n}}}const Oe="InstallTrigger"in globalThis?ze:"",Ce=t=>t,Ie=t=>t===he?"main":t===ge?"worker":t;class We extends Event{#a;constructor(t){super("message"),this.#a=t}get data(){return this.#a}}var Je=t=>{const e=t?.transform,s=Se(t),o=(t?.encoder||ue)(Ae),r=!1!==t?.transfer;return{Worker:class extends Le{constructor(t,i){const a=_e?"":i?.serviceWorker||"",{notify:n}=a?De:Atomics,{port1:p,port2:c}=new(a?Te:MessageChannel),[l,y]=fe(Ce),d=new Map,u=je(null);a&&Fe(a);let m="";super(t,ve({type:"module"},i)),this.proxy=new Proxy(u,{get:(t,s)=>{if("then"===s)return;let o=d.get(s);return o||d.set(s,o=(...t)=>{const o=((t,e)=>{let s=be;return t&&we.has(e.at(-1)||be)&&(s=e.pop(),we.delete(s)),s})(r,t),[i,a]=l();return p.postMessage([i,s,e?t.map(e):t],o),((t,e)=>{if(m){const s=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${Ie(m)}() awaiting proxy.${Ie(e)}() ?`);t=t.then(t=>(clearTimeout(s),t),t=>(clearTimeout(s),Promise.reject(t)))}return t})(a,s)}),o},set:Ee}),Oe&&(_e||a)&&super.addEventListener("message",t=>{const{data:e}=t;e?.ID===Oe&&(Pe(t),p.dispatchEvent(new We(e.data)))}),super.postMessage([Oe,a,Se(i,s)],[c]),p.addEventListener("message",async({data:t})=>{const s=t[0],r=typeof s;if("number"===r)y.apply(null,t);else if(m=t[1],await(async(t,e,s)=>{try{const o=await e[t[1]].apply(null,t[2]);t[1]=s?s(o):o,t[2]=null}catch(e){t[2]=e}})(t,u,e),m="","string"===r)p.postMessage(t);else{const e=t[2]||t[1];s[1]=void 0===e?0:o(e,s.buffer),s[0]=1,n(s,0)}}),p.start()}},native:_e,transfer:ke}};const{url:Ue}=import.meta,He=/import\((['"])([^)]+?\.js)\1\)/g,Ne=(t,e,s)=>`import(${e}${new URL(s,Ue).href}${e})`,Ke=Symbol.for("polyscript.js_modules");let Ge;const{Worker:Xe}=(t=>{const e=t?.import,s=Se(t),o=Je({...t,encoder:t?.encoder||ue});class r extends o.Worker{#n;constructor(t,o){const{proxy:r}=super(t,o),i=_t({...o,buffer:!0,reflect:r[ge],timeout:Se(o,s),remote(t){t instanceof Event&&(t=>{const{currentTarget:e,target:s,type:o}=t,r=jt.get(e||s)?.get(o);if(r)for(const e of r)t[e]()})(t)},module:o?.import||e||(t=>import(new URL(t,location).href))});this.#n=i.terminate,this.ffi={assign:i.assign,direct:i.direct,evaluate:i.evaluate,gather:i.gather,query:i.query},r[he]=i.reflect}terminate(){this.#n(),super.terminate()}}return{...o,Worker:r}})({transfer:!1,transform:t=>(Ge||(Ge=globalThis[Ke]?.get("-T-")))?.(t)??t});const Ve=new WeakMap,Ye=t=>{const e=t||console,s={buffered:Ze,stderr:(e.stderr||console.error).bind(e),stdout:(e.stdout||console.log).bind(e)};return{stderr:(...t)=>s.stderr(...t),stdout:(...t)=>s.stdout(...t),async get(t){const e=await t;return Ve.set(e,s),e}}},Qe=new TextDecoder,Ze=(t,e=10)=>{const s=[];return o=>{if(o instanceof Uint8Array)for(const r of o)r===e?t(Qe.decode(new Uint8Array(s.splice(0)))):s.push(r);else t(o)}},ts=new Map,es=t=>ts.get(t),ss=(t,e)=>{try{return Function("require",e)(es)}catch(e){Ve.get(t).stderr(e)}};var os={type:"dummy",module:()=>"data:text/javascript,",engine:t=>Ye().get(t),registerJSModule(t,e,s){ts.set(e,s)},run:ss,runAsync:ss,runEvent:async(t,e,s)=>{try{await Function("require","e",`return ${e}(e)`)(es,s)}catch(e){Ve.get(t).stderr(e)}},transform:(t,e)=>e,writeFile(){}};const rs={object(...t){return this.string(function(t){for(var e=t[0],s=1,o=arguments.length;s",">":">","'":"'","'":"'",""":'"',""":'"'},ps=t=>ns[t],cs=(t,...e)=>rs[typeof t](t,...e),ls=t=>is.call(t,as,ps),{isArray:ys}=Array,{assign:ds,create:us,defineProperties:ms,defineProperty:hs,entries:gs}=Object,{all:fs,resolve:bs}=new Proxy(Promise,{get:(t,e)=>t[e].bind(t)}),ws=(t,e=location.href)=>new URL(t,e.replace(/^blob:/,"")).href;function ks(t){return t.startsWith(".")?ws(t,this):t}let xs=0;const _s=(t,e)=>({id:t.id||(t.id=`${e}-w${xs++}`),tag:t.tagName}),vs=(t,e,s,o=!1,r=CustomEvent)=>{t.dispatchEvent(new r(`${e}:${s}`,{bubbles:!0,detail:{worker:o}}))},js=(t,e,s,o)=>({type:e,config:s,interpreter:o,io:Ve.get(o),run:(e,...s)=>t.run(o,e,...s),runAsync:(e,...s)=>t.runAsync(o,e,...s),runEvent:(...e)=>t.runEvent(o,...e)}),zs=t=>t.replace(/^(?:\n|\r\n)/,""),As=(t,e,s,o)=>{const r=t[e].bind(t);t[e]="run"===e?(t,e,...i)=>{s&&r(t,s,...i);const a=r(t,zs(e),...i);return o&&r(t,o,...i),a}:async(t,e,...i)=>{s&&await r(t,s,...i);const a=await r(t,zs(e),...i);return o&&await r(t,o,...i),a}},Es=Symbol.for("polyscript.js_modules"),Ps=new Map;hs(globalThis,Es,{value:Ps});const Ss=new Proxy(Ps,{get:(t,e)=>t.get(e),has:(t,e)=>t.has(e),ownKeys:t=>[...t.keys()]}),$s=(t,e)=>!e.startsWith("_"),Ms=(t,e)=>new Proxy(t,{has:$s,get:(t,s)=>t[e][s]}),Rs=(t,e,s,o)=>{if("pyodide"===t)return;const r="polyscript.js_modules";for(const t of Reflect.ownKeys(o))e.registerJSModule(s,`${r}.${t}`,Ms(o,t));e.registerJSModule(s,r,o)},qs=(t,e)=>import(t).then(t=>{Ps.set(e,{...t})}),Bs=t=>new Promise((e,s)=>{document.querySelector(`link[rel="stylesheet"][href="${t}"]`)?e():document.head.append(ds(document.createElement("link"),{rel:"stylesheet",href:t,onload:e,onerror:s}))}),Fs=t=>/\.css$/i.test(new URL(t).pathname),Ds=t=>/^(?:false|0|no)$/i.test(t.getAttribute("async")),Ts=!globalThis.window,Ls=({FS:t,PATH:e,PATH_FS:s},o,r)=>{const i=s.resolve(o),a=e.dirname(i);return t.mkdirTree?t.mkdirTree(a):Cs(t,a),t.writeFile(i,new Uint8Array(r),{canOwn:!0})},Os=t=>{const e=t.split("/");return e.pop(),e.join("/")},Cs=(t,e)=>{const s=[];for(const o of e.split("/"))"."!==o&&".."!==o&&(s.push(o),o&&t.mkdir(s.join("/")))},Is=(t,e)=>{const s=[];for(const t of e.split("/"))switch(t){case"":case".":break;case"..":s.pop();break;default:s.push(t)}return[t.cwd()].concat(s).join("/").replace(/^\/+/,"/")},Ws=t=>{const e=t.map(t=>t.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(t=>""!==t&&"."!==t).join("/");return t[0].startsWith("/")?`/${e}`:e},Js=(t,e)=>i(ws(t,e)).arrayBuffer(),Us=(t,e,s,o)=>fs((t=>{for(const{files:e,to_file:s,from:o=""}of t){if(void 0!==e&&void 0!==s)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===e&&void 0===s&&o.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${o}, please supply 'to_file' parameter.`)}return t.flatMap(({from:t="",to_folder:e=".",to_file:s,files:o})=>{if(ys(o))return o.map(s=>({url:Ws([t,s]),path:Ws([e,s])}));const r=s||t.slice(1+t.lastIndexOf("/"));return[{url:t,path:Ws([e,r])}]})})(s).map(({url:s,path:r})=>Js(s,o).then(s=>t.writeFile(e,r,s)))),Hs=(t,e)=>e.endsWith("/")?`${e}${t.split("/").pop()}`:e,Ns=(t,e)=>t.replace(/\{.+?\}/g,t=>{if(!e.has(t))throw new SyntaxError(`Invalid template: ${t}`);return e.get(t)}),Ks=(t,e,s,o)=>fs((t=>{const e=new Map,s=new Set,o=[];for(const[r,i]of gs(t))if(/^\{.+\}$/.test(r)){if(e.has(r))throw new SyntaxError(`Duplicated template: ${r}`);e.set(r,Ns(i,e))}else{const t=Ns(r,e),a=Hs(t,Ns(i||"./",e));if(s.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);s.add(a),o.push({url:t,path:a})}return o})(s).map(({url:s,path:r})=>Js(s,o).then(o=>t.writeFile(e,r,o,s)))),Gs=({main:t,worker:e},s)=>{const o=[];if(e&&Ts)for(let[t,r]of gs(e))t=ws(t,s),o.push(qs(t,r));if(t&&!Ts)for(let[e,r]of gs(t))e=ws(e,s),Fs(e)?Bs(e):o.push(qs(e,r));return fs(o)},Xs=t=>e=>{dispatchEvent(new CustomEvent(`${t}:progress`,{detail:e}))},Vs=(t,e,s)=>(t.set(e,s),s),Ys=t=>{oe[0]=t[to++],oe[1]=t[to++],oe[2]=t[to++],oe[3]=t[to++],oe[4]=t[to++],oe[5]=t[to++],oe[6]=t[to++],oe[7]=t[to++]},Qs=t=>(oe[0]=t[to++],oe[1]=t[to++],oe[2]=t[to++],oe[3]=t[to++],se.getUint32(0,!0)),Zs=(t,e)=>{switch(t[to++]){case $t:return Ys(t),se.getFloat64(0,!0);case Mt:return t[to++];case Nt:{const s=Vs(e,to-1,{});for(let o=0,r=Qs(t);o(to=0,Zs(t,new Map)),stringify:t=>{const e=[];return de=Y,ye(t,e,new Map),e}},so=new WeakMap,oo=async(t,e,s,o,r)=>{o.files&&(e("Loading files"),await Ks(t,s,o.files,r),e("Loaded files")),o.fetch&&(e("Loading fetch"),await Us(t,s,o.fetch,r),e("Loaded fetch")),o.js_modules&&(e("Loading JS modules"),await Gs(o.js_modules,r),e("Loaded JS modules"))},ro=(t,e,s)=>{"polyscript"===e&&(s.lazy_py_modules=async(...e)=>(await so.get(t)(e),e.map(e=>t.pyimport(e))),s.storage=async t=>{const e=new u(t);return await e.sync(),e},s.JSON=eo),t.registerJsModule(e,s)},io=(t,e)=>{if(t.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(e))return RegExp.$1;throw new Error(`Unsupported archive ${e}`)}return""},ao=(t,e,...s)=>{try{return t.runPython(cs(e),...s)}catch(e){Ve.get(t).stderr(e)}},no=async(t,e,...s)=>{try{return await t.runPythonAsync(cs(e),...s)}catch(e){Ve.get(t).stderr(e)}},po=async(t,e,s)=>{const[o,...r]=e.split(".");let i,a=t.globals.get(o);for(const t of r)[i,a]=[a,a[t]];try{await a.call(i,s)}catch(e){Ve.get(t).stderr(e)}};var co=(new TextEncoder).encode("_F='github:'\n_E='user-agent'\n_D=True\n_C=False\n_B='/'\n_A=None\nfrom uio import StringIO\nimport sys\nclass Response:\n\tdef __init__(A,f):A.raw=f;A.encoding='utf-8';A._cached=_A\n\tdef close(A):\n\t\tif A.raw:A.raw.close();A.raw=_A\n\t\tA._cached=_A\n\t@property\n\tdef content(self):\n\t\tA=self\n\t\tif A._cached is _A:\n\t\t\ttry:A._cached=A.raw.read()\n\t\t\tfinally:A.raw.close();A.raw=_A\n\t\treturn A._cached\n\t@property\n\tdef text(self):return str(self.content,self.encoding)\n\tdef json(A):import ujson;return ujson.loads(A.content)\nHEADERS_TO_IGNORE=_E,\ntry:import js\nexcept Exception as err:raise OSError('This version of urequests can only be used in the browser')\nHEADERS_TO_IGNORE=_E,\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\n\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\n\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\n\telse:A.open(D,url,_C)\n\tfor(F,J)in headers.items():\n\t\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\n\tif E:A.timeout=int(E*1000)\n\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader('Content-Type','application/json')\n\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\ndef get(url,**A):return request('GET',url,**A)\n_PACKAGE_INDEX=const('https://micropython.org/pi/v2')\n_CHUNK_SIZE=128\ndef _ensure_path_exists(path):\n\timport os;A=path.split(_B)\n\tif not A[0]:A.pop(0);A[0]=_B+A[0]\n\tB=''\n\tfor C in range(len(A)-1):\n\t\tB+=A[C]\n\t\ttry:os.stat(B)\n\t\texcept:os.mkdir(B)\n\t\tB+=_B\ndef _chunk(src,dest):\n\tA=memoryview(bytearray(_CHUNK_SIZE))\n\twhile _D:\n\t\tB=src.readinto(A)\n\t\tif B==0:break\n\t\tdest(A if B==_CHUNK_SIZE else A[:B])\ndef _check_exists(path,short_hash):\n\tA=short_hash;import os\n\ttry:\n\t\timport binascii as C,hashlib as D\n\t\twith open(path,'rb')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],'utf-8');return F==A\n\texcept:return _C\ndef _rewrite_url(url,branch=_A):\n\tB=branch;A=url\n\tif not B:B='HEAD'\n\tif A.startswith(_F):A=A[7:].split(_B);A='https://raw.githubusercontent.com/'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\n\treturn A\ndef _download_file(url,dest):\n\tB=dest;A=get(url)\n\ttry:\n\t\tif A.status_code!=200:print('Error',A.status_code,'requesting',url);return _C\n\t\tprint('Copying:',B);_ensure_path_exists(B)\n\t\twith open(B,'wb')as C:_chunk(A.raw,C.write)\n\t\treturn _D\n\tfinally:A.close()\ndef _install_json(package_json_url,index,target,version,mpy):\n\tK='File not found: {} {}';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\n\ttry:\n\t\tif E.status_code!=200:print('Package not found:',G);return _C\n\t\tF=E.json()\n\tfinally:E.close()\n\tfor(A,C)in F.get('hashes',()):\n\t\tB=D+_B+A\n\t\tif _check_exists(B,C):print('Exists:',B)\n\t\telse:\n\t\t\tL='{}/file/{}/{}'.format(H,C[:2],C)\n\t\t\tif not _download_file(L,B):print(K.format(A,C));return _C\n\tfor(A,J)in F.get('urls',()):\n\t\tB=D+_B+A\n\t\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\n\tfor(M,N)in F.get('deps',()):\n\t\tif not _install_package(M,H,D,N,mpy):return _C\n\treturn _D\ndef _install_package(package,index,target,version,mpy):\n\tD=index;C=target;B=version;A=package\n\tif A.startswith('http://')or A.startswith('https://')or A.startswith(_F):\n\t\tif A.endswith('.py')or A.endswith('.mpy'):print('Downloading {} to {}'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\n\t\telse:\n\t\t\tif not A.endswith('.json'):\n\t\t\t\tif not A.endswith(_B):A+=_B\n\t\t\t\tA+='package.json'\n\t\t\tprint('Installing {} to {}'.format(A,C))\n\telse:\n\t\tif not B:B='latest'\n\t\tprint('Installing {} ({}) from {} to {}'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,'_mpy')else'py';A='{}/package/{}/{}/{}.json'.format(D,'py',A,B)\n\treturn _install_json(A,D,C,B,mpy)\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\n\tB=target;A=index\n\tif not B:\n\t\tfor C in sys.path:\n\t\t\tif C.endswith('/lib'):B=C;break\n\t\telse:print('Unable to find lib dir in sys.path');return\n\tif not A:A=_PACKAGE_INDEX\n\tif _install_package(package,A.rstrip(_B),B,version,mpy):print('Done')\n\telse:print('Package may be partially installed')");const lo=async t=>(await import("./toml-BK2RWy-G.js")).parse(t);async function yo(t,e){return new Promise((s,o)=>{t.syncfs(e,t=>{t?o(t):s()})})}function uo(t){const e=t.FS,s=t.FS.filesystems.MEMFS,o=t.PATH,r={DIR_MODE:16895,FILE_MODE:33279,mount:function(t){if(!t.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return s.mount.apply(null,arguments)},syncfs:async(t,e,s)=>{try{const o=r.getLocalSet(t),i=await r.getRemoteSet(t),a=e?i:o,n=e?o:i;await r.reconcile(t,a,n),s(null)}catch(t){s(t)}},getLocalSet:t=>{let s=Object.create(null);function r(t){return"."!==t&&".."!==t}function i(t){return e=>o.join2(t,e)}let a=e.readdir(t.mountpoint).filter(r).map(i(t.mountpoint));for(;a.length;){let t=a.pop(),o=e.stat(t);e.isDir(o.mode)&&a.push.apply(a,e.readdir(t).filter(r).map(i(t))),s[t]={timestamp:o.mtime,mode:o.mode}}return{type:"local",entries:s}},getRemoteSet:async t=>{const e=Object.create(null),s=await mo(t.opts.fileSystemHandle);for(const[i,a]of s)"."!==i&&(e[o.join2(t.mountpoint,i)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?r.FILE_MODE:r.DIR_MODE});return{type:"remote",entries:e,handles:s}},loadLocalEntry:t=>{const o=e.lookupPath(t).node,r=e.stat(t);if(e.isDir(r.mode))return{timestamp:r.mtime,mode:r.mode};if(e.isFile(r.mode))return o.contents=s.getFileDataAsTypedArray(o),{timestamp:r.mtime,mode:r.mode,contents:o.contents};throw new Error("node type not supported")},storeLocalEntry:(t,s)=>{if(e.isDir(s.mode))e.mkdirTree(t,s.mode);else{if(!e.isFile(s.mode))throw new Error("node type not supported");e.writeFile(t,s.contents,{canOwn:!0})}e.chmod(t,s.mode),e.utime(t,s.timestamp,s.timestamp)},removeLocalEntry:t=>{var s=e.stat(t);e.isDir(s.mode)?e.rmdir(t):e.isFile(s.mode)&&e.unlink(t)},loadRemoteEntry:async t=>{if("file"===t.kind){const e=await t.getFile();return{contents:new Uint8Array(await e.arrayBuffer()),mode:r.FILE_MODE,timestamp:e.lastModifiedDate}}if("directory"===t.kind)return{mode:r.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+t.kind)},storeRemoteEntry:async(t,s,r)=>{const i=t.get(o.dirname(s)),a=e.isFile(r.mode)?await i.getFileHandle(o.basename(s),{create:!0}):await i.getDirectoryHandle(o.basename(s),{create:!0});if("file"===a.kind){const t=await a.createWritable();await t.write(r.contents),await t.close()}t.set(s,a)},removeRemoteEntry:async(t,e)=>{const s=t.get(o.dirname(e));await s.removeEntry(o.basename(e)),t.delete(e)},reconcile:async(t,s,i)=>{let a=0;const n=[];Object.keys(s.entries).forEach(function(t){const o=s.entries[t],r=i.entries[t];(!r||e.isFile(o.mode)&&o.timestamp.getTime()>r.timestamp.getTime())&&(n.push(t),a++)}),n.sort();const p=[];if(Object.keys(i.entries).forEach(function(t){s.entries[t]||(p.push(t),a++)}),p.sort().reverse(),!a)return;const c="remote"===s.type?s.handles:i.handles;for(const e of n){const s=o.normalize(e.replace(t.mountpoint,"/")).substring(1);if("local"===i.type){const t=c.get(s),o=await r.loadRemoteEntry(t);r.storeLocalEntry(e,o)}else{const t=r.loadLocalEntry(e);await r.storeRemoteEntry(c,s,t)}}for(const e of p)if("local"===i.type)r.removeLocalEntry(e);else{const s=o.normalize(e.replace(t.mountpoint,"/")).substring(1);await r.removeRemoteEntry(c,s)}}};return t.FS.filesystems.NATIVEFS_ASYNC=r,async function(t,s){if("FileSystemDirectoryHandle"!==s.constructor.name)throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return function(t){e.mkdirTree?e.mkdirTree(t):Cs(e,t);const{node:s}=e.lookupPath(t,{follow_mount:!1});if(e.isMountpoint(s))throw new Error(`path '${t}' is already a file system mount point`);if(!e.isDir(s.mode))throw new Error(`path '${t}' points to a file not a directory`);for(const e in s.contents)throw new Error(`directory '${t}' is not empty`)}(t),e.mount(e.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:s},t),await yo(e,!0),{syncfs:async()=>await yo(e,!1)}}}const mo=async t=>{const e=[];await async function t(s){for await(const o of s.values())e.push(o),"directory"===o.kind&&await t(o)}(t);const s=new Map;s.set(".",t);for(const o of e){const e=(await t.resolve(o)).join("/");s.set(e,o)}return s},{parse:ho}=JSON,go=(t,e)=>new URL(t,e).href,fo=(t,e,s)=>{if(e in t)throw new Error(`Duplicated path: ${e}`);t[e]=s},bo=(t,e,s)=>{for(const o in e)fo(t,go(o,s),e[o])},wo=(t,e,s,o)=>{const r=e[s];r&&(t[s]??={},bo(t[s],r,o))},ko=async(t,e=t.packages,s=new Set)=>{const o=[];for(const r of e){if(s.has(r))continue;s.add(r);const e=r.endsWith(".toml");if(e||r.endsWith(".json")){const a=await i(r).text(),{name:n,files:p,js_modules:c,packages:l}=e?await lo(a):ho(a);if(s.has(n))throw new Error(`Unable to process ${n} @ ${r}`);s.add(n),l&&o.push(...await ko(t,l,s)),c&&(t.js_modules??={},wo(t.js_modules,c,"main",r),wo(t.js_modules,c,"worker",r)),p&&(t.files??={},bo(t.files,p,r))}else o.push(r)}return o},xo=(t,e)=>{try{t.mkdir(e)}catch(t){}},_o=Xs("mpy");var vo={type:"micropython",module:(t="1.27.0-preview-283")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${t}/micropython.mjs`,async engine({loadMicroPython:t},e,s,o){const{stderr:r,stdout:i,get:a}=Ye({stderr:Ze(console.error),stdout:Ze(console.log)});s=s.replace(/\.m?js$/,".wasm"),_o("Loading MicroPython");const n=await a(t({linebuffer:!1,stderr:r,stdout:i,url:s}));globalThis[Es].set("-T-",this.transform.bind(this,n));const p=jo.bind(this,n,o);return so.set(n,p),await oo(this,_o,n,e,o),this.writeFile(n,"./mip.py",co),e.packages&&(e.experimental_remote_packages&&(_o("Loading remote packages"),e.packages=await ko(e),_o("Loaded remote packages")),_o("Loading packages"),await p(e.packages.map(ks,o)),_o("Loaded packages")),_o("Loaded MicroPython"),n.mountNativeFS||(n.mountNativeFS=uo(n._module)),n},registerJSModule:ro,run:ao,runAsync:no,runEvent:po,transform:(t,e)=>t.PyProxy.toJs(e),writeFile:(t,e,s,o)=>{const{FS:r,_module:{PATH:i,PATH_FS:a}}=t,n={FS:r,PATH:i,PATH_FS:a},p=io(e,o);if(p){const o=e.slice(0,-1);switch("./"!==o&&r.mkdir(o),p){case"whl":case"zip":{const t=new Blob([s],{type:"application/zip"});return import("./zip-CakRHzZu.js").then(async({BlobReader:e,Uint8ArrayWriter:s,ZipReader:a})=>{const n=new a(new e(t));for(const t of await n.getEntries()){const{directory:e,filename:a}=t,n=o+a;if(e)xo(r,n);else{xo(r,i.dirname(n));const e=await t.getData(new s);r.writeFile(n,e,{canOwn:!0})}}n.close()})}case"tgz":case"tar.gz":{const e="./_.tar.gz";return Ls(n,e,s),void t.runPython(`\n import os, gzip, tarfile\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${e}", "rb")))\n for f in tar:\n name = f"${o}{f.name}"\n if f.type == tarfile.DIRTYPE:\n if f.name != "./":\n os.mkdir(name.strip("/"))\n else:\n dir = os.path.dirname(name)\n if not os.path.exists(dir):\n os.mkdir(dir)\n source = tar.extractfile(f)\n with open(name, "wb") as dest:\n dest.write(source.read())\n dest.close()\n tar.close()\n os.remove("${e}")\n `)}}}return Ls(n,e,s)}};async function jo(t,e,s){let o;for(const r of s)if(r.endsWith(".whl")){const s=ws(r,e),o=await i(s).arrayBuffer();await this.writeFile(t,"./*",o,s)}else o||(o=t.pyimport("mip")),o.install(r)}const zo={dict_converter:Object.fromEntries},{stringify:Ao}=JSON,{hasOwn:Eo}=Object,{apply:Po}=Reflect,So=Function.prototype,$o=t=>function(...e){return Po(t,this,e)};let Mo,Ro;const qo=t=>{const e=new WeakMap,s=s=>{for(let o,r=0;r`https://cdn.jsdelivr.net/pyodide/v${t}/full/pyodide.mjs`,async engine({loadPyodide:t,version:e},s,o,r){Bo("Loading Pyodide");let{packages:i,index_urls:a}=s;if(i&&!a){i=i.map(ks,r),Bo("Loading Packages Graph");const{default:t}=await Promise.resolve().then(function(){return Co});if(Bo("Loaded Packages Graph"),Eo(t,e)){const s=i.filter(s=>{if(/^[a-zA-Z0-9_-]/.test(s)){const[o,...r]=s.split(/[>=<]=/);return!Eo(t[e],o)||r.length>0&&r[1]!==t[e][o]}return!1});if(s.length>0)throw new Error(`These packages are not supported in Pyodide ${e}: ${s.join(", ")}`)}}Bo("Loading Storage");const n=o.slice(0,o.lastIndexOf("/")),p=new u(`${n}@${e}`),c={indexURL:n},l="never"!==s.packages_cache&&"0.28.0"!==e;if(await p.sync(),Bo("Loaded Storage"),l||p.clear(),i&&(s.experimental_remote_packages&&(Bo("Loading remote packages"),s.packages=i=await ko(s,i),Bo("Loaded remote packages")),l))if("passthrough"===s.packages_cache)c.packages=i,i=null,p.clear();else{i=i.sort();const t=Ao(i);if(p.has(t)){const s=p.get(t);if(c.packages=i.map(t=>t.split(/[>=<]=/)[0]),e.startsWith("0.27")){const t=new Blob([s],{type:"application/json"});c.lockFileURL=URL.createObjectURL(t)}else c.lockFileContents=s;i=null}}const{stderr:y,stdout:d,get:m}=Ye();Bo("Loading interpreter");const h=await m(t({stderr:y,stdout:d,...c}));Bo("Loaded interpreter"),globalThis[Es].set("-T-",this.transform.bind(this,h)),s.debug&&h.setDebug(!0);const g=Lo.bind(h);return a&&Fo.set(h,a),so.set(h,g),await oo(this,Bo,h,s,r),i&&await g(i,p,l),await p.close(),c.lockFileURL&&URL.revokeObjectURL(c.lockFileURL),Bo("Loaded Pyodide"),"auto"===s.experimental_create_proxy&&(h.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:h.toPy({})}),Ro=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Mo]=Reflect.ownKeys(Ro).filter(t=>"symbol"==typeof t&&"Symbol(pyproxy.attrs)"===String(t)),qo(!0)),h},registerJSModule:ro,run:$o(ao),runAsync:$o(no),runEvent:$o(po),transform:(t,e)=>Po(To,t,[e]),writeFile:(t,e,s,o)=>{const r=io(e,o);if(r)return t.unpackArchive(s,r,{extractDir:e.slice(0,-1)});const{FS:i,PATH:a,_module:{PATH_FS:n}}=t;return Ls({FS:i,PATH:a,PATH_FS:n},e,s)}};function To(t){const{ffi:{PyProxy:e}}=this;if(t&&"object"==typeof t){if(t instanceof e)return t.toJs(zo);if(t instanceof Map)return new Map([...t.entries()]);if(ys(t))return t.map(To,this)}return t}async function Lo(t,e,s=!1){const{log:o}=console,r=(t,...e)=>{o(t,...e),console.log=o,Bo(t),console.log=r};console.log=r,await this.loadPackage("micropip");const i=this.pyimport("micropip");if(Fo.has(this)&&i.set_index_urls(Fo.get(this)),await i.install(t,{keep_going:!0}),console.log=o,s&&e instanceof u){const s=i.freeze();e.set(Ao(t),s)}i.destroy()}var Oo={latest:{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},stable:{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.3":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.2":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.1":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.7":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.6":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.5":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.4":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.3":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.2":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.1":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.29.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.50.4.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3","bilby.cython":"0.5.3",biopython:"1.85",bitarray:"3.7.1",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.6.1",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.8.3",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.3",clarabel:"0.11.0",click:"8.3.0",cligj:"0.7.2",clingo:"5.8.0",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"46.0.1","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastapi:"0.116.1",fastcan:"0.4.1",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",highspy:"1.11.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.4",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.4.1",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonpatch:"1.33",jsonpointer:"3.0.0",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.6.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.2",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.11.0",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.4",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.2",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.1.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5","pygame-ce":"2.5.6.dev2",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1","pylimer-tools":"0.3.11",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-calamine":"0.5.3","python-dateutil":"2.9.0.post0","python-flint":"0.8.0","python-magic":"0.4.27","python-sat":"1.8.dev23","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.1.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.6","rpds-py":"0.27.0","ruamel.yaml":"0.18.10",rustworkx:"0.17.1","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",starlette:"0.47.2",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.15.0",tzdata:"2025.2",ujson:"5.11.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",vrplib:"2.0.1",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.9.0",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"}},Co=Object.freeze({__proto__:null,default:Oo});const Io="ruby-wasm-wasi",Wo=Io.replace(/\W+/g,"_");var Jo={type:Io,experimental:!0,module:(t="2.7.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${t}/dist/browser/+esm`,async engine({DefaultRubyVM:t},e,s,o){s=s.replace(/\/browser\/\+esm$/,"/ruby.wasm");const r=await i(s).arrayBuffer(),a=await WebAssembly.compile(r),{vm:n}=await t(a);return e.files&&await Ks(this,n,e.files,o),e.fetch&&await Us(this,n,e.fetch,o),e.js_modules&&await Gs(e.js_modules,o),n},registerJSModule(t,e,s){e=e.replace(/\W+/g,"__");const o=`__module_${Wo}_${e}`;globalThis[o]=s,this.run(t,`require "js";$${e}=JS.global[:${o}]`),delete globalThis[o]},run:(t,e,...s)=>t.eval(cs(e),...s),runAsync:(t,e,...s)=>t.evalAsync(cs(e),...s),async runEvent(t,e,s){if(/^xworker\.(on\w+)$/.test(e)){const{$1:e}=RegExp,o=`__module_${Wo}_event`;globalThis[o]=s,this.run(t,`require "js";$xworker.call("${e}",JS.global[:${o}])`),delete globalThis[o]}else{const o=this.run(t,`method(:${e})`);await o.call(e,t.wrap(s))}},transform:(t,e)=>e,writeFile:()=>{throw new Error(`writeFile is not supported in ${Io}`)}};var Uo={type:"wasmoon",module:(t="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${t}/+esm`,async engine({LuaFactory:t,LuaLibraries:e},s,o,r){const{stderr:i,stdout:a,get:n}=Ye(),p=await n((new t).createEngine());return p.global.getTable(e.Base,t=>{p.global.setField(t,"print",a),p.global.setField(t,"printErr",i)}),s.files&&await Ks(this,p,s.files,r),s.fetch&&await Us(this,p,s.fetch,r),s.js_modules&&await Gs(s.js_modules,r),p},registerJSModule:(t,e,s)=>{t.global.set(e,s)},run:(t,e,...s)=>{try{return t.doStringSync(cs(e),...s)}catch(e){Ve.get(t).stderr(e)}},runAsync:async(t,e,...s)=>{try{return await t.doString(cs(e),...s)}catch(e){Ve.get(t).stderr(e)}},runEvent:async(t,e,s)=>{const[o,...r]=e.split(".");let i,a=t.global.get(o);for(const t of r)[i,a]=[a,a[t]];try{await a.call(i,s)}catch(e){Ve.get(t).stderr(e)}},transform:(t,e)=>e,writeFile:({cmodule:{module:{FS:t}}},e,s)=>((t,e,s)=>(Cs(t,Os(e)),e=Is(t,e),t.writeFile(e,new Uint8Array(s),{canOwn:!0})))(t,e,s)};const Ho=new WeakMap,No=new FinalizationRegistry(t=>t()),Ko=async(t,e)=>{const{shelter:s,destroy:o,io:r}=Ho.get(t),{output:i,result:a}=await s.captureR(cs(e));for(const{type:t,data:e}of i)r[t](e);return No.register(a,o),a};var Go={type:"webr",experimental:!0,module:(t="0.5.6")=>`https://cdn.jsdelivr.net/npm/webr@${t}/dist/webr.mjs`,async engine(t,e,s,o){const{get:r}=Ye(),i=new t.WebR;await r(i.init().then(()=>i));const a=await new i.Shelter;return Ho.set(i,{module:t,shelter:a,destroy:a.destroy.bind(a),io:Ve.get(i)}),e.files&&await Ks(this,i,e.files,o),e.fetch&&await Us(this,i,e.fetch,o),e.js_modules&&await Gs(e.js_modules,o),i},registerJSModule(t,e){console.warn(`Experimental interpreter: module ${e} is not supported (yet)`)},run:Ko,runAsync:Ko,async runEvent(t,e,s){await t.evalRVoid(`${e}(event)`,{env:{event:{type:[s.type]}}})},transform:(t,e)=>e,writeFile:()=>{}};const Xo=new Map,Vo=new Map,Yo=[],Qo=[],Zo=new Proxy(new Map,{get(t,e){if(!t.has(e)){const[s,...o]=e.split("@"),r=Xo.get(s),i=/^(?:\.?\.?\/|[a-z0-9-]+:\/\/)/i.test(o)?o.join("@"):r.module(...o);t.set(e,{url:i,module:import(i),engine:r.engine.bind(r)})}const{url:s,module:o,engine:r}=t.get(e);return(t,i)=>o.then(o=>(Vo.set(e,t),r(o,t,s,i)))}}),tr=t=>{for(const e of[].concat(t.type))Xo.set(e,t),Yo.push(`script[type="${e}"]`),Qo.push(`${e}-`)};for(const t of[os,vo,Do,Oo,Jo,Uo,Go])tr(t);const{parse:er}=JSON,sr=(t,e="./config.txt")=>{let s=typeof t;return"string"===s&&/\.(json|toml|txt)$/.test(t)?s=RegExp.$1:t=e,[ws(t),s]},or=(t,e,s={})=>{const[o,r]=sr(t,e);return"json"===r?s=i(o).json():"toml"===r?s=i(o).text().then(lo):"string"===r?s=rr(t):"object"===r&&t?s=t:"txt"===r&&"string"==typeof s&&(s=rr(s)),[s,t=o]},rr=t=>{try{return er(t)}catch(e){return lo(t)}},ir=(t,e,s,o={})=>(e&&([o,e]=or(e,s,o)),bs(o).then(s=>Zo[t](s,e))),ar=(t,e="")=>`${t}@${e}`.replace(/@$/,"");function nr(t=this){return String(t).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(t,e,s,o)=>o&&!s?`${e||""}function ${o}(`:t)}const pr="BeforeRun",cr="AfterRun",lr=[`code${pr}`,`code${pr}Async`,`code${cr}`,`code${cr}Async`],yr=["onWorker","onReady",`on${pr}`,`on${pr}Async`,`on${cr}`,`on${cr}Async`];function dr(t,e){const{run:s,runAsync:o}=Xo.get(this.type);return{...t,run:s.bind(this,e),runAsync:o.bind(this,e)}}const ur=(t,e,s,o,r,i)=>{if(r||i){const a=dr.bind(t,e),n=o?"runAsync":"run",p=t[n];t[n]=o?async function(t,e,...o){r&&await r.call(this,a(t),s);const n=await p.call(this,t,e,...o);return i&&await i.call(this,a(t),s),n}:function(t,e,...o){r&&r.call(this,a(t),s);const n=p.call(this,t,e,...o);return i&&i.call(this,a(t),s),n}}};let mr=class{constructor(t,e={}){const{main:s,worker:o}=e;this.interpreter=t,this.onWorker=s?.onWorker;for(const t of yr.slice(1))this[t]=o?.[t];for(const t of lr)this[t]=o?.[t]}toJSON(){const t={};for(const e of yr.slice(1))this[e]&&(t[e]=nr(this[e]));for(const e of lr)this[e]&&(t[e]=cs(this[e]()));return t}};var hr=(...t)=>function(e,s){if(t.length){const[e,o]=t;(s=ds({},s||{type:e,version:o})).type||(s.type=e)}const[o]=sr(s.config,s.configURL),r=((...t)=>new Xe(URL.createObjectURL(new Blob(["/*@*/"+'const{assign:t}=Object,e="entries",s="readonly",o="readwrite",i={durability:"default",prefix:"IDBMap"},r=({target:{result:t}})=>t;class a extends EventTarget{#t;#e;#s;async#o(s,o){const i=(await this.#t).transaction(e,o,this.#e);return new Promise((o,r)=>t(s(i.objectStore(e)),{onsuccess:o,onerror:r}))}constructor(s,{durability:o=i.durability,prefix:a=i.prefix}=i){super(),this.#s=a,this.#e={durability:o},this.#t=new Promise((o,i)=>{t(indexedDB.open(`${this.#s}/${s}`),{onupgradeneeded({target:{result:t,transaction:s}}){t.objectStoreNames.length||t.createObjectStore(e),s.oncomplete=()=>o(t)},onsuccess(t){o(r(t))},onerror(t){i(t),this.dispatchEvent(t)}})}).then(t=>{const e=this.dispatchEvent.bind(this);for(const s in t)s.startsWith("on")&&(t[s]=e);return t})}dispatchEvent(e){const{type:s,message:o,isTrusted:i}=e;return super.dispatchEvent(i?t(new Event(s),{message:o}):e)}async close(){(await this.#t).close()}get size(){return this.#o(t=>t.count(),s).then(r)}async clear(){await this.#o(t=>t.clear(),o)}async delete(t){await this.#o(e=>e.delete(t),o)}async entries(){const t=await this.keys();return Promise.all(t.map(t=>this.get(t).then(e=>[t,e])))}async forEach(t,e=this){for(const[s,o]of await this.entries())await t.call(e,o,s,this)}async get(t){return await this.#o(e=>e.get(t),s).then(r)}async has(t){return void 0!==await this.#o(e=>e.getKey(t),s).then(r)}async keys(){return await this.#o(t=>t.getAllKeys(),s).then(r)}async set(t,e){return await this.#o(s=>s.put(e,t),o),this}async values(){const t=await this.keys();return Promise.all(t.map(t=>this.get(t)))}get[Symbol.toStringTag](){return this.#s}}class n extends Map{#i;#r;constructor(...t){super(),this.#i=new a(...t),this.#r=this.#i.entries().then(t=>{for(const[e,s]of t)super.set(e,s)})}async close(){await this.#r,await this.#i.close()}async sync(){await this.#r}clear(){return this.#r=this.#r.then(()=>this.#i.clear()),super.clear()}delete(t){return this.#r=this.#r.then(()=>this.#i.delete(t)),super.delete(t)}set(t,e){return this.#r=this.#r.then(()=>this.#i.set(t,e)),super.set(t,e)}}const p="a27fb202",c="="+p,l="-"+p;let y=0;const d=y++,u=y++,m=y++,h=y++,g=y++,f=y++,b=y++,w=y++,k=y++,x=y++,_=y++,v=y++,j=y++,z=y++,A=y++,P=y++,E=y++,S=y++,$=y++,M=y++,R=y++,q=y++,F=y++,B=y++,D=y++,T=y++;const L=globalThis.ImageData||class{},O=new TextDecoder,C=new TextEncoder,I=new Map(Reflect.ownKeys(Symbol).map(t=>[Symbol[t],`@${String(t)}`])),J=t=>{switch(t[0]){case"@":return Symbol[t.slice(1)];case"#":return Symbol.for(t.slice(1));case"!":return Symbol(t.slice(1));default:return Symbol()}},U=t=>I.get(t)||((t,e)=>void 0===e?"?":void 0===Symbol.keyFor(t)?`!${e}`:`#${e}`)(t,t.description),H=Object.defineProperty,W=Object.assign,N=Array.isArray,K=ArrayBuffer.isView,G=(t,e)=>[t,e],V=t=>t,Z=[],X={},Y=function(){},Q=t=>(e,s=new Map)=>{for(let o=0,i=e.length;o0===t?e:J(e),et=t=>"string"==typeof t?G(0,t):G(16,U(t)),st=(t,e)=>{for(let s=t.push,o=0,i=e.length;o(t.set(e,s),s),nt=t=>{rt[0]=t[lt++],rt[1]=t[lt++],rt[2]=t[lt++],rt[3]=t[lt++],rt[4]=t[lt++],rt[5]=t[lt++],rt[6]=t[lt++],rt[7]=t[lt++]},pt=t=>(rt[0]=t[lt++],rt[1]=t[lt++],rt[2]=t[lt++],rt[3]=t[lt++],it.getUint32(0,!0)),ct=(t,e)=>{switch(t[lt++]){case g:return nt(t),it.getFloat64(0,!0);case f:return t[lt++];case R:{const s=at(e,lt-1,{});for(let o=0,i=pt(t);o(lt=0,ct(t,new Map)),dt=({byteOffset:t=0}={})=>(e,s)=>yt(new Uint8Array(s,t,e));let ut=0;const mt=ut++,ht=ut++,gt=ut++,ft=ut++,bt=ut++,wt=ut++,kt=ut++,xt=ut++,_t=ut++,vt=ut++,jt=ut++,zt=ut++,At=ut++,Pt=ut++,Et=ut++;ut++;const St=ut++,$t=ut++,{getPrototypeOf:Mt}=Object,{construct:Rt}=Reflect,{toStringTag:qt}=Symbol,{toString:Ft}=X,Bt=(t,e=Ft.call(t).slice(8,-1))=>e in globalThis?e:Bt(Mt(t)||X),Dt=(t,e=t[qt])=>e in globalThis?e:Dt(Rt(Mt(t.constructor),[0])),Tt=(t,e)=>new ArrayBuffer(t,{maxByteLength:e}),Lt=([t,e],s)=>{const o=s?t.byteLength:t.length;if(s){if(e){const s=Tt(o,e);new Uint8Array(s).set(new Uint8Array(t)),t=s}}else{const s=e?Tt(o,e):new ArrayBuffer(o);new Uint8Array(s).set(t),t=s}return t};const Ot=/\\[(\'|")?(.+?)\\1\\]/g,Ct=(t,e)=>t?.[e];var It=t=>{const e=[],s=t=>{const s=e.splice(t);for(;t{e.push(o,i)<3&&setTimeout(s,t,0)})(super.set(o,i),o),i}}},Jt=({reflect:t=V,transform:e=V,released:s=V,buffer:o=!1,timeout:i=-1}=X)=>{const r=Q(tt),a=Q(et),n=t=>{if(!N(t))return t;const[e,s]=t;if(1&e)return l(e,s);switch(e){case 2:return A;case 0:return s;case 16:return J(s);case 32:return BigInt(s);case 68:return(([t,e,s,o],i)=>{const r=Lt(e,i),a=globalThis[t];return o?new a(r,s,o):new a(r,s)})(s,o);case 64:return Lt(s,o)}},p=(t,s=new Map)=>{switch(typeof t){case"object":{if(null===t)break;if(t===globalThis)return z;if(j in t)return f;let o=s.get(t);if(!o){const i=e(t);if(b||!g.has(i)){if(N(i)){const e=[];o=G(4,e),s.set(t,o);for(let t=0,o=i.length;t{let s=v.get(e),o=s?.deref();return o||(s&&P.unregister(s),o=9===t?new Proxy(Y,new h(t,e)):new Proxy(3===t?X:Z,new m(t,e)),s=new WeakRef(o),v.set(e,s),P.register(o,e,s)),o},y=t=>{switch(typeof t){case"object":if(null===t)break;case"function":return j in t}return!1},d=-1this.apply(t,e,s);case"call":return(e,...s)=>this.apply(t,e,s);default:return super.get(t,e)}}}let g,f,b=!0;const{apply:w}=Reflect,{id:k,ref:x,unref:_}=((t=0,e=new Map,s=new Map)=>({clear:()=>{e.clear(),s.clear()},id:o=>{let i=s.get(o);if(void 0===i){for(;e.has(i=t++););e.set(i,o),s.set(o,i)}return i},ref:t=>e.get(t),unref:t=>(s.delete(e.get(t)),e.delete(t))}))(),v=new Map,j=Symbol("reflected-ffi"),z=G(2,null),A=new Proxy(X,new m(2,null)),P=new FinalizationRegistry(e=>{v.delete(e),t(mt,e)});return{global:A,isProxy:y,assign(e,...s){const o=y(e),i=W(o?{}:e,...s);return o&&t(ht,f[1],p(i)),e},direct:t=>(b&&(b=!1,g=new WeakSet),g.add(t),t),evaluate:(e,...s)=>n(t(gt,null,function(t=this){return String(t).replace(/^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,(t,e,s,o)=>o&&!s?`${e||""}function ${o}(`:t)}(e),c(s))),gather(e,...s){const o=y(e),i=o?n:t=>e[t];o&&(s=t(ft,f[1],a(s,v)));for(let t=0;ty(e)?n(t(bt,f[1],s)):((t,e)=>e.replace(Ot,".$2").split(".").reduce(Ct,t))(e,s),reflect:async(t,e,...o)=>{switch(t){case wt:{const[t,s]=o;for(let t=0,e=s.length;tt)=>{const e=new Map;let s=0;return[()=>{let o;do{o=t(s++)}while(e.has(o));const i=Ut();return e.set(o,i),[o,i.promise]},(t,s,o)=>{const i=e.get(t);e.delete(t),o?i?.reject(o):i?.resolve(s)}]};const Wt=[],Nt=new WeakSet,Kt=(...t)=>(Nt.add(t),t);let{SharedArrayBuffer:Gt}=globalThis,Vt=!0;try{new Gt(4,{maxByteLength:8})}catch(t){Vt=!1,Gt=class extends ArrayBuffer{get growable(){return super.resizable}grow(t){super.resize(t)}}}const{create:Zt}=Object,Xt=`coincident-${Vt?crypto.randomUUID():Math.random().toString(36).substring(2)}`,Yt=2*Int32Array.BYTES_PER_ELEMENT,Qt={byteOffset:Yt},te=(t,e,s)=>{const o="then"!==e;return o&&(t[e]=s),o},ee=t=>{t.stopImmediatePropagation(),t.preventDefault()},[se,oe]=Ht();let[ie,re]=se(),ae=()=>re,ne=()=>{},{Atomics:pe,MessagePort:ce,SharedArrayBuffer:le,postMessage:ye}=globalThis;if(Vt)oe(ie);else{le=Gt;const t=new Map,e=(t,...e)=>{t.addEventListener(...e)};if("importScripts"in globalThis){ne=e=>{t.set(e,null)};const s=e=>{const s=e[0],o=y++;return t.set(s,o),[o,s,e]},o=ye;ye=function(t,e){if(l){const i={ID:t.ID,data:s(t.data)};o(i,e)}else re.then(()=>this.postMessage(t,e))},ce=class extends ce{postMessage(t,e){l?super.postMessage(s(t),e):re.then(()=>this.postMessage(t,e))}},e(globalThis,"message",t=>{ee(t),oe(ie,t.data)},{once:!0});const{wait:i}=pe,{parse:r}=JSON,a=e=>{const s=new XMLHttpRequest;try{if(s.timeout=3e3,s.open("POST",`${c}?sabayon`,!1),s.setRequestHeader("Content-Type","application/json"),s.send(`["${p}",${t.get(e)}]`),200===s.status)return s;throw s}catch{return s.abort(),a(e)}},n=(t,e)=>(t.set(r(e.responseText)),"ok");pe={wait:(e,...s)=>t.has(e)?n(e,a(e)):i(e,...s)};let p,c,l=!1,y=Math.random();re=re.then(t=>{[p,c]=t,l=!0})}else{const s=[Xt,Math.random()].join("-").replace(/\\W/g,"-"),o=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");o.onmessage=async e=>{const[i,r,a]=e.data;if(r===s)for(const[e,[s,r]]of t)if(s===a){await r.promise;let t=e.length;for(;t--&&!e[t];);o.postMessage([i,e.slice(0,t+1)]);break}};const{notify:i}=pe;pe={notify(e,...s){const o=t.get(e);return o?(o[1].resolve(),0):i(e,...s)}};let r="",a=null;const n=(t,s)=>{let o,i=!0;t.getRegistration(r).then(e=>e??t.register(r,s)).then(function s(a){const{controller:n}=t;if(i=i&&!!n,o=a.installing||a.waiting||a.active,"activated"===o.state){if(i){if(n.scriptURL===r)return oe(ie);a.unregister()}location.reload()}else e(o,"statechange",()=>s(a),{once:!0})})};ae=(t,e)=>{if(!a){const s=new URL(t,location.href);r=`${s.protocol}//${s.host}${s.pathname}`,n(navigator.serviceWorker,e),a=re}return a}}}const{setPrototypeOf:de}=Reflect;let{postMessage:ue}=globalThis;const me=Ut(),he=ce.prototype;addEventListener("message",t=>{ee(t);const[e,s,o]=t.data,[i]=t.ports;s&&(de(i,he),e&&(ue=ye)),me.resolve([e,s,o,i])},{once:!0});var ge=async t=>{const[e,s,o,i]=await ae().then(()=>me.promise),r=!!e,a=Vt||!!s,n=t?.transform,p=(t?.decoder||dt)(Qt),c=!1!==t?.transfer;let l,y,d,u;if(a){const e=new(s?le:SharedArrayBuffer)(t?.minByteLength||32767,{maxByteLength:t?.maxByteLength||16777216});l=new Int32Array(e),s?(({wait:u}=pe),ne(l)):(({load:y,pause:d,wait:u}=Atomics),d&&(u=(t,e)=>{do{d()}while(y(t,e)<1)}))}const[m,h]=Ht(String),g=new Map,f=Zt(null),b=new Proxy(f,{get(t,s){if("then"===s)return;let o=g.get(s);return o||g.set(s,o=(...t)=>{const o=((t,e)=>{let s=Wt;return t&&Nt.has(e.at(-1)||Wt)&&(s=e.pop(),Nt.delete(s)),s})(c,t),y=[l,s,n?t.map(n):t];if(a){r?ue({ID:e,data:y},o):i.postMessage(y,o),u(l,0),l[0]=0;const t=l[1]?p(l[1],l.buffer):void 0;if(t instanceof Error)throw t;return t}{const[t,e]=m();return y[0]=t,i.postMessage(y,o),e}}),o},set:te});return i.addEventListener("message",async({data:t})=>{"string"==typeof t[0]?h.apply(null,t):(await(async(t,e,s)=>{try{const o=await e[t[1]].apply(null,t[2]);t[1]=s?s(o):o,t[2]=null}catch(e){t[2]=e}})(t,f,n),i.postMessage(t))}),i.start(),{native:Vt,proxy:b,ffi_timeout:o,sync:a,transfer:Kt}};const fe={object(...t){return this.string(function(t){for(var e=t[0],s=1,o=arguments.length;s{const e=t||console,s={buffered:xe,stderr:(e.stderr||console.error).bind(e),stdout:(e.stdout||console.log).bind(e)};return{stderr:(...t)=>s.stderr(...t),stdout:(...t)=>s.stdout(...t),async get(t){const e=await t;return be.set(e,s),e}}},ke=new TextDecoder,xe=(t,e=10)=>{const s=[];return o=>{if(o instanceof Uint8Array)for(const i of o)i===e?t(ke.decode(new Uint8Array(s.splice(0)))):s.push(i);else t(o)}},_e=(t,...e)=>fe[typeof t](t,...e),{isArray:ve}=Array,{assign:je,create:ze,defineProperty:Ae,entries:Pe}=Object,{all:Ee,resolve:Se}=new Proxy(Promise,{get:(t,e)=>t[e].bind(t)}),$e=(t,e=location.href)=>new URL(t,e.replace(/^blob:/,"")).href;function Me(t){return t.startsWith(".")?$e(t,this):t}const Re=(t,e,s,o=!1,i=CustomEvent)=>{t.dispatchEvent(new i(`${e}:${s}`,{bubbles:!0,detail:{worker:o}}))},qe=t=>Function(`\'use strict\';return (${t})`)(),Fe=t=>t.replace(/^(?:\\n|\\r\\n)/,""),Be=Symbol.for("polyscript.js_modules"),De=new Map;Ae(globalThis,Be,{value:De}),new Proxy(De,{get:(t,e)=>t.get(e),has:(t,e)=>t.has(e),ownKeys:t=>[...t.keys()]});const Te=(t,e)=>!e.startsWith("_"),Le=(t,e)=>new Proxy(t,{has:Te,get:(t,s)=>t[e][s]}),Oe=(t,e)=>import(t).then(t=>{De.set(e,{...t})}),Ce=t=>new Promise((e,s)=>{document.querySelector(`link[rel="stylesheet"][href="${t}"]`)?e():document.head.append(je(document.createElement("link"),{rel:"stylesheet",href:t,onload:e,onerror:s}))}),Ie=t=>/\\.css$/i.test(new URL(t).pathname),Je=(t,e)=>t.has(e),Ue=t=>[...t.keys()];var He=(t,e,s,o)=>{const i=globalThis[Be];if(s)for(let[t,e]of Pe(s)){let s=i.get(e);s&&!ve(s)||(i.set(e,s||(s=[])),s.push(t))}return((t,e,s,o)=>new Proxy(t,{has:Je,ownKeys:Ue,get:(t,i)=>{let r=t.get(i);if(ve(r)){let a=r;r=null;for(let t of a)t=$e(t,o),Ie(t)?s.importCSS(t):(s.importJS(t,i),r=e[Be].get(i));t.set(i,r)}return r}}))(i,t,e,o)};const We=new Map,Ne=t=>We.get(t),Ke=(t,e)=>{try{return Function("require",e)(Ne)}catch(e){be.get(t).stderr(e)}};var Ge={type:"dummy",module:()=>"data:text/javascript,",engine:t=>we().get(t),registerJSModule(t,e,s){We.set(e,s)},run:Ke,runAsync:Ke,runEvent:async(t,e,s)=>{try{await Function("require","e",`return ${e}(e)`)(Ne,s)}catch(e){be.get(t).stderr(e)}},transform:(t,e)=>e,writeFile(){}};const Ve=Object.getOwnPropertyDescriptors(Response.prototype),Ze=t=>"function"==typeof t,Xe={get:(t,e)=>Ve.hasOwnProperty(e)?((t,e,{get:s,value:o})=>s||!Ze(o)?t.then(t=>t[e]):(...s)=>t.then(t=>t[e](...s)))(t,e,Ve[e]):((t,e)=>Ze(e)?e.bind(t):e)(t,t[e])};var Ye=(t,...e)=>new Proxy(fetch(t,...e).then(e=>e.ok?e:Promise.reject(new Error(`[${e.status}] Unable to fetch ${t}`))),Xe);const Qe=!globalThis.window,ts=({FS:t,PATH:e,PATH_FS:s},o,i)=>{const r=s.resolve(o),a=e.dirname(r);return t.mkdirTree?t.mkdirTree(a):ss(t,a),t.writeFile(r,new Uint8Array(i),{canOwn:!0})},es=t=>{const e=t.split("/");return e.pop(),e.join("/")},ss=(t,e)=>{const s=[];for(const o of e.split("/"))"."!==o&&".."!==o&&(s.push(o),o&&t.mkdir(s.join("/")))},os=(t,e)=>{const s=[];for(const t of e.split("/"))switch(t){case"":case".":break;case"..":s.pop();break;default:s.push(t)}return[t.cwd()].concat(s).join("/").replace(/^\\/+/,"/")},is=t=>{const e=t.map(t=>t.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(t=>""!==t&&"."!==t).join("/");return t[0].startsWith("/")?`/${e}`:e},rs=(t,e)=>Ye($e(t,e)).arrayBuffer(),as=(t,e,s,o)=>Ee((t=>{for(const{files:e,to_file:s,from:o=""}of t){if(void 0!==e&&void 0!==s)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===e&&void 0===s&&o.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${o}, please supply \'to_file\' parameter.`)}return t.flatMap(({from:t="",to_folder:e=".",to_file:s,files:o})=>{if(ve(o))return o.map(s=>({url:is([t,s]),path:is([e,s])}));const i=s||t.slice(1+t.lastIndexOf("/"));return[{url:t,path:is([e,i])}]})})(s).map(({url:s,path:i})=>rs(s,o).then(s=>t.writeFile(e,i,s)))),ns=(t,e)=>e.endsWith("/")?`${e}${t.split("/").pop()}`:e,ps=(t,e)=>t.replace(/\\{.+?\\}/g,t=>{if(!e.has(t))throw new SyntaxError(`Invalid template: ${t}`);return e.get(t)}),cs=(t,e,s,o)=>Ee((t=>{const e=new Map,s=new Set,o=[];for(const[i,r]of Pe(t))if(/^\\{.+\\}$/.test(i)){if(e.has(i))throw new SyntaxError(`Duplicated template: ${i}`);e.set(i,ps(r,e))}else{const t=ps(i,e),a=ns(t,ps(r||"./",e));if(s.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);s.add(a),o.push({url:t,path:a})}return o})(s).map(({url:s,path:i})=>rs(s,o).then(o=>t.writeFile(e,i,o,s)))),ls=({main:t,worker:e},s)=>{const o=[];if(e&&Qe)for(let[t,i]of Pe(e))t=$e(t,s),o.push(Oe(t,i));if(t&&!Qe)for(let[e,i]of Pe(t))e=$e(e,s),Ie(e)?Ce(e):o.push(Oe(e,i));return Ee(o)},ys=t=>e=>{dispatchEvent(new CustomEvent(`${t}:progress`,{detail:e}))},{isNaN:ds,isFinite:us,isInteger:ms}=Number,{ownKeys:hs}=Reflect,{is:gs}=Object,fs=(t,e,s)=>{const o=s.get(t),i=!o;return i?(it.setUint32(0,e.length,!0),s.set(t,[rt[0],rt[1],rt[2],rt[3]])):e.push(T,o[0],o[1],o[2],o[3]),i},bs=(t,e,s)=>{it.setUint32(0,s,!0),t.push(e,rt[0],rt[1],rt[2],rt[3])},ws=(t,e,s)=>{switch(typeof t){case"number":t&&us(t)?ms(t)&&t<256&&-1{const e=[];return ks=st,ws(t,e,new Map),e}},_s=new WeakMap,vs=async(t,e,s,o,i)=>{o.files&&(e("Loading files"),await cs(t,s,o.files,i),e("Loaded files")),o.fetch&&(e("Loading fetch"),await as(t,s,o.fetch,i),e("Loaded fetch")),o.js_modules&&(e("Loading JS modules"),await ls(o.js_modules,i),e("Loaded JS modules"))},js=(t,e,s)=>{"polyscript"===e&&(s.lazy_py_modules=async(...e)=>(await _s.get(t)(e),e.map(e=>t.pyimport(e))),s.storage=async t=>{const e=new n(t);return await e.sync(),e},s.JSON=xs),t.registerJsModule(e,s)},zs=(t,e)=>{if(t.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(e))return RegExp.$1;throw new Error(`Unsupported archive ${e}`)}return""},As=(t,e,...s)=>{try{return t.runPython(_e(e),...s)}catch(e){be.get(t).stderr(e)}},Ps=async(t,e,...s)=>{try{return await t.runPythonAsync(_e(e),...s)}catch(e){be.get(t).stderr(e)}},Es=async(t,e,s)=>{const[o,...i]=e.split(".");let r,a=t.globals.get(o);for(const t of i)[r,a]=[a,a[t]];try{await a.call(r,s)}catch(e){be.get(t).stderr(e)}};var Ss=(new TextEncoder).encode("_F=\'github:\'\\n_E=\'user-agent\'\\n_D=True\\n_C=False\\n_B=\'/\'\\n_A=None\\nfrom uio import StringIO\\nimport sys\\nclass Response:\\n\\tdef __init__(A,f):A.raw=f;A.encoding=\'utf-8\';A._cached=_A\\n\\tdef close(A):\\n\\t\\tif A.raw:A.raw.close();A.raw=_A\\n\\t\\tA._cached=_A\\n\\t@property\\n\\tdef content(self):\\n\\t\\tA=self\\n\\t\\tif A._cached is _A:\\n\\t\\t\\ttry:A._cached=A.raw.read()\\n\\t\\t\\tfinally:A.raw.close();A.raw=_A\\n\\t\\treturn A._cached\\n\\t@property\\n\\tdef text(self):return str(self.content,self.encoding)\\n\\tdef json(A):import ujson;return ujson.loads(A.content)\\nHEADERS_TO_IGNORE=_E,\\ntry:import js\\nexcept Exception as err:raise OSError(\'This version of urequests can only be used in the browser\')\\nHEADERS_TO_IGNORE=_E,\\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\\n\\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\\n\\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\\n\\telse:A.open(D,url,_C)\\n\\tfor(F,J)in headers.items():\\n\\t\\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\\n\\tif E:A.timeout=int(E*1000)\\n\\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader(\'Content-Type\',\'application/json\')\\n\\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\\ndef get(url,**A):return request(\'GET\',url,**A)\\n_PACKAGE_INDEX=const(\'https://micropython.org/pi/v2\')\\n_CHUNK_SIZE=128\\ndef _ensure_path_exists(path):\\n\\timport os;A=path.split(_B)\\n\\tif not A[0]:A.pop(0);A[0]=_B+A[0]\\n\\tB=\'\'\\n\\tfor C in range(len(A)-1):\\n\\t\\tB+=A[C]\\n\\t\\ttry:os.stat(B)\\n\\t\\texcept:os.mkdir(B)\\n\\t\\tB+=_B\\ndef _chunk(src,dest):\\n\\tA=memoryview(bytearray(_CHUNK_SIZE))\\n\\twhile _D:\\n\\t\\tB=src.readinto(A)\\n\\t\\tif B==0:break\\n\\t\\tdest(A if B==_CHUNK_SIZE else A[:B])\\ndef _check_exists(path,short_hash):\\n\\tA=short_hash;import os\\n\\ttry:\\n\\t\\timport binascii as C,hashlib as D\\n\\t\\twith open(path,\'rb\')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],\'utf-8\');return F==A\\n\\texcept:return _C\\ndef _rewrite_url(url,branch=_A):\\n\\tB=branch;A=url\\n\\tif not B:B=\'HEAD\'\\n\\tif A.startswith(_F):A=A[7:].split(_B);A=\'https://raw.githubusercontent.com/\'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\\n\\treturn A\\ndef _download_file(url,dest):\\n\\tB=dest;A=get(url)\\n\\ttry:\\n\\t\\tif A.status_code!=200:print(\'Error\',A.status_code,\'requesting\',url);return _C\\n\\t\\tprint(\'Copying:\',B);_ensure_path_exists(B)\\n\\t\\twith open(B,\'wb\')as C:_chunk(A.raw,C.write)\\n\\t\\treturn _D\\n\\tfinally:A.close()\\ndef _install_json(package_json_url,index,target,version,mpy):\\n\\tK=\'File not found: {} {}\';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\\n\\ttry:\\n\\t\\tif E.status_code!=200:print(\'Package not found:\',G);return _C\\n\\t\\tF=E.json()\\n\\tfinally:E.close()\\n\\tfor(A,C)in F.get(\'hashes\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif _check_exists(B,C):print(\'Exists:\',B)\\n\\t\\telse:\\n\\t\\t\\tL=\'{}/file/{}/{}\'.format(H,C[:2],C)\\n\\t\\t\\tif not _download_file(L,B):print(K.format(A,C));return _C\\n\\tfor(A,J)in F.get(\'urls\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\\n\\tfor(M,N)in F.get(\'deps\',()):\\n\\t\\tif not _install_package(M,H,D,N,mpy):return _C\\n\\treturn _D\\ndef _install_package(package,index,target,version,mpy):\\n\\tD=index;C=target;B=version;A=package\\n\\tif A.startswith(\'http://\')or A.startswith(\'https://\')or A.startswith(_F):\\n\\t\\tif A.endswith(\'.py\')or A.endswith(\'.mpy\'):print(\'Downloading {} to {}\'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\\n\\t\\telse:\\n\\t\\t\\tif not A.endswith(\'.json\'):\\n\\t\\t\\t\\tif not A.endswith(_B):A+=_B\\n\\t\\t\\t\\tA+=\'package.json\'\\n\\t\\t\\tprint(\'Installing {} to {}\'.format(A,C))\\n\\telse:\\n\\t\\tif not B:B=\'latest\'\\n\\t\\tprint(\'Installing {} ({}) from {} to {}\'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,\'_mpy\')else\'py\';A=\'{}/package/{}/{}/{}.json\'.format(D,\'py\',A,B)\\n\\treturn _install_json(A,D,C,B,mpy)\\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\\n\\tB=target;A=index\\n\\tif not B:\\n\\t\\tfor C in sys.path:\\n\\t\\t\\tif C.endswith(\'/lib\'):B=C;break\\n\\t\\telse:print(\'Unable to find lib dir in sys.path\');return\\n\\tif not A:A=_PACKAGE_INDEX\\n\\tif _install_package(package,A.rstrip(_B),B,version,mpy):print(\'Done\')\\n\\telse:print(\'Package may be partially installed\')");const $s=async t=>(await import("./toml-BK2RWy-G.js")).parse(t);async function Ms(t,e){return new Promise((s,o)=>{t.syncfs(e,t=>{t?o(t):s()})})}function Rs(t){const e=t.FS,s=t.FS.filesystems.MEMFS,o=t.PATH,i={DIR_MODE:16895,FILE_MODE:33279,mount:function(t){if(!t.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return s.mount.apply(null,arguments)},syncfs:async(t,e,s)=>{try{const o=i.getLocalSet(t),r=await i.getRemoteSet(t),a=e?r:o,n=e?o:r;await i.reconcile(t,a,n),s(null)}catch(t){s(t)}},getLocalSet:t=>{let s=Object.create(null);function i(t){return"."!==t&&".."!==t}function r(t){return e=>o.join2(t,e)}let a=e.readdir(t.mountpoint).filter(i).map(r(t.mountpoint));for(;a.length;){let t=a.pop(),o=e.stat(t);e.isDir(o.mode)&&a.push.apply(a,e.readdir(t).filter(i).map(r(t))),s[t]={timestamp:o.mtime,mode:o.mode}}return{type:"local",entries:s}},getRemoteSet:async t=>{const e=Object.create(null),s=await qs(t.opts.fileSystemHandle);for(const[r,a]of s)"."!==r&&(e[o.join2(t.mountpoint,r)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?i.FILE_MODE:i.DIR_MODE});return{type:"remote",entries:e,handles:s}},loadLocalEntry:t=>{const o=e.lookupPath(t).node,i=e.stat(t);if(e.isDir(i.mode))return{timestamp:i.mtime,mode:i.mode};if(e.isFile(i.mode))return o.contents=s.getFileDataAsTypedArray(o),{timestamp:i.mtime,mode:i.mode,contents:o.contents};throw new Error("node type not supported")},storeLocalEntry:(t,s)=>{if(e.isDir(s.mode))e.mkdirTree(t,s.mode);else{if(!e.isFile(s.mode))throw new Error("node type not supported");e.writeFile(t,s.contents,{canOwn:!0})}e.chmod(t,s.mode),e.utime(t,s.timestamp,s.timestamp)},removeLocalEntry:t=>{var s=e.stat(t);e.isDir(s.mode)?e.rmdir(t):e.isFile(s.mode)&&e.unlink(t)},loadRemoteEntry:async t=>{if("file"===t.kind){const e=await t.getFile();return{contents:new Uint8Array(await e.arrayBuffer()),mode:i.FILE_MODE,timestamp:e.lastModifiedDate}}if("directory"===t.kind)return{mode:i.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+t.kind)},storeRemoteEntry:async(t,s,i)=>{const r=t.get(o.dirname(s)),a=e.isFile(i.mode)?await r.getFileHandle(o.basename(s),{create:!0}):await r.getDirectoryHandle(o.basename(s),{create:!0});if("file"===a.kind){const t=await a.createWritable();await t.write(i.contents),await t.close()}t.set(s,a)},removeRemoteEntry:async(t,e)=>{const s=t.get(o.dirname(e));await s.removeEntry(o.basename(e)),t.delete(e)},reconcile:async(t,s,r)=>{let a=0;const n=[];Object.keys(s.entries).forEach(function(t){const o=s.entries[t],i=r.entries[t];(!i||e.isFile(o.mode)&&o.timestamp.getTime()>i.timestamp.getTime())&&(n.push(t),a++)}),n.sort();const p=[];if(Object.keys(r.entries).forEach(function(t){s.entries[t]||(p.push(t),a++)}),p.sort().reverse(),!a)return;const c="remote"===s.type?s.handles:r.handles;for(const e of n){const s=o.normalize(e.replace(t.mountpoint,"/")).substring(1);if("local"===r.type){const t=c.get(s),o=await i.loadRemoteEntry(t);i.storeLocalEntry(e,o)}else{const t=i.loadLocalEntry(e);await i.storeRemoteEntry(c,s,t)}}for(const e of p)if("local"===r.type)i.removeLocalEntry(e);else{const s=o.normalize(e.replace(t.mountpoint,"/")).substring(1);await i.removeRemoteEntry(c,s)}}};return t.FS.filesystems.NATIVEFS_ASYNC=i,async function(t,s){if("FileSystemDirectoryHandle"!==s.constructor.name)throw new TypeError("Expected argument \'fileSystemHandle\' to be a FileSystemDirectoryHandle");return function(t){e.mkdirTree?e.mkdirTree(t):ss(e,t);const{node:s}=e.lookupPath(t,{follow_mount:!1});if(e.isMountpoint(s))throw new Error(`path \'${t}\' is already a file system mount point`);if(!e.isDir(s.mode))throw new Error(`path \'${t}\' points to a file not a directory`);for(const e in s.contents)throw new Error(`directory \'${t}\' is not empty`)}(t),e.mount(e.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:s},t),await Ms(e,!0),{syncfs:async()=>await Ms(e,!1)}}}const qs=async t=>{const e=[];await async function t(s){for await(const o of s.values())e.push(o),"directory"===o.kind&&await t(o)}(t);const s=new Map;s.set(".",t);for(const o of e){const e=(await t.resolve(o)).join("/");s.set(e,o)}return s},{parse:Fs}=JSON,Bs=(t,e)=>new URL(t,e).href,Ds=(t,e,s)=>{if(e in t)throw new Error(`Duplicated path: ${e}`);t[e]=s},Ts=(t,e,s)=>{for(const o in e)Ds(t,Bs(o,s),e[o])},Ls=(t,e,s,o)=>{const i=e[s];i&&(t[s]??={},Ts(t[s],i,o))},Os=async(t,e=t.packages,s=new Set)=>{const o=[];for(const i of e){if(s.has(i))continue;s.add(i);const e=i.endsWith(".toml");if(e||i.endsWith(".json")){const r=await Ye(i).text(),{name:a,files:n,js_modules:p,packages:c}=e?await $s(r):Fs(r);if(s.has(a))throw new Error(`Unable to process ${a} @ ${i}`);s.add(a),c&&o.push(...await Os(t,c,s)),p&&(t.js_modules??={},Ls(t.js_modules,p,"main",i),Ls(t.js_modules,p,"worker",i)),n&&(t.files??={},Ts(t.files,n,i))}else o.push(i)}return o},Cs=(t,e)=>{try{t.mkdir(e)}catch(t){}},Is=ys("mpy");var Js={type:"micropython",module:(t="1.27.0-preview-283")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${t}/micropython.mjs`,async engine({loadMicroPython:t},e,s,o){const{stderr:i,stdout:r,get:a}=we({stderr:xe(console.error),stdout:xe(console.log)});s=s.replace(/\\.m?js$/,".wasm"),Is("Loading MicroPython");const n=await a(t({linebuffer:!1,stderr:i,stdout:r,url:s}));globalThis[Be].set("-T-",this.transform.bind(this,n));const p=Us.bind(this,n,o);return _s.set(n,p),await vs(this,Is,n,e,o),this.writeFile(n,"./mip.py",Ss),e.packages&&(e.experimental_remote_packages&&(Is("Loading remote packages"),e.packages=await Os(e),Is("Loaded remote packages")),Is("Loading packages"),await p(e.packages.map(Me,o)),Is("Loaded packages")),Is("Loaded MicroPython"),n.mountNativeFS||(n.mountNativeFS=Rs(n._module)),n},registerJSModule:js,run:As,runAsync:Ps,runEvent:Es,transform:(t,e)=>t.PyProxy.toJs(e),writeFile:(t,e,s,o)=>{const{FS:i,_module:{PATH:r,PATH_FS:a}}=t,n={FS:i,PATH:r,PATH_FS:a},p=zs(e,o);if(p){const o=e.slice(0,-1);switch("./"!==o&&i.mkdir(o),p){case"whl":case"zip":{const t=new Blob([s],{type:"application/zip"});return import("./zip-CakRHzZu.js").then(async({BlobReader:e,Uint8ArrayWriter:s,ZipReader:a})=>{const n=new a(new e(t));for(const t of await n.getEntries()){const{directory:e,filename:a}=t,n=o+a;if(e)Cs(i,n);else{Cs(i,r.dirname(n));const e=await t.getData(new s);i.writeFile(n,e,{canOwn:!0})}}n.close()})}case"tgz":case"tar.gz":{const e="./_.tar.gz";return ts(n,e,s),void t.runPython(`\\n import os, gzip, tarfile\\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${e}", "rb")))\\n for f in tar:\\n name = f"${o}{f.name}"\\n if f.type == tarfile.DIRTYPE:\\n if f.name != "./":\\n os.mkdir(name.strip("/"))\\n else:\\n dir = os.path.dirname(name)\\n if not os.path.exists(dir):\\n os.mkdir(dir)\\n source = tar.extractfile(f)\\n with open(name, "wb") as dest:\\n dest.write(source.read())\\n dest.close()\\n tar.close()\\n os.remove("${e}")\\n `)}}}return ts(n,e,s)}};async function Us(t,e,s){let o;for(const i of s)if(i.endsWith(".whl")){const s=$e(i,e),o=await Ye(s).arrayBuffer();await this.writeFile(t,"./*",o,s)}else o||(o=t.pyimport("mip")),o.install(i)}const Hs={dict_converter:Object.fromEntries},{stringify:Ws}=JSON,{hasOwn:Ns}=Object,{apply:Ks}=Reflect,Gs=Function.prototype,Vs=t=>function(...e){return Ks(t,this,e)};let Zs,Xs;const Ys=t=>{const e=new WeakMap,s=s=>{for(let o,i=0;i`https://cdn.jsdelivr.net/pyodide/v${t}/full/pyodide.mjs`,async engine({loadPyodide:t,version:e},s,o,i){Qs("Loading Pyodide");let{packages:r,index_urls:a}=s;if(r&&!a){r=r.map(Me,i),Qs("Loading Packages Graph");const{default:t}=await Promise.resolve().then(function(){return ro});if(Qs("Loaded Packages Graph"),Ns(t,e)){const s=r.filter(s=>{if(/^[a-zA-Z0-9_-]/.test(s)){const[o,...i]=s.split(/[>=<]=/);return!Ns(t[e],o)||i.length>0&&i[1]!==t[e][o]}return!1});if(s.length>0)throw new Error(`These packages are not supported in Pyodide ${e}: ${s.join(", ")}`)}}Qs("Loading Storage");const p=o.slice(0,o.lastIndexOf("/")),c=new n(`${p}@${e}`),l={indexURL:p},y="never"!==s.packages_cache&&"0.28.0"!==e;if(await c.sync(),Qs("Loaded Storage"),y||c.clear(),r&&(s.experimental_remote_packages&&(Qs("Loading remote packages"),s.packages=r=await Os(s,r),Qs("Loaded remote packages")),y))if("passthrough"===s.packages_cache)l.packages=r,r=null,c.clear();else{r=r.sort();const t=Ws(r);if(c.has(t)){const s=c.get(t);if(l.packages=r.map(t=>t.split(/[>=<]=/)[0]),e.startsWith("0.27")){const t=new Blob([s],{type:"application/json"});l.lockFileURL=URL.createObjectURL(t)}else l.lockFileContents=s;r=null}}const{stderr:d,stdout:u,get:m}=we();Qs("Loading interpreter");const h=await m(t({stderr:d,stdout:u,...l}));Qs("Loaded interpreter"),globalThis[Be].set("-T-",this.transform.bind(this,h)),s.debug&&h.setDebug(!0);const g=oo.bind(h);return a&&to.set(h,a),_s.set(h,g),await vs(this,Qs,h,s,i),r&&await g(r,c,y),await c.close(),l.lockFileURL&&URL.revokeObjectURL(l.lockFileURL),Qs("Loaded Pyodide"),"auto"===s.experimental_create_proxy&&(h.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:h.toPy({})}),Xs=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Zs]=Reflect.ownKeys(Xs).filter(t=>"symbol"==typeof t&&"Symbol(pyproxy.attrs)"===String(t)),Ys(!0)),h},registerJSModule:js,run:Vs(As),runAsync:Vs(Ps),runEvent:Vs(Es),transform:(t,e)=>Ks(so,t,[e]),writeFile:(t,e,s,o)=>{const i=zs(e,o);if(i)return t.unpackArchive(s,i,{extractDir:e.slice(0,-1)});const{FS:r,PATH:a,_module:{PATH_FS:n}}=t;return ts({FS:r,PATH:a,PATH_FS:n},e,s)}};function so(t){const{ffi:{PyProxy:e}}=this;if(t&&"object"==typeof t){if(t instanceof e)return t.toJs(Hs);if(t instanceof Map)return new Map([...t.entries()]);if(ve(t))return t.map(so,this)}return t}async function oo(t,e,s=!1){const{log:o}=console,i=(t,...e)=>{o(t,...e),console.log=o,Qs(t),console.log=i};console.log=i,await this.loadPackage("micropip");const r=this.pyimport("micropip");if(to.has(this)&&r.set_index_urls(to.get(this)),await r.install(t,{keep_going:!0}),console.log=o,s&&e instanceof n){const s=r.freeze();e.set(Ws(t),s)}r.destroy()}var io={latest:{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},stable:{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.3":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.2":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.1":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.28.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.7":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.6":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.5":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.4":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.3":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.2":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.1":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.27.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.49.1.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3",biopython:"1.85",bitarray:"3.6.0",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.5.0",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.7.14",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.2",clarabel:"0.11.0",click:"8.2.1",cligj:"0.7.2",clingo:"5.7.1",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"45.0.5","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.0",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.3.3",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.5.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.0",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.10.1",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.3",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.1",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.0.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-dateutil":"2.9.0.post0","python-flint":"0.7.1","python-magic":"0.4.27","python-sat":"1.8.dev17","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.0.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.5","rpds-py":"0.23.1","ruamel.yaml":"0.18.10",rustworkx:"0.17.0a3","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.14.1",tzdata:"2025.2",ujson:"5.10.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.1.2",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"},"0.29.0":{affine:"2.4.0",aiohappyeyeballs:"2.6.1",aiohttp:"3.11.13",aiosignal:"1.3.2",altair:"5.5.0","annotated-types":"0.7.0",anyio:"4.9.0",apsw:"3.50.4.0","argon2-cffi":"23.1.0","argon2-cffi-bindings":"21.2.0",asciitree:"0.3.3",astropy:"7.0.1",astropy_iers_data:"0.2025.3.10.0.29.26",asttokens:"3.0.0","async-timeout":"5.0.1",atomicwrites:"1.4.1",attrs:"25.2.0","audioop-lts":"0.2.1",autograd:"1.7.0","awkward-cpp":"47",b2d:"0.7.4",bcrypt:"4.3.0",beautifulsoup4:"4.13.3","bilby.cython":"0.5.3",biopython:"1.85",bitarray:"3.7.1",bitstring:"4.3.1",bleach:"6.2.0",blosc2:"3.5.1",bokeh:"3.6.3","boost-histogram":"1.6.1",brotli:"1.1.0",cachetools:"5.5.2",casadi:"3.7.0","cbor-diag":"1.0.1",certifi:"2025.8.3",cffi:"1.17.1",cffi_example:"0.1",cftime:"1.6.4.post1","charset-normalizer":"3.4.3",clarabel:"0.11.0",click:"8.3.0",cligj:"0.7.2",clingo:"5.8.0",cloudpickle:"3.1.1",cmyt:"2.0.2",cobs:"1.2.1",colorspacious:"1.1.2",contourpy:"1.3.1",coolprop:"6.6.0",coverage:"7.6.12",cramjam:"2.10.0rc1",crc32c:"2.7.1",cryptography:"46.0.1","css-inline":"0.16.0",cssselect:"1.3.0","cvxpy-base":"1.6.3",cycler:"0.12.1",cysignals:"1.12.3",cytoolz:"1.0.1",decorator:"5.2.1",demes:"0.2.3",deprecation:"2.1.0",diskcache:"5.6.3",distlib:"0.3.9",distro:"1.9.0",docutils:"0.21.2",donfig:"0.8.1.post1",ewah_bool_utils:"1.2.2",exceptiongroup:"1.2.2",executing:"2.2.0",fastapi:"0.116.1",fastcan:"0.4.1",fastparquet:"2024.11.0",fiona:"1.9.5",fonttools:"4.56.0",freesasa:"2.2.1",frozenlist:"1.6.0",fsspec:"2025.3.2",future:"1.0.0",galpy:"1.10.2",gmpy2:"2.1.5",gsw:"3.6.19",h11:"0.14.0",h3:"4.2.2",h5py:"3.13.0",highspy:"1.11.0",html5lib:"1.1",httpcore:"1.0.7",httpx:"0.28.1",idna:"3.10",igraph:"0.11.8",imageio:"2.37.0","imgui-bundle":"1.92.4",iminuit:"2.30.1",iniconfig:"2.1.0",inspice:"1.6.4.1",ipython:"9.0.2",jedi:"0.19.2",Jinja2:"3.1.6",jiter:"0.9.0",joblib:"1.4.2",jsonpatch:"1.33",jsonpointer:"3.0.0",jsonschema:"4.23.0",jsonschema_specifications:"2024.10.1",kiwisolver:"1.4.8","lakers-python":"0.6.0",lazy_loader:"0.4","lazy-object-proxy":"1.10.0",libcst:"1.6.0",lightgbm:"4.6.0",logbook:"1.8.0",lxml:"6.0.2",lz4:"4.4.4",MarkupSafe:"3.0.2",matplotlib:"3.8.4","matplotlib-inline":"0.1.7","memory-allocator":"0.1.4",micropip:"0.11.0",mmh3:"5.1.0","more-itertools":"10.6.0",mpmath:"1.3.0",msgpack:"1.1.1",msgspec:"0.19.0",msprime:"1.3.3",multidict:"6.6.4",munch:"4.0.0",mypy:"1.15.0",narwhals:"1.46.0",ndindex:"1.9.2",netcdf4:"1.7.2",networkx:"3.4.2",newick:"1.9.0",nh3:"0.2.21",nlopt:"2.9.1",nltk:"3.9.1",numcodecs:"0.13.1",numpy:"2.2.5",openai:"1.68.2","opencv-python":"4.11.0.86",optlang:"1.8.3",orjson:"3.10.16",packaging:"24.2",pandas:"2.3.2",parso:"0.8.4",patsy:"1.0.1",pcodec:"0.3.3",peewee:"3.17.9","pi-heif":"0.21.0",Pillow:"11.3.0","pillow-heif":"1.1.0",pkgconfig:"1.5.5",platformdirs:"4.3.6",pluggy:"1.5.0",ply:"3.11",pplpy:"0.8.10",primecountpy:"0.1.1",prompt_toolkit:"3.0.50",propcache:"0.3.0",protobuf:"6.31.1","pure-eval":"0.2.3",py:"1.11.0",pyclipper:"1.3.0.post6",pycparser:"2.22",pycryptodome:"3.21.0",pydantic:"2.10.6",pydantic_core:"2.27.2",pyerfa:"2.0.1.5","pygame-ce":"2.5.6.dev2",Pygments:"2.19.1",pyheif:"0.8.0",pyiceberg:"0.9.0",pyinstrument:"5.0.1","pylimer-tools":"0.3.11",PyMuPDF:"1.26.3",pynacl:"1.5.0","pyodide-http":"0.2.2","pyodide-unix-timezones":"1.0.0",pyparsing:"3.2.1",pyrsistent:"0.20.0",pysam:"0.23.0",pyshp:"2.3.1",pytaglib:"3.0.1",pytest:"8.3.5","pytest-asyncio":"0.25.3","pytest-benchmark":"4.0.0",pytest_httpx:"0.30.0","python-calamine":"0.5.3","python-dateutil":"2.9.0.post0","python-flint":"0.8.0","python-magic":"0.4.27","python-sat":"1.8.dev23","python-solvespace":"3.0.8",pytz:"2025.2",pywavelets:"1.8.0",pyxel:"1.9.10",pyxirr:"0.10.6",pyyaml:"6.0.2",rasterio:"1.4.3",rateslib:"2.1.1",rebound:"4.4.7",reboundx:"4.4.1",referencing:"0.36.2",regex:"2024.11.6",requests:"2.32.4",retrying:"1.3.4",rich:"13.9.4",river:"0.22.0",RobotRaconteur:"1.2.6","rpds-py":"0.27.0","ruamel.yaml":"0.18.10",rustworkx:"0.17.1","scikit-image":"0.25.2","scikit-learn":"1.7.0",scipy:"1.14.1",screed:"1.1.3",setuptools:"76.0.0",shapely:"2.0.7",simplejson:"3.20.1",sisl:"0.16.2",six:"1.17.0","smart-open":"7.1.0",sniffio:"1.3.1",sortedcontainers:"2.4.0",soundfile:"0.12.1",soupsieve:"2.6",sourmash:"4.8.14",soxr:"0.5.0.post1",sparseqr:"1.2",sqlalchemy:"2.0.39","stack-data":"0.6.3",starlette:"0.47.2",statsmodels:"0.14.4",strictyaml:"1.7.3",svgwrite:"1.4.3",swiglpk:"5.0.12",sympy:"1.13.3",tblib:"3.0.0",termcolor:"2.5.0",texttable:"1.7.0",texture2ddecoder:"1.0.5",threadpoolctl:"3.5.0",tiktoken:"0.9.0",tomli:"2.2.1","tomli-w":"1.2.0",toolz:"1.0.0",tqdm:"4.67.1",traitlets:"5.14.3",traits:"7.0.2","tree-sitter":"0.23.2","tree-sitter-go":"0.23.3","tree-sitter-java":"0.23.4","tree-sitter-python":"0.23.4",tskit:"0.6.4","typing-extensions":"4.15.0",tzdata:"2025.2",ujson:"5.11.0",uncertainties:"3.2.2",unyt:"3.0.3",urllib3:"2.5.0","vega-datasets":"0.9.0",vrplib:"2.0.1",wcwidth:"0.2.13",webencodings:"0.5.1",wordcloud:"1.9.4",wrapt:"1.17.2",xarray:"2025.9.0",xgboost:"2.1.4",xlrd:"2.0.1",xxhash:"3.5.0",xyzservices:"2025.1.0",yarl:"1.18.3",yt:"4.4.0",zengl:"2.7.1",zfpy:"1.0.1",zstandard:"0.23.0"}},ro=Object.freeze({__proto__:null,default:io});const ao="ruby-wasm-wasi",no=ao.replace(/\\W+/g,"_");var po={type:ao,experimental:!0,module:(t="2.7.2")=>`https://cdn.jsdelivr.net/npm/@ruby/3.2-wasm-wasi@${t}/dist/browser/+esm`,async engine({DefaultRubyVM:t},e,s,o){s=s.replace(/\\/browser\\/\\+esm$/,"/ruby.wasm");const i=await Ye(s).arrayBuffer(),r=await WebAssembly.compile(i),{vm:a}=await t(r);return e.files&&await cs(this,a,e.files,o),e.fetch&&await as(this,a,e.fetch,o),e.js_modules&&await ls(e.js_modules,o),a},registerJSModule(t,e,s){e=e.replace(/\\W+/g,"__");const o=`__module_${no}_${e}`;globalThis[o]=s,this.run(t,`require "js";$${e}=JS.global[:${o}]`),delete globalThis[o]},run:(t,e,...s)=>t.eval(_e(e),...s),runAsync:(t,e,...s)=>t.evalAsync(_e(e),...s),async runEvent(t,e,s){if(/^xworker\\.(on\\w+)$/.test(e)){const{$1:e}=RegExp,o=`__module_${no}_event`;globalThis[o]=s,this.run(t,`require "js";$xworker.call("${e}",JS.global[:${o}])`),delete globalThis[o]}else{const o=this.run(t,`method(:${e})`);await o.call(e,t.wrap(s))}},transform:(t,e)=>e,writeFile:()=>{throw new Error(`writeFile is not supported in ${ao}`)}};var co={type:"wasmoon",module:(t="1.16.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${t}/+esm`,async engine({LuaFactory:t,LuaLibraries:e},s,o,i){const{stderr:r,stdout:a,get:n}=we(),p=await n((new t).createEngine());return p.global.getTable(e.Base,t=>{p.global.setField(t,"print",a),p.global.setField(t,"printErr",r)}),s.files&&await cs(this,p,s.files,i),s.fetch&&await as(this,p,s.fetch,i),s.js_modules&&await ls(s.js_modules,i),p},registerJSModule:(t,e,s)=>{t.global.set(e,s)},run:(t,e,...s)=>{try{return t.doStringSync(_e(e),...s)}catch(e){be.get(t).stderr(e)}},runAsync:async(t,e,...s)=>{try{return await t.doString(_e(e),...s)}catch(e){be.get(t).stderr(e)}},runEvent:async(t,e,s)=>{const[o,...i]=e.split(".");let r,a=t.global.get(o);for(const t of i)[r,a]=[a,a[t]];try{await a.call(r,s)}catch(e){be.get(t).stderr(e)}},transform:(t,e)=>e,writeFile:({cmodule:{module:{FS:t}}},e,s)=>((t,e,s)=>(ss(t,es(e)),e=os(t,e),t.writeFile(e,new Uint8Array(s),{canOwn:!0})))(t,e,s)};const lo=new WeakMap,yo=new FinalizationRegistry(t=>t()),uo=async(t,e)=>{const{shelter:s,destroy:o,io:i}=lo.get(t),{output:r,result:a}=await s.captureR(_e(e));for(const{type:t,data:e}of r)i[t](e);return yo.register(a,o),a};var mo={type:"webr",experimental:!0,module:(t="0.5.6")=>`https://cdn.jsdelivr.net/npm/webr@${t}/dist/webr.mjs`,async engine(t,e,s,o){const{get:i}=we(),r=new t.WebR;await i(r.init().then(()=>r));const a=await new r.Shelter;return lo.set(r,{module:t,shelter:a,destroy:a.destroy.bind(a),io:be.get(r)}),e.files&&await cs(this,r,e.files,o),e.fetch&&await as(this,r,e.fetch,o),e.js_modules&&await ls(e.js_modules,o),r},registerJSModule(t,e){console.warn(`Experimental interpreter: module ${e} is not supported (yet)`)},run:uo,runAsync:uo,async runEvent(t,e,s){await t.evalRVoid(`${e}(event)`,{env:{event:{type:[s.type]}}})},transform:(t,e)=>e,writeFile:()=>{}};const ho=new Map,go=new Map,fo=new Proxy(new Map,{get(t,e){if(!t.has(e)){const[s,...o]=e.split("@"),i=ho.get(s),r=/^(?:\\.?\\.?\\/|[a-z0-9-]+:\\/\\/)/i.test(o)?o.join("@"):i.module(...o);t.set(e,{url:r,module:import(r),engine:i.engine.bind(i)})}const{url:s,module:o,engine:i}=t.get(e);return(t,r)=>o.then(o=>(go.set(e,t),i(o,t,s,r)))}}),bo=t=>{for(const e of[].concat(t.type))ho.set(e,t)};for(const t of[Ge,Js,eo,io,po,co,mo])bo(t);const{parse:wo}=JSON,ko=(t,e,s={})=>{const[o,i]=((t,e="./config.txt")=>{let s=typeof t;return"string"===s&&/\\.(json|toml|txt)$/.test(t)?s=RegExp.$1:t=e,[$e(t),s]})(t,e);return"json"===i?s=Ye(o).json():"toml"===i?s=Ye(o).text().then($s):"string"===i?s=xo(t):"object"===i&&t?s=t:"txt"===i&&"string"==typeof s&&(s=xo(s)),[s,t=o]},xo=t=>{try{return wo(t)}catch(e){return $s(t)}},_o="BeforeRun",vo="AfterRun",jo=[`code${_o}`,`code${_o}Async`,`code${vo}`,`code${vo}Async`],zo=["onWorker","onReady",`on${_o}`,`on${_o}Async`,`on${vo}`,`on${vo}Async`];function Ao(t,e){const{run:s,runAsync:o}=ho.get(this.type);return{...t,run:s.bind(this,e),runAsync:o.bind(this,e)}}const Po=(t,e,s,o,i,r)=>{if(i||r){const a=Ao.bind(t,e),n=o?"runAsync":"run",p=t[n];t[n]=o?async function(t,e,...o){i&&await i.call(this,a(t),s);const n=await p.call(this,t,e,...o);return r&&await r.call(this,a(t),s),n}:function(t,e,...o){i&&i.call(this,a(t),s);const n=p.call(this,t,e,...o);return r&&r.call(this,a(t),s),n}}};let Eo,So,$o;const Mo=(t,e)=>{addEventListener(t,e||(async e=>{try{await Eo,So(`xworker.on${t}`,e)}catch(t){postMessage(t)}}),!!e&&{once:!0})},{proxy:Ro,sync:qo,native:Fo,window:Bo,isWindowProxy:Do,ffi:To}=await(async t=>{const e=await ge({...t,decoder:t?.decoder||dt}),s=Jt({...t,buffer:!0,reflect:e.proxy[c],timeout:e.ffi_timeout});return e.proxy[l]=s.reflect,{...e,window:s.global,isWindowProxy:s.isProxy,ffi:{assign:s.assign,direct:s.direct,evaluate:s.evaluate,gather:s.gather,query:s.query}}})({transfer:!1,transform:t=>$o?$o(t):t}),Lo={polyfill:qo,sync:Ro,window:Fo||qo?Bo:null,isWindowProxy:Do,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};Mo("message",({data:{options:t,config:e,configURL:s,code:o,hooks:i}})=>{Eo=(async()=>{try{const{id:r,tag:p,type:c,custom:l,version:y,config:d,async:u}=t,m=((t,e="")=>`${t}@${e}`.replace(/@$/,""))(c,y),h=await((t,e,s,o={})=>(e&&([o,e]=ko(e,s,o)),Se(o).then(s=>fo[t](s,e))))(m,e,s,d),{js_modules:g}=go.get(m),f=g?.main,b=ze(ho.get(c)),w=((t,e,s,o)=>({type:e,config:s,interpreter:o,io:be.get(o),run:(e,...s)=>t.run(o,e,...s),runAsync:(e,...s)=>t.runAsync(o,e,...s),runEvent:(...e)=>t.runEvent(o,...e)}))(b,l||c,d||{},h);let k="run";if(u&&(k+="Async"),i){let t,e,s="",o="";for(const t of jo){const e=i[t];if(e){const i=t.endsWith("Async");(i&&u||!i&&!u)&&(t.startsWith("codeBefore")?s=e:o=e)}}(s||o)&&((t,e,s,o)=>{const i=t[e].bind(t);t[e]="run"===e?(t,e,...r)=>{s&&i(t,s,...r);const a=i(t,Fe(e),...r);return o&&i(t,o,...r),a}:async(t,e,...r)=>{s&&await i(t,s,...r);const a=await i(t,Fe(e),...r);return o&&await i(t,o,...r),a}})(b,k,s,o);for(const s of zo.slice(2)){const o=i[s];if(o){const i=s.endsWith("Async");if(i&&u||!i&&!u){const i=qe(o);s.startsWith("onBefore")?t=i:e=i}}}Po(b,w,Lo,u,t,e)}let x,_,v,j=null,z="";(Fo||qo)&&(({CustomEvent:x,document:_}=Bo),j=r&&_.getElementById(r)||null,v=t=>Re(j,l||c,t,!0,x));const A=He(Bo,Ro,f,e);if(((t,e,s,o)=>{if("pyodide"===t)return;const i="polyscript.js_modules";for(const t of Reflect.ownKeys(o))e.registerJSModule(s,`${i}.${t}`,Le(o,t));e.registerJSModule(s,i,o)})(c,b,h,A),b.registerJSModule(h,"polyscript",{IDBMap:a,IDBMapSync:n,xworker:Lo,currentScript:j,config:w.config,js_modules:A,ffi:To,get target(){return!z&&j&&("SCRIPT"===p?j.after(je(Bo.document.createElement(`script-${l||c}`),{id:z=`${r}-target`})):(z=r,j.replaceChildren(),j.style.display="block")),z}}),So=b.runEvent.bind(b,h),$o=b.transform.bind(b,h),j&&v("ready"),i?.onReady&&qe(i?.onReady).call(b,Ao.call(b,w,h),Lo),await b[k](h,o),["micropython","pyodide"].includes(b.type)){const t="polyscript",e=`__${t}_workers__`,s="__export__";h.runPython([`import js as ${e}`,`${e}.${e} = "${s}" in locals() and ${s} or []`,`del ${e}`].join("\\n"));const o=[...globalThis[e]];delete globalThis[e],o.length&&h.runPython([`from ${t} import xworker as ${e}`,...o.map(t=>`${e}.sync.${t} = ${t}`),`del ${e}`].join("\\n"))}return j&&v("done"),postMessage("polyscript:done"),h}catch(t){postMessage(t)}})(),Mo("error"),Mo("message"),Mo("messageerror"),(Fo||qo)&&addEventListener("py:progress",({type:t,detail:e})=>{Bo.dispatchEvent(new Bo.CustomEvent(t,{detail:e}))})});\n'.replace(He,Ne)],{type:"text/javascript"})),...t))({serviceWorker:s?.serviceWorker||s?.service_worker,reflected_ffi_timeout:globalThis.reflected_ffi_timeout??-1}),{postMessage:a}=r,n=this instanceof mr,p=ds(r.proxy,{importJS:qs,importCSS:Bs}),c=m();let l=i(e).text().then(t=>{const e=n?this.toJSON():void 0;a.call(r,{options:s,config:o,code:t,hooks:e})}).then(()=>{l={then:t=>t()}});return ms(r,{sync:{value:p},ready:{value:c.promise},postMessage:{value:(t,...e)=>l.then(()=>a.call(r,t,...e))},onerror:{writable:!0,configurable:!0,value:console.error}}),r.addEventListener("message",t=>{const{data:e}=t,s=e instanceof Error;(s||"polyscript:done"===e)&&(t.stopImmediatePropagation(),s?(c.reject(e),r.onerror(us(t,{type:{value:"error"},error:{value:e}}))):c.resolve(r))}),n&&this.onWorker?.(this.interpreter,r),r};const gr="Invalid content",fr="Invalid worker attribute",br="Invalid worker attribute";var wr=t=>{const{src:e,worker:s}=t.attributes;if(s){let{value:o}=s;if(o)throw new SyntaxError(br);if(o=e?.value,!o){if(e)throw new SyntaxError(fr);if(t.childElementCount){const{innerHTML:e,localName:s,type:r}=t,i=r||s.replace(/-script$/,"");o=ls(e),console.warn(`Deprecated: use