@dtour/scatter 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/data/colormaps2d.d.ts +24 -0
- package/dist/data/colormaps2d.d.ts.map +1 -0
- package/dist/data/messages.d.ts +18 -0
- package/dist/data/messages.d.ts.map +1 -1
- package/dist/gpu/client.d.ts +23 -0
- package/dist/gpu/client.d.ts.map +1 -1
- package/dist/gpu/messages.d.ts +22 -0
- package/dist/gpu/messages.d.ts.map +1 -1
- package/dist/gpu/pipeline.d.ts +6 -2
- package/dist/gpu/pipeline.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/scatter.js +846 -74
- package/dist/webgl/client.d.ts.map +1 -1
- package/package.json +11 -9
package/dist/scatter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/data/worker.ts?worker&inline
|
|
2
|
-
var e = "const e=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],t=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],n=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],r=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],i=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],a=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];i<t&&(t=i),i>n&&(n=i)}let r=n-t||1e-6;return{min:t,max:n,range:r}},o=Uint8Array.of(65,82,82,79,87,49),s={V1:0,V2:1,V3:2,V4:3,V5:4},c={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},l={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},u={HALF:0,SINGLE:1,DOUBLE:2},d={DAY:0,MILLISECOND:1},f={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},p={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},m={Sparse:0,Dense:1},h={LZ4_FRAME:0,ZSTD:1},g={BUFFER:0},_=Uint8Array,v=Uint16Array,y=Uint32Array,b=BigUint64Array,x=Int8Array,S=Int16Array,C=Int32Array,w=BigInt64Array,T=Float32Array,E=Float64Array;function D(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function O(e,t){let n=Math.log2(e)-3;return(t?[x,S,C,w]:[_,v,y,b])[n]}Object.getPrototypeOf(Int8Array);function k(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function A(e,t,n){if(t(e))return e;throw Error(n(e))}function j(e,t,n){return t=Array.isArray(t)?t:Object.values(t),A(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function M(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const ee=e=>`Unsupported data type: \"${M(l,e)}\" (id ${e})`,te=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function ne(e){return Object.hasOwn(e,`name`)&&N(e.type)}function N(e){return typeof e?.typeId==`number`}function P(e,t=``,n=!0){return ne(e)?e:te(t,A(e,N,()=>`Data type expected.`),n)}const re=(e,t,n=!1,r=-1)=>({typeId:l.Dictionary,id:r,dictionary:e,indices:t||ae(),ordered:n}),ie=(e=32,t=!0)=>({typeId:l.Int,bitWidth:j(e,[8,16,32,64]),signed:t,values:O(e,t)}),ae=()=>ie(32),F=(e=2)=>({typeId:l.Float,precision:j(e,u),values:[v,T,E][e]}),oe=()=>({typeId:l.Binary,offsets:C}),I=()=>({typeId:l.Utf8,offsets:C}),se=(e,t,n=128)=>({typeId:l.Decimal,precision:e,scale:t,bitWidth:j(n,[32,64,128,256]),values:n===32?C:b}),ce=e=>({typeId:l.Date,unit:j(e,d),values:e===d.DAY?C:w}),le=(e=f.MILLISECOND)=>{e=j(e,f);let t=e===f.SECOND||e===f.MILLISECOND?32:64;return{typeId:l.Time,unit:e,bitWidth:t,values:t===32?C:w}},ue=(e=f.MILLISECOND,t=null)=>({typeId:l.Timestamp,unit:j(e,f),timezone:t,values:w}),de=(e=p.MONTH_DAY_NANO)=>({typeId:l.Interval,unit:j(e,p),values:e===p.MONTH_DAY_NANO?void 0:C}),fe=e=>({typeId:l.List,children:[P(e)],offsets:C}),pe=e=>({typeId:l.Struct,children:Array.isArray(e)&&e.length>0&&ne(e[0])?e:Object.entries(e).map(([e,t])=>te(e,t))}),me=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:l.Union,mode:j(e,m),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>P(e,`_${t}`)),typeIdForValue:r,offsets:C}),he=e=>({typeId:l.FixedSizeBinary,stride:e}),ge=(e,t)=>({typeId:l.FixedSizeList,stride:t,children:[P(e)]}),_e=(e,t)=>({typeId:l.Map,keysSorted:e,children:[t],offsets:C}),ve=(e=f.MILLISECOND)=>({typeId:l.Duration,unit:j(e,f),values:w}),ye=()=>({typeId:l.LargeBinary,offsets:w}),be=()=>({typeId:l.LargeUtf8,offsets:w}),xe=e=>({typeId:l.LargeList,children:[P(e)],offsets:w}),Se=(e,t)=>({typeId:l.RunEndEncoded,children:[A(P(e,`run_ends`),e=>e.type.typeId===l.Int,()=>`Run-ends must have an integer type.`),P(t,`values`)]}),Ce=e=>({typeId:l.ListView,children:[P(e,`value`)],offsets:C}),we=e=>({typeId:l.LargeListView,children:[P(e,`value`)],offsets:w}),Te=new E(2).buffer;new w(Te),new y(Te),new C(Te),new _(Te);function L(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function Ee(e,t){return Number(e/t)+Number(e%t)/Number(t)}const De=e=>BigInt.asUintN(64,e);function Oe(e,t){return BigInt.asIntN(64,e[t])}function ke(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=De(~e[n])|De(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Ae(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=De(~e[n])|De(~e[n+1])<<64n|De(~e[n+2])<<128n|De(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const je=new TextDecoder(`utf-8`);new TextEncoder;function Me(e){return je.decode(e)}function Ne(e,t){return(e[t>>3]&1<<t%8)!=0}function R(e,t){let n=t+B(e,t),r=n-B(e,n),i=z(e,r);return(t,a,o=null)=>{if(t<i){let i=z(e,r+t);if(i)return a(e,n+i)}return o}}function Pe(e,t){return t}function Fe(e,t){return!!Ie(e,t)}function Ie(e,t){return Le(e,t)<<24>>24}function Le(e,t){return e[t]}function z(e,t){return Re(e,t)<<16>>16}function Re(e,t){return e[t]|e[t+1]<<8}function B(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function ze(e,t){return B(e,t)>>>0}function V(e,t){return L(BigInt.asIntN(64,BigInt(ze(e,t))+(BigInt(ze(e,t+4))<<32n)))}function Be(e,t){let n=t+B(e,t),r=B(e,n);return n+=4,Me(e.subarray(n,n+r))}function Ve(e,t,n,r){if(!t)return[];let i=t+B(e,t);return Array.from({length:B(e,i)},(t,a)=>r(e,i+4+a*n))}const He=Symbol(`rowIndex`);function Ue(e,t){class n{constructor(e){this[He]=e}toJSON(){return Ge(e,t,this[He])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[He])},enumerable:!0})}return e=>new n(e)}function We(e,t){return n=>Ge(e,t,n)}function Ge(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Ke(e){return e instanceof Je}var qe=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Ne(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},Je=class extends qe{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},Ye=class extends qe{static ArrayType=E},H=class extends qe{static ArrayType=Array},Xe=class extends H{value(e){return null}},Ze=class extends Ye{value(e){return L(this.values[e])}},Qe=class extends Ye{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},$e=class extends H{value(e){return Ne(this.values,e)}},et=class extends Ye{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},tt=class extends qe{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?Oe:t===128?ke:Ae,this.scale=10n**BigInt(n)}},nt=class extends tt{static ArrayType=E;value(e){return Ee(this.decimal(this.values,e),this.scale)}},rt=class extends tt{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},it=class extends H{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},at=class extends Ye{value(e){return 864e5*this.values[e]}};const ot=Ze;var st=class extends Ze{value(e){return super.value(e)*1e3}};const ct=Ze;var lt=class extends Ze{value(e){return Ee(this.values[e],1000n)}},ut=class extends Ze{value(e){return Ee(this.values[e],1000000n)}},dt=class extends H{value(e){return this.values.subarray(e<<1,e+1<<1)}},ft=class extends H{value(e){let t=this.values,n=e<<4;return Float64Array.of(B(t,n),B(t,n+4),V(t,n+8))}};const pt=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),mt=({values:e,offsets:t},n)=>e.subarray(L(t[n]),L(t[n+1]));var ht=class extends H{value(e){return pt(this,e)}},gt=class extends H{value(e){return mt(this,e)}},_t=class extends H{value(e){return Me(pt(this,e))}},vt=class extends H{value(e){return Me(mt(this,e))}},yt=class extends H{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},bt=class extends H{value(e){let t=this.offsets;return this.children[0].slice(L(t[e]),L(t[e+1]))}},xt=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},St=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(L(t),L(n))}},Ct=class extends H{constructor(e){super(e),this.stride=this.type.stride}},wt=class extends Ct{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},Tt=class extends Ct{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function Et({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var Dt=class extends H{value(e){return Et(this,e)}},Ot=class extends H{value(e){return new Map(Et(this,e))}},kt=class extends H{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},At=class extends kt{value(e){return super.value(e,this.offsets[e])}},jt=class extends H{constructor(e,t=We){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},Mt=class extends jt{constructor(e){super(e,Ue)}},Nt=class extends H{value(e){let[{values:t},n]=this.children;return n.at(k(t,e))}},Pt=class extends H{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},Ft=class extends H{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=B(a,r);return o>12&&(i=B(a,r+12),a=n[B(a,r+8)]),a.subarray(i,i+o)}},It=class extends Ft{value(e){return this.view(e)}},Lt=class extends Ft{value(e){return Me(this.view(e))}};function Rt(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new zt(t,e)}}var zt=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Bt(e)}at(e){let{data:t,offsets:n}=this,r=k(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Ke(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Vt(a,n):Ht(a,n)}cache(){return this._cache??=this.toArray()}};function*Bt(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Vt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function Ht(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var Ut=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?Ue:We;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>Wt(o[e],n[t]))},t.map(e=>r[e]),i===Ue)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=k(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function Wt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Gt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useDate:c,useDecimalInt:u,useMap:m,useProxy:h}=t;switch(n){case l.Null:return Xe;case l.Bool:return $e;case l.Int:case l.Time:case l.Duration:return s||r<64?Je:Ze;case l.Float:return a?Je:Qe;case l.Date:return Kt(o===d.DAY?at:ot,c&&it);case l.Timestamp:return Kt(o===f.SECOND?st:o===f.MILLISECOND?ct:o===f.MICROSECOND?lt:ut,c&&it);case l.Decimal:return r===32?u?Je:et:u?rt:nt;case l.Interval:return o===p.DAY_TIME?dt:o===p.YEAR_MONTH?Je:ft;case l.FixedSizeBinary:return wt;case l.Utf8:return _t;case l.LargeUtf8:return vt;case l.Binary:return ht;case l.LargeBinary:return gt;case l.BinaryView:return It;case l.Utf8View:return Lt;case l.List:return yt;case l.LargeList:return bt;case l.Map:return m?Ot:Dt;case l.ListView:return xt;case l.LargeListView:return St;case l.FixedSizeList:return Tt;case l.Struct:return h?Mt:jt;case l.RunEndEncoded:return Nt;case l.Dictionary:return Pt;case l.Union:return i?At:kt}throw Error(ee(n))}function Kt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function qt(e){return`Missing compression codec \"${M(h,e)}\" (id ${e})`}const Jt=new Map;function Yt(e){return e!=null&&Jt.get(e)||null}function Xt(e,{offset:t,length:n},r){if(n===0)return{bytes:new Uint8Array,offset:0,length:0};let i=V(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a);return{bytes:o,offset:0,length:o.length}}function Zt(e,t){return{offset:V(e,t),metadataLength:B(e,t+8),bodyLength:V(e,t+16)}}function Qt(e,t){return Ve(e,t,24,Zt)}function $t(e,t){let n=R(e,t);return{codec:n(4,Ie,h.LZ4_FRAME),method:n(6,Ie,g.BUFFER)}}function en(e,t,n){let r=R(e,t),i=n<s.V4?8:0;return{length:r(4,V,0),nodes:Ve(e,r(6,Pe),16,(e,t)=>({length:V(e,t),nullCount:V(e,t+8)})),regions:Ve(e,r(8,Pe),16+i,(e,t)=>({offset:V(e,t+i),length:V(e,t+i+8)})),compression:r(10,$t),variadic:Ve(e,r(12,Pe),8,V)}}function tn(e,t,n){let r=R(e,t);return{id:r(4,V,0),data:r(6,(e,t)=>en(e,t,n)),isDelta:r(8,Fe,!1)}}function nn(e,t,n,r){j(n,l,ee);let i=R(e,t);switch(n){case l.Binary:return oe();case l.Utf8:return I();case l.LargeBinary:return ye();case l.LargeUtf8:return be();case l.List:return fe(r[0]);case l.ListView:return Ce(r[0]);case l.LargeList:return xe(r[0]);case l.LargeListView:return we(r[0]);case l.Struct:return pe(r);case l.RunEndEncoded:return Se(r[0],r[1]);case l.Int:return ie(i(4,B,0),i(6,Fe,!1));case l.Float:return F(i(4,z,u.HALF));case l.Decimal:return se(i(4,B,0),i(6,B,0),i(8,B,128));case l.Date:return ce(i(4,z,d.MILLISECOND));case l.Time:return le(i(4,z,f.MILLISECOND));case l.Timestamp:return ue(i(4,z,f.SECOND),i(6,Be));case l.Interval:return de(i(4,z,p.YEAR_MONTH));case l.Duration:return ve(i(4,z,f.MILLISECOND));case l.FixedSizeBinary:return he(i(4,B,0));case l.FixedSizeList:return ge(r[0],i(4,B,0));case l.Map:return _e(i(4,Fe,!1),r[0]);case l.Union:return me(i(4,z,m.Sparse),r,Ve(e,i(6,Pe),4,B))}return{typeId:n}}function rn(e,t){let n=Ve(e,t,4,(e,t)=>{let n=R(e,t);return[n(4,Be),n(6,Be)]});return n.length?new Map(n):null}function an(e,t,n){let r=R(e,t);return{version:n,endianness:r(4,z,0),fields:r(6,on,[]),metadata:r(8,rn)}}function on(e,t){return Ve(e,t,4,sn)}function sn(e,t){let n=R(e,t),r=n(8,Le,l.NONE),i=n(10,Pe,0),a=n(12,ln),o=nn(e,i,r,n(14,cn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,Be),type:o,nullable:n(6,Fe,!1),metadata:n(16,rn)}}function cn(e,t){return Ve(e,t,4,sn)}function ln(e,t){if(!t)return null;let n=R(e,t);return re(null,n(6,un,ae()),n(8,Fe,!1),n(4,V,0))}function un(e,t){return nn(e,t,l.Int)}const dn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,fn=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,pn=e=>`Unsupported message type: ${e} (${M(c,e)})`;function mn(e,t){let n=B(e,t)||0;if(t+=4,n===-1&&(n=B(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(dn(n,r.byteLength));let i=R(r,0),a=i(4,z,s.V1),o=i(6,Le,c.NONE),l=i(8,Pe,0),u=i(10,V,0),d;if(l){let n=o===c.Schema?an:o===c.DictionaryBatch?tn:o===c.RecordBatch?en:null;if(!n)throw Error(pn(o));if(d=n(r,l,a),u>0){let n=e.subarray(t,t+=u);if(n.byteLength<u)throw Error(fn(u,n.byteLength));d.body=n}else o!==c.Schema&&(d.body=new Uint8Array)}return{version:a,type:o,index:t,content:d}}function hn(e){let t=D(e)?new Uint8Array(e):e;return t instanceof Uint8Array&&gn(t)?vn(t):_n(t)}function gn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(o[t]!==e[t])return!1;return!0}function _n(e){let t=[e].flat(),n,r=[],i=[];for(let e of t){if(!(e instanceof Uint8Array))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let a=mn(e,t);if(a===null)break;if(t=a.index,a.content)switch(a.type){case c.Schema:n||=a.content;break;case c.RecordBatch:r.push(a.content);break;case c.DictionaryBatch:i.push(a.content);break}}}return{schema:n,dictionaries:i,records:r,metadata:null}}function vn(e){let t=e.byteLength-(o.length+4),n=R(e,t-B(e,t)),r=n(4,z,s.V1),i=n(8,Qt,[]),a=n(10,Qt,[]);return{schema:n(6,(e,t)=>an(e,t,r)),dictionaries:i.map(({offset:t})=>mn(e,t).content),records:a.map(({offset:t})=>mn(e,t).content),metadata:n(12,rn)}}function yn(e,t){return bn(hn(e),t)}function bn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i}=e,{version:a,fields:o}=n,s=new Map,c=Sn(t,a,s),u=new Map;xn(n,e=>{let t=e.type;t.typeId===l.Dictionary&&u.set(t.id,t.dictionary)});let d=new Map;for(let e of r){let{id:t,data:n,isDelta:r,body:i}=e,a=u.get(t),o=wn(a,c({...n,body:i}));if(d.has(t)){let e=d.get(t);r||e.clear(),e.add(o)}else{if(r)throw Error(`Delta update can not be first dictionary batch.`);d.set(t,Rt(a).add(o))}}d.forEach((e,t)=>s.set(t,e.done()));let f=o.map(e=>Rt(e.type));for(let e of i){let t=c(e);o.forEach((e,n)=>f[n].add(wn(e.type,t)))}return new Ut(n,f.map(e=>e.done()),t.useProxy)}function xn(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function Sn(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=Cn(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>wn(e.type,this))}}}}function Cn(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==g.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=Yt(r);if(!i)throw Error(qt(r));return Xt(e,t,i)}}function wn(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:c}=t,u=Gt(e,r),d={...i(),type:e};if(n===l.Null)return new u({...d,nullCount:d.length});switch(n){case l.Bool:case l.Int:case l.Time:case l.Duration:case l.Float:case l.Decimal:case l.Date:case l.Timestamp:case l.Interval:case l.FixedSizeBinary:return new u({...d,validity:a(),values:a(e.values)});case l.Utf8:case l.LargeUtf8:case l.Binary:case l.LargeBinary:return new u({...d,validity:a(),offsets:a(e.offsets),values:a()});case l.BinaryView:case l.Utf8View:return new u({...d,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case l.List:case l.LargeList:case l.Map:return new u({...d,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case l.ListView:case l.LargeListView:return new u({...d,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case l.FixedSizeList:case l.Struct:return new u({...d,validity:a(),children:t.visit(e.children)});case l.RunEndEncoded:return new u({...d,children:t.visit(e.children)});case l.Dictionary:{let{id:n,indices:r}=e;return new u({...d,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case l.Union:return c<s.V5&&a(),new u({...d,typeIds:a(x),offsets:e.mode===m.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(ee(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const Tn=new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),En=e=>{let t=yn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t)){if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);Tn.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i));continue}if(Array.isArray(i)&&i.length>0&&typeof i[0]==`string`){let t=new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}}return{numeric:n,categorical:r}},Dn=[65,82,82,79,87,49],On=[80,65,82,49],kn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),An=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return kn(t,Dn)?`arrow`:kn(t,On)?`parquet`:`arrow`},jn=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],Mn=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],Nn=[`REQUIRED`,`OPTIONAL`,`REPEATED`],Pn=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],Fn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],In=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Ln=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Rn(e){let t=zn(e);if(t.type===1)return{type:`Point`,coordinates:Bn(e,t)};if(t.type===2)return{type:`LineString`,coordinates:Vn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Hn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Bn(e,zn(e)));return{type:`MultiPoint`,coordinates:n}}else if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(Vn(e,zn(e)));return{type:`MultiLineString`,coordinates:n}}else if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Hn(e,zn(e)));return{type:`MultiPolygon`,coordinates:n}}else if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Rn(e));return{type:`GeometryCollection`,geometries:n}}else throw Error(`Unsupported geometry type: ${t.type}`)}function zn(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Bn(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function Vn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Bn(e,t));return n}function Hn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(Vn(e,{...t,count:i}))}return r}const Un=new TextDecoder,Wn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return new Date(e*864e5)},stringFromBytes(e){return e&&Un.decode(e)},geometryFromBytes(e){return e&&Rn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Rn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})}};function Gn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}else return Kn(e,r)}function Kn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=qn(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(Jn(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>JSON.parse(Un.decode(e)));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=BigInt(e[n]);return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map(Yn);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function qn(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function Jn(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function Yn(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function Xn(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=Xn(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function Zn(e,t){let n=Xn(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function Qn(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function $n(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function er(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function tr(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function nr(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length!==2||t.element.repetition_type!==`REPEATED`||t.children.find(e=>e.element.name===`key`)?.element.repetition_type===`REPEATED`||t.children.find(e=>e.element.name===`value`)?.element.repetition_type===`REPEATED`)}function rr(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}const U={STOP:0,TRUE:1,FALSE:2,BYTE:3,I16:4,I32:5,I64:6,DOUBLE:7,BINARY:8,LIST:9,SET:10,MAP:11,STRUCT:12,UUID:13};function ir(e){let t=0,n={};for(;e.offset<e.view.byteLength;){let[r,i,a]=ur(e,t);if(t=a,r===U.STOP)break;n[`field_${i}`]=ar(e,r)}return n}function ar(e,t){switch(t){case U.TRUE:return!0;case U.FALSE:return!1;case U.BYTE:return e.view.getInt8(e.offset++);case U.I16:case U.I32:return cr(e);case U.I64:return lr(e);case U.DOUBLE:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case U.BINARY:{let t=or(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case U.LIST:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=or(e));let i=n===U.TRUE||n===U.FALSE,a=Array(r);for(let t=0;t<r;t++)a[t]=i?ar(e,U.BYTE)===1:ar(e,n);return a}case U.STRUCT:{let t={},n=0;for(;;){let[r,i,a]=ur(e,n);if(n=a,r===U.STOP)break;t[`field_${i}`]=ar(e,r)}return t}default:throw Error(`thrift unhandled type: ${t}`)}}function or(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function sr(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function cr(e){let t=or(e);return t>>>1^-(t&1)}function lr(e){let t=sr(e);return t>>1n^-(t&1n)}function ur(e,t){let n=e.view.getUint8(e.offset++),r=n&15;if(r===U.STOP)return[0,0,t];let i=n>>4,a=i?t+i:cr(e);return[r,a,a]}function dr(e,t){let n=new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let r=e[t],{logical_type:i,name:a,num_children:o,repetition_type:s,type:c}=r;if(o){t+=o;continue}c===`BYTE_ARRAY`&&i===void 0&&s!==`REPEATED`&&(r.logical_type=n.get(a))}}const fr=new TextDecoder;function W(e){return e&&fr.decode(e)}async function pr(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),mr(c,{parsers:t,geoparquet:r})}else return mr(a,{parsers:t,geoparquet:r})}function mr(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e);if(t={...Wn,...t},r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let i=r.byteLength-8,a=r.getUint32(i,!0);if(a>r.byteLength-8)throw Error(`parquet metadata length ${a} exceeds available buffer ${r.byteLength-8}`);let o=ir({view:r,offset:i-a}),s=o.field_1,c=o.field_2.map(e=>({type:jn[e.field_1],type_length:e.field_2,repetition_type:Nn[e.field_3],name:W(e.field_4),num_children:e.field_5,converted_type:Pn[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:gr(e.field_10)})),l=c.filter(e=>e.type),u=o.field_3,d=o.field_4.map(e=>({columns:e.field_1.map((e,n)=>({file_path:W(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:jn[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>Mn[e]),path_in_schema:e.field_3.field_3.map(W),codec:Fn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:vr(e.field_3.field_12,l[n],t),encoding_stats:e.field_3.field_13?.map(e=>({page_type:In[e.field_1],encoding:Mn[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),f=o.field_5?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),p=W(o.field_6);return n&&dr(c,f),{version:s,schema:c,num_rows:u,row_groups:d,key_value_metadata:f,created_by:p,metadata_length:a}}function hr({schema:e}){return Zn(e,[])[0]}function gr(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:_r(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:_r(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:W(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:W(e.field_18.field_1),algorithm:Ln[e.field_18.field_2]}:e}function _r(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function vr(e,t,n){return e&&{max:yr(e.field_1,t,n),min:yr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:yr(e.field_5,t,n),min_value:yr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function yr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);return r===`FLOAT`&&o.byteLength===4?o.getFloat32(0,!0):r===`DOUBLE`&&o.byteLength===8?o.getFloat64(0,!0):r===`INT32`&&i===`DATE`?n.dateFromDays(o.getInt32(0,!0)):r===`INT64`&&i===`TIMESTAMP_MILLIS`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT64`&&i===`TIMESTAMP_MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`?n.timestampFromNanoseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?qn(e)*10**-(t.scale||0):a?.type===`FLOAT16`?Yn(e):e}function br(e){let t=ir(e);return{page_locations:t.field_1.map(xr),unencoded_byte_array_data_bytes:t.field_2}}function xr(e){return{offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3}}function Sr(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function G(e,t,n=!0){if(n?e===t:e==t)return!0;if(e instanceof Uint8Array&&t instanceof Uint8Array)return G(Array.from(e),Array.from(t),n);if(!e||!t||typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!G(e[r],t[r],n))return!1;return!0}if(typeof e!=`object`)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!G(e[i],t[i],n))return!1;return!0}function Cr(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Sr(t,n);return t}function wr(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(wr)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(wr)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(wr)):t.push(...Object.keys(e).map(e=>e.split(`.`)[0])),[...new Set(t)]}function Tr(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>Tr(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>Tr(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>Tr(e,t,n)):Object.entries(t).every(([t,r])=>{let i=Dr(e,t);return typeof r!=`object`||!r||Array.isArray(r)?G(i,r,n):Object.entries(r||{}).every(([e,r])=>e===`$gt`?i>r:e===`$gte`?i>=r:e===`$lt`?i<r:e===`$lte`?i<=r:e===`$eq`?G(i,r,n):e===`$ne`?!G(i,r,n):e===`$in`?Array.isArray(r)&&r.includes(i):e===`$nin`?Array.isArray(r)&&!r.includes(i):e===`$not`?!Tr({[t]:i},{[t]:r},n):!0)})}function Er({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>Er({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>Er({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[i,a]of Object.entries(n)){let n=t.indexOf(i);if(n===-1)continue;let o=e.columns[n].meta_data?.statistics;if(!o)continue;let{min:s,max:c,min_value:l,max_value:u}=o,d=l===void 0?s:l,f=u===void 0?c:u;if(!(d===void 0||f===void 0)){for(let[e,t]of Object.entries(a||{}))if(e===`$gt`&&f<=t||e===`$gte`&&f<t||e===`$lt`&&d>=t||e===`$lte`&&d>t||e===`$eq`&&(t<d||t>f)||e===`$ne`&&G(d,f,r)&&G(d,t,r)||e===`$in`&&Array.isArray(t)&&t.every(e=>e<d||e>f)||e===`$nin`&&Array.isArray(t)&&G(d,f,r)&&t.includes(d))return!0}}return!1}function Dr(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}function Or({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,useOffsetIndex:o=!1}){if(!e)throw Error(`parquetPlan requires metadata`);let s=[],c=[],l=[],u=Qn(hr(e)),d=0;for(let f of e.row_groups){let e=Number(f.num_rows),p=d+e;if(e>0&&p>t&&d<n&&!Er({rowGroup:f,physicalColumns:u,filter:i,strict:a})){let i=[],a=1/0,u=-1/0;for(let e of f.columns){let t=e.meta_data;if(e.file_path)throw Error(`parquet file_path not supported`);if(!t)throw Error(`parquet column metadata is undefined`);if(!r||r.includes(t.path_in_schema[0])){let n=t.dictionary_page_offset||t.data_page_offset,r=Number(n),s=Number(n+t.total_compressed_size);if(r<a&&(a=r),s>u&&(u=s),o&&e.offset_index_offset&&e.offset_index_length){let n=Number(e.offset_index_offset);i.push({columnMetadata:t,offsetIndex:{startByte:n,endByte:n+e.offset_index_length},bounds:{startByte:r,endByte:s}})}else i.push({columnMetadata:t,range:{startByte:r,endByte:s}})}}let p=Math.max(t-d,0),m=Math.min(n-d,e);s.push({chunks:i,rowGroup:f,groupStart:d,groupRows:e,selectStart:p,selectEnd:m});let h;for(let e of i)if(`offsetIndex`in e)l.push(e.offsetIndex);else{let{range:t}=e;r?c.push(t):h&&t.endByte-h.startByte<=2097152?h.endByte=t.endByte:(h&&c.push(h),h={...t})}h&&c.push(h)}d=p}return isFinite(n)||(n=d),c.push(...l),{metadata:e,rowStart:t,rowEnd:n,columns:r,fetches:c,groups:s}}function kr(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}else return n[a]}}}const Ar=new TextDecoder,jr=new WeakMap;function Mr(e,t=Wn){if(Array.isArray(e))return e.map(e=>Mr(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=Fr(e.metadata),r=e.typed_value&&Nr(e.typed_value,n,t),i=e.value&&Lr(Pr(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function Nr(e,t,n){if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e)return Nr(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return Lr(Pr(e.value),t,n);let r={};for(let[i,a]of Object.entries(e))r[i]=Nr(a,t,n);return r}return e instanceof Uint8Array?Lr(Pr(e),t,n):Array.isArray(e)?e.map(e=>Nr(e,t,n)):e}function Pr(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function Fr(e){let t=jr.get(e.buffer);t||(t=new Map,jr.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=Pr(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=Ir(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=Ir(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=Ar.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function Ir(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function Lr(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Rr(e,a,n);if(i===2)return zr(e,a,t,n);if(i===3)return Br(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,Ar.decode(o)}function Rr(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Vr(e,4);case 9:return Vr(e,8);case 10:return Vr(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return Hr(e);case 16:{let t=Hr(e);return Ar.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function zr(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?Ir(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=Ir(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=Ir(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=Lr({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Br(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=Ir(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=Ir(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++)u[t]=Lr({view:e.view,offset:l+c[t]},n,r);return e.offset=l+c[c.length-1],u}function Vr(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function Hr(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function Ur(e,t,n,r,i){let a=er(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function Wr(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(tr(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),Wr(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Gr(u,r),e.set(i,u),e.delete(l);return}if(nr(t)){let s=t.children[0].element.name;Wr(e,t.children[0].children[0],n,o+1),Wr(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Kr(c,l,o);a&&Gr(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u);return}if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){Wr(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=qr(s,o);t.element.logical_type?.type===`VARIANT`&&(c=Mr(c,n)),a&&Gr(c,r),e.set(i,c)}}function Gr(e,t){for(let n=0;n<e.length;n++)t?Gr(e[n],t-1):e[n]=e[n][0]}function Kr(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Kr(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function qr(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(qr(o,t-1)):i.push(o)}return i}function Jr(e,t,n){let r=n instanceof Int32Array,i=or(e),a=or(e);or(e);let o=lr(e),s=0;n[s++]=r?Number(o):o;let c=i/a;for(;s<t;){let i=lr(e),l=new Uint8Array(a);for(let t=0;t<a;t++)l[t]=e.view.getUint8(e.offset++);for(let u=0;u<a&&s<t;u++){let a=BigInt(l[u]);if(a){let l=0n,u=c,d=(1n<<a)-1n;for(;u&&s<t;){let t=BigInt(e.view.getUint8(e.offset))>>l&d;for(l+=a;l>=8;)l-=8n,e.offset++,l&&(t|=BigInt(e.view.getUint8(e.offset))<<a-l&d);let c=i+t;o+=c,n[s++]=r?Number(o):o,u--}u&&(e.offset+=Math.ceil((u*Number(a)+Number(l))/8))}else for(let e=0;e<c&&s<t;e++)o+=i,n[s++]=r?Number(o):o}}}function Yr(e,t,n){let r=new Int32Array(t);Jr(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function Xr(e,t,n){let r=new Int32Array(t);Jr(e,t,r);let i=new Int32Array(t);Jr(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function Zr(e){return 32-Math.clz32(e)}function Qr(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=or(e);if(r&1)a=ei(e,r,t,n,a);else{let i=r>>>1;$r(e,i,t,n,a),a+=i}}e.offset=i+r}function $r(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function ei(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function ti(e,t,n,r){let i=ni(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function ni(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function ri(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return ii(e,n);if(t===`INT32`)return ai(e,n);if(t===`INT64`)return oi(e,n);if(t===`INT96`)return si(e,n);if(t===`FLOAT`)return ci(e,n);if(t===`DOUBLE`)return li(e,n);if(t===`BYTE_ARRAY`)return ui(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return di(e,n,r)}else throw Error(`parquet unhandled type: ${t}`)}function ii(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8;n[r]=(e.view.getUint8(t)&1<<i)!=0}return e.offset+=Math.ceil(t/8),n}function ai(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(fi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function oi(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(fi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function si(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function ci(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(fi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function li(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(fi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function ui(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function di(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function fi(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const pi=[0,255,65535,16777215,4294967295];function mi(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function hi(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4;break;default:break}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);mi(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&pi[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);mi(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function gi(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=_i(o,t,i),{definitionLevels:l,numNulls:u}=vi(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=ri(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(Qr(o,e,s),s=s.map(e=>!!e)):Qr(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=ti(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Jr(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),Yr(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function _i(e,t,n){if(n.length>1){let r=$n(n);if(r){let n=Array(t.num_values);return Qr(e,Zr(r),n),n}}return[]}function vi(e,t,n){let r=er(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);Qr(e,Zr(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function yi(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),hi(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function bi(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=xi(r,l,o);r.offset=l.repetition_levels_byte_length;let d=Si(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=yi(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=ri(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),Qr(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),Qr(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Jr(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),Yr(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),Xr(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=ti(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function xi(e,t,n){let r=$n(n);if(!r)return[];let i=Array(t.num_values);return Qr(e,Zr(r),i,t.repetition_levels_byte_length),i}function Si(e,t,n){let r=er(n);if(r){let n=Array(t.num_values);return Qr(e,Zr(r),n,t.definition_levels_byte_length),n}}function Ci(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=rr(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=Ti(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=wi(e,t,i,u,void 0,0);n&&(u=Kn(n,i))}else{let r=d?.length||0,a=wi(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function wi(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&rr(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=gi(yi(d,Number(t.uncompressed_page_size),l,u),e,n),p=Gn(f,r,e.encoding,n);return{skipped:0,data:Ur(Array.isArray(i)?i:[],o,s,p,c)}}else if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=bi(d,t,n),u=Gn(l,r,e.encoding,n);return{skipped:0,data:Ur(Array.isArray(i)?i:[],o,s,u,c)}}else if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=yi(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:ri({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}else throw Error(`parquet unsupported page type: ${t.type}`)}function Ti(e){let t=ir(e);return{type:In[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:Mn[t.field_5.field_2],definition_level_encoding:Mn[t.field_5.field_3],repetition_level_encoding:Mn[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:Mn[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:Mn[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0?!0:t.field_8.field_7,statistics:t.field_8.field_8}}}function Ei(e,{metadata:t},n){let{file:r,compressors:i,utf8:a}=e,o=[],s={...Wn,...e.parsers};for(let c of n.chunks){let{columnMetadata:l}=c,u=Zn(t.schema,l.path_in_schema),d={pathInSchema:l.path_in_schema,type:l.type,element:u[u.length-1].element,schemaPath:u,codec:l.codec,parsers:s,compressors:i,utf8:a};if(!(`offsetIndex`in c)){o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.range.startByte,c.range.endByte)).then(t=>Ci({view:new DataView(t),offset:0},n,d,e.onPage))});continue}o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.offsetIndex.startByte,c.offsetIndex.endByte)).then(async t=>{let i=br({view:new DataView(t),offset:0}),{selectStart:a,selectEnd:o}=n,s=i.page_locations,c=NaN,l=NaN,u=0;for(let e=0;e<s.length;e++){let t=s[e],r=Number(t.first_row_index),i=e+1<s.length?Number(s[e+1].first_row_index):n.groupRows;r<o&&i>a&&(Number.isNaN(c)&&(c=Number(t.offset),u=r),l=Number(t.offset)+t.compressed_page_size)}let f=await r.slice(c,l),{data:p,skipped:m}=Ci({view:new DataView(f),offset:0},u?{...n,groupStart:n.groupStart+u,selectStart:n.selectStart-u,selectEnd:n.selectEnd-u}:n,d,e.onPage);return{data:p,skipped:u+m}})})}return{groupStart:n.groupStart,groupRows:n.groupRows,asyncColumns:o}}async function Di({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(async({data:e})=>{let t=await e;return{...t,data:Cr(t.data)}})),o=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),s=r??o,c=s.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),l=n-t;if(i===`object`){let n=Array(l);for(let r=0;r<l;r++){let i=t+r,o={};for(let t=0;t<e.length;t++){let{data:n,skipped:r}=a[t];o[e[t].pathInSchema[0]]=n[i-r]}n[r]=o}return n}let u=Array(l);for(let n=0;n<l;n++){let r=t+n,i=Array(e.length);for(let e=0;e<s.length;e++){let t=c[e];if(t>=0){let{data:n,skipped:o}=a[t];i[e]=n[r-o]}}u[n]=i}return u}function Oi(e,t,n){let{asyncColumns:r}=e;n={...Wn,...n};let i=[];for(let e of t.children)if(e.children.length){let t=r.filter(t=>t.pathInSchema[0]===e.element.name);if(!t.length)continue;let a=new Map,o=Promise.all(t.map(e=>e.data.then(({data:t})=>{a.set(e.pathInSchema.join(`.`),Cr(t))}))).then(()=>{Wr(a,e,n);let t=a.get(e.path.join(`.`));if(!t)throw Error(`parquet column data not assembled`);return{data:[t],skipped:0}});i.push({pathInSchema:e.path,data:o})}else{let t=r.find(t=>t.pathInSchema[0]===e.element.name);t&&i.push(t)}return{...e,asyncColumns:i}}async function ki(e){e.metadata??=await pr(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);let l=wr(s);if(l.length){let t=hr(e.metadata).children.map(e=>e.element.name),n=l.filter(e=>!t.includes(e));if(n.length)throw Error(`parquet filter columns not found: ${n.join(`, `)}`)}let u=r,d=!1;if(r&&s){let e=l.filter(e=>!r.includes(e));e.length&&(u=[...r,...e],d=!0)}let f=Ai(u===r?e:{...e,columns:u});if(!a&&!i){for(let{asyncColumns:e}of f)for(let{data:t}of e)await t;return}let p=hr(e.metadata),m=f.map(t=>Oi(t,p,e.parsers));if(i)for(let e of m)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length});if(a){let e=[];for(let i of m){let a=Math.max(t-i.groupStart,0),f=Math.min((n??1/0)-i.groupStart,i.groupRows),p=o===`object`?await Di(i,a,f,u,`object`):await Di(i,a,f,r,`array`);if(s){for(let t of p)if(Tr(t,s,c)){if(d&&r)for(let e of l)r.includes(e)||delete t[e];e.push(t)}}else Sr(e,p)}a(e)}else for(let{asyncColumns:e}of m)for(let{data:t}of e)await t}function Ai(e){if(!e.metadata)throw Error(`parquet requires metadata`);let t=Or(e);return e.file=kr(e.file,t),t.groups.map(n=>Ei(e,t,n))}function ji(e){return new Promise((t,n)=>{ki({...e,rowFormat:`object`,onComplete:t}).catch(n)})}var Mi=ArrayBuffer,K=Uint8Array,Ni=Uint16Array,Pi=Int16Array,Fi=Int32Array,Ii=function(e,t,n){if(K.prototype.slice)return K.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new K(n-t);return r.set(e.subarray(t,n)),r},Li=function(e,t,n,r){if(K.prototype.fill)return K.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Ri=function(e,t,n,r){if(K.prototype.copyWithin)return K.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},zi=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],q=function(e,t,n){var r=Error(t||zi[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,q),!n)throw r;return r},Bi=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Vi=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Hi=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&q(0);var c=6-i,l=o==3?4:o,u=Bi(e,c,l);c+=l;var d=s?1<<s:i,f=Bi(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&q(1);var h=new K((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Fi(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}else if((n>>4|e[3]<<20)==25481893)return Vi(e,4)+8;q(0)},Ui=function(e){for(var t=0;1<<t<=e;++t);return t-1},Wi=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&q(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Mi(512+(a<<2)),f=new Pi(d,0,256),p=new Ni(d,0,256),m=new Ni(d,512,a),h=512+(a<<1),g=new K(d,h,a),_=new K(d,h+a);s<255&&o>0;){var v=Ui(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&q(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1){p[k]=-A;continue}for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&q(0),l=0;l<a;++l){var j=p[g[l]]++;m[l]=(j<<(_[l]=i-Ui(j)))-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Gi=function(e,t){var n=0,r=-1,i=new K(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Ni(i.buffer,268);if(a<128){var l=Wi(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||q(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ui(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&q(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&q(0),x+=S&&1<<S-1}var C=Ui(x)+1,w=1<<C,T=w-x;for(T&T-1&&q(0),o[r++]=Ui(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new K(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Li(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&q(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Li(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Ki=Wi(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],qi=Wi(new K([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Ji=Wi(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Yi=function(e,t){for(var n=e.length,r=new Fi(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},Xi=new K(new Fi([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Zi=Yi(Xi,0),Qi=new K(new Fi([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),$i=Yi(Qi,3),ea=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||q(0);for(var c=0,l=n.b,u=(r<<3)-8+Ui(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&q(0)},ta=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;ea(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),ea(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),ea(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),ea(e.subarray(r),t.subarray(o),n)},na=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Li(n,e[i],t.y,t.y+=s),n):Li(new K(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):Ii(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new K(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Li(h,e[i++],g);else{var _=t.h;if(u==2){var v=Gi(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||q(0);(m?ta:ea)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&q(0);for(var x=[qi,Ji,Ki],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new K([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Ni(w.buffer,0,1),b:0}}else C==2?(r=Wi(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||q(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||q(0);var A=(c<<3)-8+Ui(k)-O.b,j=A>>3,M=0,ee=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var te=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var ne=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var N=O.s[ee],P=O.n[ee],re=E.s[ne],ie=E.n[ne],ae=D.s[te],F=D.n[te];j=(A-=ae)>>3;var oe=1<<ae,I=oe+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&oe-1);j=(A-=Qi[re])>>3;var se=$i[re]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<Qi[re])-1);j=(A-=Xi[N])>>3;var ce=Zi[N]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<Xi[N])-1);if(j=(A-=P)>>3,ee=O.t[ee]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<P)-1),j=(A-=ie)>>3,ne=E.t[ne]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<ie)-1),j=(A-=F)>>3,te=D.t[te]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<F)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var le=I-(ce!=0);le?(I=le==3?t.o[0]-1:t.o[le],le>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=I):I=t.o[0]}for(var S=0;S<ce;++S)h[M+S]=h[g+S];M+=ce,g+=ce;var ue=M-I;if(ue<0){var de=-ue,fe=t.e+ue;de>se&&(de=se);for(var S=0;S<de;++S)h[M+S]=t.w[fe+S];M+=de,se-=de,ue=0}for(var S=0;S<se;++S)h[M+S]=h[ue+S];M+=se}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=Ii(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=Ii(h,g));return t.b=c,h}q(2)}},ra=function(e,t){if(e.length==1)return e[0];for(var n=new K(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function ia(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=Hi(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=na(e,o,t);s||q(5),t?o.e=o.y:(n.push(s),a+=s.length,Ri(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return ra(n,a)}function aa(){let e=oa();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=64*1024,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function oa(){let e=atob(sa),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const sa=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,ca=4096;2*ca+32;const la=2*ca-1,ua=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function J(e){this.buf_=new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.reset()}J.READ_SIZE=ca,J.IBUF_MASK=la,J.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0},J.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,ca);if(t<0)throw Error(`Unexpected end of input`);if(t<ca){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[(ca<<1)+e]=this.buf_[e];this.buf_ptr_=ca}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}},J.prototype.fillBitWindow=function(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&la]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},J.prototype.readBits=function(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&ua[e];return this.bit_pos_+=e,t};const da=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),fa=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function Y(e,t){this.bits=e,this.value=t}function pa(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function ma(e,t,n,r,i){do r-=n,e[t+r]=new Y(i.bits,i.value);while(r>0)}function ha(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function ga(e,t,n,r,i){let a=t,o=new Int32Array(16),s=new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new Y(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new Y(r&255,c[p++]&65535);ma(e,t+f,i,u,n),f=pa(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=ha(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new Y(l+n&255,t-a-h&65535));let s=new Y(r-n&255,c[p++]&65535);ma(e,t+(f>>n),i,u,s),f=pa(f,r)}return d}function _a(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2;break}}else{let t=new Uint8Array(18),n=32,o=0,s=[new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,1),new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,5)];for(let e=a;e<18&&n>0;e++){let i=da[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(!(o===1||n===0))throw Error(`[ReadHuffmanCode] invalid num_codes or space`);ya(t,e,i,r)}let o=ga(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function va(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function ya(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new Y(0,0));for(ga(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}function ba(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*fa[e+31>>>5]),this.htrees=new Uint32Array(t)}ba.prototype.decode=function(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=_a(this.alphabet_size,this.codes,t,e)};function xa([e,t]){return{offset:e,nbits:t}}const Sa=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(xa),Ca=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(xa),wa=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(xa),Ta=[0,0,8,8,0,16,8,16,16],Ea=[0,8,0,8,16,0,16,8,16],X=1080,Da=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Oa=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);function ka(e,t){let n=new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Aa,rev:ja}=ka(Da,2);Aa[28]=258,ja[258]=28;const{base:Ma}=ka(Oa,0),Na=new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,Na[e]=((t&65280)>>8|(t&255)<<8)>>1}function Pa(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[Na[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=Na[i[e[t]-1]++]>>15-e[t])}return a}const Fa=new Uint8Array(288);for(let e=0;e<144;e++)Fa[e]=8;for(let e=144;e<256;e++)Fa[e]=9;for(let e=256;e<280;e++)Fa[e]=7;for(let e=280;e<288;e++)Fa[e]=8;const Ia=new Uint8Array(32);for(let e=0;e<32;e++)Ia[e]=5;const La=Pa(Fa,9,1),Ra=Pa(Ia,5,1);function za(e,t,n,r,i,a,o){let s=n*2,c=n,l=va(t,n*X,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Ba(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function Va(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&J.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-- >0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>J.IBUF_MASK){let e=J.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Ha(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function Ua(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function Wa(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Ga(e,t,n){let{offset:r,nbits:i}=Sa[va(e,t,n)];return r+n.readBits(i)}const Ka=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),qa=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Ja(e,t){let n=0;t.readMoreInput();let r=Ha(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<X;e++)a[e]=new Y(0,0);_a(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=va(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&Xa(i,e),[r,i]}function Ya(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function Xa(e,t){let n=new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&Ya(n,t)}}function Za(e){this.buffer=e,this.pos=0}Za.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n};function Qa(e){this.buffer=e,this.pos=0}Qa.prototype.write=function(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t};const $a=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function eo(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function to(e){return(e+7)/8|0}function no(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function ro(e,t,n=0,r=0){let i=t??new Uint8Array(1024);if(!(e.length-n))return i;let a=no(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=to(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}else if(t===1)u=La,d=Ra,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=new Uint8Array(19);for(let t=0;t<n;++t)a[$a[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=Pa(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=Pa(m,c,1),d=Pa(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1,a=o;for(;;a=o){let s=u[eo(e,o)&t],c=s>>4;if(o+=s&15,o>f)throw Error(`unexpected EOF`);if(!s)throw Error(`invalid length/literal`);if(c<256)i[r++]=c;else if(c===256){a=o,u=void 0;break}else{let t=c-254;if(c>264){let n=c-257,r=Da[n];t=Z(e,o,(1<<r)-1)+Aa[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[eo(e,o)&n],s=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Ma[s];if(s>3){let t=Oa[s];l+=eo(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}o=a,u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;ro(e,i,t,r)}return t?i:i.subarray(0,r)}let io;function ao(){if(!io){io=new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n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\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\n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`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);ro(t,io)}return io}function Q(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}const oo=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],so=oo.length;function co(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function lo(e,t,n,r,i){let a=ao(),{prefix:o}=oo[i],{suffix:s}=oo[i],c=oo[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)co(e,f);else if(c===11)for(;r>0;){let t=co(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const uo=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),fo=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),po=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),mo=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function ho(e,t){let n=new Uint8Array(t);return go(new Za(e),new Qa(n)),n}function go(e,t){let n=0,r=0,i=0,a=0,o=[16,15,11,4],s=0,c=0,l=0,u=[new ba(0,0),new ba(0,0),new ba(0,0)],d=128+J.READ_SIZE,f=new J(e);i=Ua(f);let p=(1<<i)-16,m=1<<i,h=m-1,g=new Uint8Array(m+d+24),_=m,v=[],y=[];for(let e=0;e<3*X;e++)v[e]=new Y(0,0),y[e]=new Y(0,0);for(;!r;){let e=0,i=[1<<28,1<<28,1<<28],d=[0],b=[1,1,1],x=[0,1,0,1,0,1],S=[0],C=0;for(let e=0;e<3;e++)u[e].codes=[],u[e].htrees=new Uint32Array;f.readMoreInput();let w=Ba(f);if(e=w.meta_block_length,n+e>t.buffer.length){let r=new Uint8Array(n+e);r.set(t.buffer),t.buffer=r}if(r=w.input_end,w.is_metadata){for(Wa(f);e>0;--e)f.readMoreInput(),f.readBits(8);continue}if(e===0)continue;if(w.is_uncompressed){f.bit_pos_=f.bit_pos_+7&-8,Va(t,e,n,g,h,f),n+=e;continue}for(let e=0;e<3;e++)b[e]=Ha(f)+1,b[e]>=2&&(_a(b[e]+2,v,e*X,f),_a(26,y,e*X,f),i[e]=Ga(y,e*X,f),S[e]=1);f.readMoreInput();let T=f.readBits(2),E=16+(f.readBits(4)<<T),D=(1<<T)-1,O=E+(48<<T),k=new Uint8Array(b[0]);for(let e=0;e<b[0];e++)f.readMoreInput(),k[e]=f.readBits(2)<<1;let[A,j]=Ja(b[0]<<6,f),[M,ee]=Ja(b[2]<<2,f);u[0]=new ba(256,A),u[1]=new ba(704,b[1]),u[2]=new ba(O,M);for(let e=0;e<3;++e)u[e].decode(f);let te=0,ne=0,N=k[d[0]],P=qa[N],re=qa[N+1],ie=u[1].htrees[0];for(;e>0;){let r;f.readMoreInput(),i[1]===0&&(za(b[1],v,1,d,x,S,f),i[1]=Ga(y,X,f),ie=u[1].htrees[d[1]]),i[1]--;let w=va(u[1].codes,ie,f),O=w>>6;O>=2?(O-=2,r=-1):r=0;let A=Ca[Ta[O]+(w>>3&7)],M=A.offset+f.readBits(A.nbits),ae=wa[Ea[O]+(w&7)],F=ae.offset+f.readBits(ae.nbits);c=g[n-1&h],l=g[n-2&h];for(let e=0;e<M;e++){f.readMoreInput(),i[0]===0&&(za(b[0],v,0,d,x,S,f),i[0]=Ga(y,0,f),C=d[0]<<6,te=C,N=k[d[0]],P=qa[N],re=qa[N+1]);let e=Ka[P+c]|Ka[re+l],r=j[te+e];i[0]--,l=c,c=va(u[0].codes,u[0].htrees[r],f),g[n&h]=c,(n&h)===h&&t.write(g,m),n++}if(e-=M,e<=0)break;if(r<0){f.readMoreInput(),i[2]===0&&(za(b[2],v,2,d,x,S,f),i[2]=Ga(y,2*X,f),ne=d[2]<<2),i[2]--;let e=(F>4?3:F-2)&255,t=ee[ne+e];if(r=va(u[2].codes,u[2].htrees[t],f),r>=E){r-=E;let e=r&D;r>>=T;let t=(r>>1)+1;r=E+((2+(r&1)<<t)-4+f.readBits(t)<<T)+e}}let oe=_o(r,o,s);if(oe<0)throw Error(`[BrotliDecompress] invalid distance`);a=n<p&&a!==p?n:p;let I=n&h;if(oe>a)if(F>=4&&F<=24){let r=po[F],i=oe-a-1,o=mo[F],s=i&(1<<o)-1,c=i>>o;if(r+=s*F,c<so){let i=lo(g,I,r,F,c);if(I+=i,n+=i,e-=i,I>=_){t.write(g,m);for(let e=0;e<I-_;e++)g[e]=g[_+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`);else{if(r>0&&(o[s&3]=oe,s++),F>e)throw Error(`Invalid backward reference`);for(let r=0;r<F;r++)g[n&h]=g[n-oe&h],(n&h)===h&&t.write(g,m),n++,e--}c=g[n-1&h],l=g[n-2&h]}n&=1073741823}t.write(g,n&h)}function _o(e,t,n){return e<16?(n+=uo[e],n&=3,t[n]+fo[e]):e-16+1}function vo(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||bo(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;bo(e,n,0)}return n}function yo(e,t){let n=new Uint8Array(t);return bo(e,n,0),n}function bo(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=(a&15)+4,l=c+240;for(;l===255;)c+=l=e[i++];let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const xo={SNAPPY:aa(),GZIP:(e,t)=>ro(e,new Uint8Array(t)),BROTLI:ho,ZSTD:e=>ia(e),LZ4:vo,LZ4_RAW:yo},So=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),Co=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return wo(n)}catch{return}},wo=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(!(s===0||c===0)&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},To=async e=>{let t=So(e),n=mr(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??Co(n.key_value_metadata),i=await ji({file:t,compressors:xo}),a=[],o=[];if(i.length>0){let e=Object.keys(i[0]).filter(e=>!/^__index_level_\\d+__$/.test(e)),t=Math.min(i.length,100);for(let n of e){let e=null;for(let r=0;r<t;r++){let t=i[r][n];if(t!=null){if(typeof t==`number`){e=`number`;break}if(typeof t==`string`){e=`string`;break}}}e===`number`?a.push(n):e===`string`&&o.push(n)}}let s=i.length,c={};for(let e of a)c[e]=new Float32Array(s);let l=new Map,u=new Map;for(let e of o)l.set(e,new Map),u.set(e,new Uint32Array(s));for(let e=0;e<s;e++){let t=i[e];for(let n of a){let r=t[n];c[n][e]=typeof r==`number`&&Number.isFinite(r)?r:0}for(let n of o){let r=String(t[n]??``),i=l.get(n),a=i.get(r);a===void 0&&(a=i.size,i.set(r,a)),u.get(n)[e]=a}}return{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},Eo=async e=>{let t=An(e)===`parquet`?await To(e):null,n=t??En(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:o}=a(t);return{name:e,values:t,min:r,max:i,range:o}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},Do=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,Oo=0,ko=[],Ao=new Map,jo=new Map,Mo=new Map,No=0;self.onmessage=async a=>{let o=a.data;if(o.type===`init`){$=o.gpuPort;return}if(o.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await Eo(o.buffer);Oo++,No=e.rowCount,ko=e.columns.map(e=>e.name),Ao=new Map,jo=new Map;for(let t of e.columns)Ao.set(t.name,t.min),jo.set(t.name,t.range);Mo=new Map;for(let t of e.categoricalColumns)Mo.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let n={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.map(e=>e.name),categoricalLabels:t,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),embeddedConfig:e.embeddedConfig}};self.postMessage(n);let r=e.columns.map(e=>e.values),i=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),a=[...new Set(r.map(e=>e.buffer)),...i.map(e=>e.indices.buffer)],s={type:`data`,dataVersion:Oo,dims:e.columns.length,rows:e.rowCount,buffers:r,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),categoricalColumns:i};$.postMessage(s,a)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(o.type===`encodeColor`){if(!$)return;let{column:a,palette:s,theme:c,colorMap:l}=o,u=c===`light`,d=Mo.get(a);if(d){let r;if(l)r=d.map(e=>l[e]??[128,128,128]);else{let i=u?n:t;r=d.length<=e.length?e:[...e,...Array(Math.ceil((d.length-e.length)/i.length)).fill(void 0).flatMap(()=>i)]}let i=Do(r),o={type:`setColorCategorical`,dataVersion:Oo,catColumnName:a,palette:i};$.postMessage(o,[i.buffer]);return}let f=ko.indexOf(a);if(f>=0){let e=Ao.get(a)??0,t=jo.get(a)??1,n=s===`magma`?i:r,o=Do(u?[...n].reverse():n),c={type:`setColorContinuous`,dataVersion:Oo,columnIndex:f,min:e,range:t,colormap:o};$.postMessage(c,[o.buffer])}}if(o.type===`selectByColumn`){if(!$||No===0)return;let{column:e,labelIndices:t,valueRanges:n}=o,r=Mo.get(e);if(r&&t&&t.length>0){let n=new Uint32Array(r.length);for(let e of t)e<n.length&&(n[e]=1);let i={type:`selectCategorical`,dataVersion:Oo,catColumnName:e,selectedLabels:n};$.postMessage(i,[n.buffer]);return}let i=ko.indexOf(e);if(i>=0&&n&&n.length>=2){let e={type:`selectContinuous`,dataVersion:Oo,columnIndex:i,ranges:n};$.postMessage(e,[n.buffer]);return}}};", t = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", e], { type: "text/javascript;charset=utf-8" });
|
|
2
|
+
var e = "const e=new Float32Array(16),t={schumann:0,bremm:1,steiger:2,ziegler:3,teulingfig2:4,cubediagonal:5,oklab_polar:6},n=[{r_x:[-0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.4877,-14.9075,-16.3272,-17.747,-19.1668,-20.5865,-22.0063],r_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],g_x:[-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953],g_y:[-.076,-.0709,-.0661,-.061,-.0561,-.051,-.0462,-.041,-.0359,-.0308,-.0257,-.0205,-.0154,-.0103,-.0051,0],b_x:[-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581],b_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442]},{r_x:[-15.2067,-15.095,-14.9554,-14.7857,-14.5812,-14.3334,-14.0291,-13.6663,-13.2288,-12.7355,-12.1699,-11.5268,-10.802,-9.9949,-9.1075,-8.1425],r_y:[-.0066,-.0112,-.0161,-.021,-.026,-.031,-.036,-.0408,-.0449,-.0486,-.0521,-.0554,-.0586,-.0617,-.0647,-.0676],g_x:[-10.7187,-10.7357,-10.755,-10.7798,-10.8079,-10.8405,-10.8775,-10.92,-10.9701,-11.0227,-11.0828,-11.147,-11.2183,-11.2958,-11.3803,-11.4703],g_y:[-.054,-.0531,-.0521,-.0511,-.0499,-.0487,-.0473,-.0459,-.0442,-.0425,-.0405,-.0383,-.0359,-.0331,-.0298,-.0259],b_x:[-2.3509,-4.0466,-5.3978,-6.6213,-7.7862,-8.9196,-10.0363,-11.1469,-12.2854,-13.3981,-14.5092,-15.6231,-16.7524,-17.8862,-19.025,-20.1748],b_y:[-.0437,-.0438,-.0438,-.0439,-.0439,-.044,-.0441,-.0441,-.0442,-.0443,-.0444,-.0444,-.0445,-.0446,-.0447,-.0448]},{r_x:[-21.9278,-21.3484,-20.7628,-20.1344,-19.4757,-18.7856,-18.0477,-17.2595,-16.3843,-15.4484,-14.4257,-13.2751,-11.9456,-10.3735,-8.3553,-5.2147],r_y:[-.0407,-.0417,-.0426,-.0433,-.0439,-.0443,-.0447,-.045,-.0451,-.0452,-.0452,-.0451,-.045,-.0447,-.0444,-.044],g_x:[-13.0812,-13.0665,-13.0508,-13.0388,-13.0293,-13.0203,-13.0133,-13.0087,-13.0068,-13.0092,-13.0125,-13.0162,-13.0269,-13.0372,-13.0532,-13.0708],g_y:[-.0665,-.0634,-.0603,-.0572,-.054,-.0508,-.0476,-.0443,-.0408,-.0373,-.0337,-.0299,-.0258,-.0211,-.0155,-.006],b_x:[-7.2789,-8.4407,-9.4718,-10.4471,-11.3919,-12.3169,-13.2284,-14.1319,-15.0565,-15.9516,-16.8449,-17.7392,-18.6339,-19.5305,-20.4287,-21.3308],b_y:[-.0372,-.0384,-.0395,-.0405,-.0415,-.0424,-.0432,-.044,-.0448,-.0455,-.0462,-.0469,-.0476,-.0482,-.0488,-.0494]},{r_x:[-22.5873,-21.9563,-21.3711,-20.7867,-19.9754,-18.4599,-16.9442,-15.4282,-13.4591,-11.1479,-8.8297,-6.5275,-5.1161,-3.9946,-2.8733,-1.7523],r_y:[-.0419,-.0427,-.0435,-.0443,-.0452,-.0461,-.0471,-.0481,-.0478,-.0462,-.0446,-.0431,-.0419,-.0408,-.0397,-.0387],g_x:[-13.1499,-13.6389,-14.1283,-14.6177,-15.0304,-15.2028,-15.3755,-15.5483,-15.5483,-15.3755,-15.2028,-15.0304,-14.6177,-14.1283,-13.6389,-13.1499],g_y:[-.0679,-.0663,-.0649,-.0634,-.061,-.0553,-.0497,-.0441,-.0373,-.0299,-.0224,-.015,-.0104,-.0069,-.0035,0],b_x:[0,-1.1629,-2.4025,-3.6427,-5.0938,-7.0911,-9.0872,-11.0838,-12.4271,-13.0415,-13.651,-14.263,-13.9595,-13.3667,-12.7641,-12.1687],b_y:[0,-.0049,-.0102,-.0154,-.0216,-.0301,-.0385,-.047,-.0527,-.0553,-.0579,-.0605,-.0592,-.0567,-.0541,-.0516],b_x2:[0,.1737,.3579,.5429,.7486,1.01,1.2709,1.5314,1.3563,.758,.152,-.4504,-.9129,-1.327,-1.7466,-2.1664],b_y2:[0,.0073,.015,.0227,.0314,.0423,.0533,.0642,.0568,.0318,.0064,-.0189,-.0383,-.0556,-.0732,-.0908]},{r_x:[-9.3217,-9.7119,-10.1026,-10.4928,-10.8832,-11.2736,-11.6641,-12.0545,-12.4564,-12.8467,-13.2372,-13.6275,-14.0181,-14.4083,-14.7989,-15.1894],r_y:[-.0121,-.0159,-.0198,-.0236,-.0274,-.0313,-.0351,-.039,-.0429,-.0467,-.0506,-.0544,-.0582,-.0621,-.0659,-.0698],g_x:[-17.2405,-16.5128,-15.7853,-15.0578,-14.3304,-13.6031,-12.8759,-12.1487,-11.4004,-10.6733,-9.9465,-9.2196,-8.4931,-7.7664,-7.04,-6.3134],g_y:[-.0229,-.0255,-.0282,-.0308,-.0334,-.0361,-.0387,-.0413,-.044,-.0467,-.0493,-.0519,-.0546,-.0572,-.0599,-.0625],b_x:[-19.5271,-18.4535,-17.3793,-16.3057,-15.2322,-14.1586,-13.0846,-12.0108,-10.9055,-9.8317,-8.7578,-7.6841,-6.6107,-5.537,-4.4628,-3.3892],b_y:[-.0543,-.0529,-.0515,-.0501,-.0487,-.0473,-.0459,-.0445,-.0431,-.0417,-.0403,-.0389,-.0375,-.0361,-.0347,-.0333]},{r_x:[-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767],r_y:[-.0765,-.0714,-.0663,-.0612,-.0561,-.051,-.0459,-.0408,-.0357,-.0306,-.0255,-.0204,-.0153,-.0102,-.0051,0],g_x:[0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.5765,-15.0849,-16.5934,-18.1019,-19.6104,-21.1189,-22.6274],g_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],b_x:[13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767],b_y:[0,.0051,.0102,.0153,.0204,.0255,.0306,.0357,.0408,.0459,.051,.0561,.0612,.0663,.0714,.0765]}],r=t=>{if(t>=n.length)return null;let r=n[t],i=new Float32Array(128);return i.set(r.r_x,0),i.set(r.r_y,16),i.set(r.g_x,32),i.set(r.g_y,48),i.set(r.b_x,64),i.set(r.b_y,80),i.set(r.b_x2??e,96),i.set(r.b_y2??e,112),i},i=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],a=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],o=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],s=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],c=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],l=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];i<t&&(t=i),i>n&&(n=i)}let r=n-t||1e-6;return{min:t,max:n,range:r}},u=Uint8Array.of(65,82,82,79,87,49),d={V1:0,V2:1,V3:2,V4:3,V5:4},f={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},p={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},m={HALF:0,SINGLE:1,DOUBLE:2},h={DAY:0,MILLISECOND:1},g={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},_={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},v={Sparse:0,Dense:1},y={LZ4_FRAME:0,ZSTD:1},b={BUFFER:0},x=Uint8Array,S=Uint16Array,C=Uint32Array,w=BigUint64Array,T=Int8Array,E=Int16Array,D=Int32Array,O=BigInt64Array,k=Float32Array,A=Float64Array;function j(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function M(e,t){let n=Math.log2(e)-3;return(t?[T,E,D,O]:[x,S,C,w])[n]}Object.getPrototypeOf(Int8Array);function N(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function P(e,t,n){if(t(e))return e;throw Error(n(e))}function F(e,t,n){return t=Array.isArray(t)?t:Object.values(t),P(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function I(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const ee=e=>`Unsupported data type: \"${I(p,e)}\" (id ${e})`,te=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function ne(e){return Object.hasOwn(e,`name`)&&re(e.type)}function re(e){return typeof e?.typeId==`number`}function L(e,t=``,n=!0){return ne(e)?e:te(t,P(e,re,()=>`Data type expected.`),n)}const ie=(e,t,n=!1,r=-1)=>({typeId:p.Dictionary,id:r,dictionary:e,indices:t||ae(),ordered:n}),R=(e=32,t=!0)=>({typeId:p.Int,bitWidth:F(e,[8,16,32,64]),signed:t,values:M(e,t)}),ae=()=>R(32),oe=(e=2)=>({typeId:p.Float,precision:F(e,m),values:[S,k,A][e]}),se=()=>({typeId:p.Binary,offsets:D}),ce=()=>({typeId:p.Utf8,offsets:D}),le=(e,t,n=128)=>({typeId:p.Decimal,precision:e,scale:t,bitWidth:F(n,[32,64,128,256]),values:n===32?D:w}),ue=e=>({typeId:p.Date,unit:F(e,h),values:e===h.DAY?D:O}),de=(e=g.MILLISECOND)=>{e=F(e,g);let t=e===g.SECOND||e===g.MILLISECOND?32:64;return{typeId:p.Time,unit:e,bitWidth:t,values:t===32?D:O}},fe=(e=g.MILLISECOND,t=null)=>({typeId:p.Timestamp,unit:F(e,g),timezone:t,values:O}),pe=(e=_.MONTH_DAY_NANO)=>({typeId:p.Interval,unit:F(e,_),values:e===_.MONTH_DAY_NANO?void 0:D}),me=e=>({typeId:p.List,children:[L(e)],offsets:D}),he=e=>({typeId:p.Struct,children:Array.isArray(e)&&e.length>0&&ne(e[0])?e:Object.entries(e).map(([e,t])=>te(e,t))}),ge=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:p.Union,mode:F(e,v),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>L(e,`_${t}`)),typeIdForValue:r,offsets:D}),_e=e=>({typeId:p.FixedSizeBinary,stride:e}),ve=(e,t)=>({typeId:p.FixedSizeList,stride:t,children:[L(e)]}),ye=(e,t)=>({typeId:p.Map,keysSorted:e,children:[t],offsets:D}),be=(e=g.MILLISECOND)=>({typeId:p.Duration,unit:F(e,g),values:O}),xe=()=>({typeId:p.LargeBinary,offsets:O}),Se=()=>({typeId:p.LargeUtf8,offsets:O}),Ce=e=>({typeId:p.LargeList,children:[L(e)],offsets:O}),we=(e,t)=>({typeId:p.RunEndEncoded,children:[P(L(e,`run_ends`),e=>e.type.typeId===p.Int,()=>`Run-ends must have an integer type.`),L(t,`values`)]}),Te=e=>({typeId:p.ListView,children:[L(e,`value`)],offsets:D}),Ee=e=>({typeId:p.LargeListView,children:[L(e,`value`)],offsets:O}),De=new A(2).buffer;new O(De),new C(De),new D(De),new x(De);function Oe(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function ke(e,t){return Number(e/t)+Number(e%t)/Number(t)}const Ae=e=>BigInt.asUintN(64,e);function je(e,t){return BigInt.asIntN(64,e[t])}function Me(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=Ae(~e[n])|Ae(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Ne(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=Ae(~e[n])|Ae(~e[n+1])<<64n|Ae(~e[n+2])<<128n|Ae(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const Pe=new TextDecoder(`utf-8`);new TextEncoder;function Fe(e){return Pe.decode(e)}function Ie(e,t){return(e[t>>3]&1<<t%8)!=0}function z(e,t){let n=t+V(e,t),r=n-V(e,n),i=B(e,r);return(t,a,o=null)=>{if(t<i){let i=B(e,r+t);if(i)return a(e,n+i)}return o}}function Le(e,t){return t}function Re(e,t){return!!ze(e,t)}function ze(e,t){return Be(e,t)<<24>>24}function Be(e,t){return e[t]}function B(e,t){return Ve(e,t)<<16>>16}function Ve(e,t){return e[t]|e[t+1]<<8}function V(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function He(e,t){return V(e,t)>>>0}function H(e,t){return Oe(BigInt.asIntN(64,BigInt(He(e,t))+(BigInt(He(e,t+4))<<32n)))}function Ue(e,t){let n=t+V(e,t),r=V(e,n);return n+=4,Fe(e.subarray(n,n+r))}function We(e,t,n,r){if(!t)return[];let i=t+V(e,t);return Array.from({length:V(e,i)},(t,a)=>r(e,i+4+a*n))}const Ge=Symbol(`rowIndex`);function Ke(e,t){class n{constructor(e){this[Ge]=e}toJSON(){return Je(e,t,this[Ge])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[Ge])},enumerable:!0})}return e=>new n(e)}function qe(e,t){return n=>Je(e,t,n)}function Je(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Ye(e){return e instanceof Ze}var Xe=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Ie(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},Ze=class extends Xe{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},Qe=class extends Xe{static ArrayType=A},U=class extends Xe{static ArrayType=Array},$e=class extends U{value(e){return null}},et=class extends Qe{value(e){return Oe(this.values[e])}},tt=class extends Qe{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},nt=class extends U{value(e){return Ie(this.values,e)}},rt=class extends Qe{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},it=class extends Xe{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?je:t===128?Me:Ne,this.scale=10n**BigInt(n)}},at=class extends it{static ArrayType=A;value(e){return ke(this.decimal(this.values,e),this.scale)}},ot=class extends it{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},st=class extends U{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},ct=class extends Qe{value(e){return 864e5*this.values[e]}};const lt=et;var ut=class extends et{value(e){return super.value(e)*1e3}};const dt=et;var ft=class extends et{value(e){return ke(this.values[e],1000n)}},pt=class extends et{value(e){return ke(this.values[e],1000000n)}},mt=class extends U{value(e){return this.values.subarray(e<<1,e+1<<1)}},ht=class extends U{value(e){let t=this.values,n=e<<4;return Float64Array.of(V(t,n),V(t,n+4),H(t,n+8))}};const gt=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),_t=({values:e,offsets:t},n)=>e.subarray(Oe(t[n]),Oe(t[n+1]));var vt=class extends U{value(e){return gt(this,e)}},yt=class extends U{value(e){return _t(this,e)}},bt=class extends U{value(e){return Fe(gt(this,e))}},xt=class extends U{value(e){return Fe(_t(this,e))}},St=class extends U{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},Ct=class extends U{value(e){let t=this.offsets;return this.children[0].slice(Oe(t[e]),Oe(t[e+1]))}},wt=class extends U{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},Tt=class extends U{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(Oe(t),Oe(n))}},Et=class extends U{constructor(e){super(e),this.stride=this.type.stride}},Dt=class extends Et{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},Ot=class extends Et{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function kt({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var At=class extends U{value(e){return kt(this,e)}},jt=class extends U{value(e){return new Map(kt(this,e))}},Mt=class extends U{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},Nt=class extends Mt{value(e){return super.value(e,this.offsets[e])}},Pt=class extends U{constructor(e,t=qe){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},Ft=class extends Pt{constructor(e){super(e,Ke)}},It=class extends U{value(e){let[{values:t},n]=this.children;return n.at(N(t,e))}},Lt=class extends U{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},Rt=class extends U{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=V(a,r);return o>12&&(i=V(a,r+12),a=n[V(a,r+8)]),a.subarray(i,i+o)}},zt=class extends Rt{value(e){return this.view(e)}},Bt=class extends Rt{value(e){return Fe(this.view(e))}};function Vt(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new Ht(t,e)}}var Ht=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Ut(e)}at(e){let{data:t,offsets:n}=this,r=N(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Ye(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Wt(a,n):Gt(a,n)}cache(){return this._cache??=this.toArray()}};function*Ut(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Wt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function Gt(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var Kt=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?Ke:qe;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>qt(o[e],n[t]))},t.map(e=>r[e]),i===Ke)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=N(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function qt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Jt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useDate:c,useDecimalInt:l,useMap:u,useProxy:d}=t;switch(n){case p.Null:return $e;case p.Bool:return nt;case p.Int:case p.Time:case p.Duration:return s||r<64?Ze:et;case p.Float:return a?Ze:tt;case p.Date:return Yt(o===h.DAY?ct:lt,c&&st);case p.Timestamp:return Yt(o===g.SECOND?ut:o===g.MILLISECOND?dt:o===g.MICROSECOND?ft:pt,c&&st);case p.Decimal:return r===32?l?Ze:rt:l?ot:at;case p.Interval:return o===_.DAY_TIME?mt:o===_.YEAR_MONTH?Ze:ht;case p.FixedSizeBinary:return Dt;case p.Utf8:return bt;case p.LargeUtf8:return xt;case p.Binary:return vt;case p.LargeBinary:return yt;case p.BinaryView:return zt;case p.Utf8View:return Bt;case p.List:return St;case p.LargeList:return Ct;case p.Map:return u?jt:At;case p.ListView:return wt;case p.LargeListView:return Tt;case p.FixedSizeList:return Ot;case p.Struct:return d?Ft:Pt;case p.RunEndEncoded:return It;case p.Dictionary:return Lt;case p.Union:return i?Nt:Mt}throw Error(ee(n))}function Yt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function Xt(e){return`Missing compression codec \"${I(y,e)}\" (id ${e})`}const Zt=new Map;function Qt(e){return e!=null&&Zt.get(e)||null}function $t(e,{offset:t,length:n},r){if(n===0)return{bytes:new Uint8Array,offset:0,length:0};let i=H(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a);return{bytes:o,offset:0,length:o.length}}function en(e,t){return{offset:H(e,t),metadataLength:V(e,t+8),bodyLength:H(e,t+16)}}function tn(e,t){return We(e,t,24,en)}function nn(e,t){let n=z(e,t);return{codec:n(4,ze,y.LZ4_FRAME),method:n(6,ze,b.BUFFER)}}function rn(e,t,n){let r=z(e,t),i=n<d.V4?8:0;return{length:r(4,H,0),nodes:We(e,r(6,Le),16,(e,t)=>({length:H(e,t),nullCount:H(e,t+8)})),regions:We(e,r(8,Le),16+i,(e,t)=>({offset:H(e,t+i),length:H(e,t+i+8)})),compression:r(10,nn),variadic:We(e,r(12,Le),8,H)}}function an(e,t,n){let r=z(e,t);return{id:r(4,H,0),data:r(6,(e,t)=>rn(e,t,n)),isDelta:r(8,Re,!1)}}function on(e,t,n,r){F(n,p,ee);let i=z(e,t);switch(n){case p.Binary:return se();case p.Utf8:return ce();case p.LargeBinary:return xe();case p.LargeUtf8:return Se();case p.List:return me(r[0]);case p.ListView:return Te(r[0]);case p.LargeList:return Ce(r[0]);case p.LargeListView:return Ee(r[0]);case p.Struct:return he(r);case p.RunEndEncoded:return we(r[0],r[1]);case p.Int:return R(i(4,V,0),i(6,Re,!1));case p.Float:return oe(i(4,B,m.HALF));case p.Decimal:return le(i(4,V,0),i(6,V,0),i(8,V,128));case p.Date:return ue(i(4,B,h.MILLISECOND));case p.Time:return de(i(4,B,g.MILLISECOND));case p.Timestamp:return fe(i(4,B,g.SECOND),i(6,Ue));case p.Interval:return pe(i(4,B,_.YEAR_MONTH));case p.Duration:return be(i(4,B,g.MILLISECOND));case p.FixedSizeBinary:return _e(i(4,V,0));case p.FixedSizeList:return ve(r[0],i(4,V,0));case p.Map:return ye(i(4,Re,!1),r[0]);case p.Union:return ge(i(4,B,v.Sparse),r,We(e,i(6,Le),4,V))}return{typeId:n}}function sn(e,t){let n=We(e,t,4,(e,t)=>{let n=z(e,t);return[n(4,Ue),n(6,Ue)]});return n.length?new Map(n):null}function cn(e,t,n){let r=z(e,t);return{version:n,endianness:r(4,B,0),fields:r(6,ln,[]),metadata:r(8,sn)}}function ln(e,t){return We(e,t,4,un)}function un(e,t){let n=z(e,t),r=n(8,Be,p.NONE),i=n(10,Le,0),a=n(12,fn),o=on(e,i,r,n(14,dn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,Ue),type:o,nullable:n(6,Re,!1),metadata:n(16,sn)}}function dn(e,t){return We(e,t,4,un)}function fn(e,t){if(!t)return null;let n=z(e,t);return ie(null,n(6,pn,ae()),n(8,Re,!1),n(4,H,0))}function pn(e,t){return on(e,t,p.Int)}const mn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,hn=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,gn=e=>`Unsupported message type: ${e} (${I(f,e)})`;function _n(e,t){let n=V(e,t)||0;if(t+=4,n===-1&&(n=V(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(mn(n,r.byteLength));let i=z(r,0),a=i(4,B,d.V1),o=i(6,Be,f.NONE),s=i(8,Le,0),c=i(10,H,0),l;if(s){let n=o===f.Schema?cn:o===f.DictionaryBatch?an:o===f.RecordBatch?rn:null;if(!n)throw Error(gn(o));if(l=n(r,s,a),c>0){let n=e.subarray(t,t+=c);if(n.byteLength<c)throw Error(hn(c,n.byteLength));l.body=n}else o!==f.Schema&&(l.body=new Uint8Array)}return{version:a,type:o,index:t,content:l}}function vn(e){let t=j(e)?new Uint8Array(e):e;return t instanceof Uint8Array&&yn(t)?xn(t):bn(t)}function yn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(u[t]!==e[t])return!1;return!0}function bn(e){let t=[e].flat(),n,r=[],i=[];for(let e of t){if(!(e instanceof Uint8Array))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let a=_n(e,t);if(a===null)break;if(t=a.index,a.content)switch(a.type){case f.Schema:n||=a.content;break;case f.RecordBatch:r.push(a.content);break;case f.DictionaryBatch:i.push(a.content);break}}}return{schema:n,dictionaries:i,records:r,metadata:null}}function xn(e){let t=e.byteLength-(u.length+4),n=z(e,t-V(e,t)),r=n(4,B,d.V1),i=n(8,tn,[]),a=n(10,tn,[]);return{schema:n(6,(e,t)=>cn(e,t,r)),dictionaries:i.map(({offset:t})=>_n(e,t).content),records:a.map(({offset:t})=>_n(e,t).content),metadata:n(12,sn)}}function Sn(e,t){return Cn(vn(e),t)}function Cn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i}=e,{version:a,fields:o}=n,s=new Map,c=Tn(t,a,s),l=new Map;wn(n,e=>{let t=e.type;t.typeId===p.Dictionary&&l.set(t.id,t.dictionary)});let u=new Map;for(let e of r){let{id:t,data:n,isDelta:r,body:i}=e,a=l.get(t),o=Dn(a,c({...n,body:i}));if(u.has(t)){let e=u.get(t);r||e.clear(),e.add(o)}else{if(r)throw Error(`Delta update can not be first dictionary batch.`);u.set(t,Vt(a).add(o))}}u.forEach((e,t)=>s.set(t,e.done()));let d=o.map(e=>Vt(e.type));for(let e of i){let t=c(e);o.forEach((e,n)=>d[n].add(Dn(e.type,t)))}return new Kt(n,d.map(e=>e.done()),t.useProxy)}function wn(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function Tn(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=En(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>Dn(e.type,this))}}}}function En(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==b.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=Qt(r);if(!i)throw Error(Xt(r));return $t(e,t,i)}}function Dn(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:s}=t,c=Jt(e,r),l={...i(),type:e};if(n===p.Null)return new c({...l,nullCount:l.length});switch(n){case p.Bool:case p.Int:case p.Time:case p.Duration:case p.Float:case p.Decimal:case p.Date:case p.Timestamp:case p.Interval:case p.FixedSizeBinary:return new c({...l,validity:a(),values:a(e.values)});case p.Utf8:case p.LargeUtf8:case p.Binary:case p.LargeBinary:return new c({...l,validity:a(),offsets:a(e.offsets),values:a()});case p.BinaryView:case p.Utf8View:return new c({...l,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case p.List:case p.LargeList:case p.Map:return new c({...l,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case p.ListView:case p.LargeListView:return new c({...l,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case p.FixedSizeList:case p.Struct:return new c({...l,validity:a(),children:t.visit(e.children)});case p.RunEndEncoded:return new c({...l,children:t.visit(e.children)});case p.Dictionary:{let{id:n,indices:r}=e;return new c({...l,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case p.Union:return s<d.V5&&a(),new c({...l,typeIds:a(T),offsets:e.mode===v.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(ee(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const On=new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),kn=e=>{let t=Sn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t)){if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);On.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i));continue}if(Array.isArray(i)&&i.length>0&&typeof i[0]==`string`){let t=new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}}return{numeric:n,categorical:r}},An=[65,82,82,79,87,49],jn=[80,65,82,49],Mn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),Nn=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return Mn(t,An)?`arrow`:Mn(t,jn)?`parquet`:`arrow`},Pn=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],Fn=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],In=[`REQUIRED`,`OPTIONAL`,`REPEATED`],Ln=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],Rn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],zn=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Bn=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Vn(e){let t=Hn(e);if(t.type===1)return{type:`Point`,coordinates:Un(e,t)};if(t.type===2)return{type:`LineString`,coordinates:Wn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Gn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Un(e,Hn(e)));return{type:`MultiPoint`,coordinates:n}}else if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,Hn(e)));return{type:`MultiLineString`,coordinates:n}}else if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Gn(e,Hn(e)));return{type:`MultiPolygon`,coordinates:n}}else if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Vn(e));return{type:`GeometryCollection`,geometries:n}}else throw Error(`Unsupported geometry type: ${t.type}`)}function Hn(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Un(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function Wn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Un(e,t));return n}function Gn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(Wn(e,{...t,count:i}))}return r}const Kn=new TextDecoder,qn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return new Date(e*864e5)},stringFromBytes(e){return e&&Kn.decode(e)},geometryFromBytes(e){return e&&Vn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Vn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})}};function Jn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}else return Yn(e,r)}function Yn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=Xn(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(Zn(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>JSON.parse(Kn.decode(e)));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=BigInt(e[n]);return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map(Qn);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function Xn(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function Zn(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function Qn(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function $n(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=$n(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function er(e,t){let n=$n(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function tr(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function nr(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function rr(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function ir(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function ar(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length!==2||t.element.repetition_type!==`REPEATED`||t.children.find(e=>e.element.name===`key`)?.element.repetition_type===`REPEATED`||t.children.find(e=>e.element.name===`value`)?.element.repetition_type===`REPEATED`)}function or(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}const W={STOP:0,TRUE:1,FALSE:2,BYTE:3,I16:4,I32:5,I64:6,DOUBLE:7,BINARY:8,LIST:9,SET:10,MAP:11,STRUCT:12,UUID:13};function sr(e){let t=0,n={};for(;e.offset<e.view.byteLength;){let[r,i,a]=pr(e,t);if(t=a,r===W.STOP)break;n[`field_${i}`]=cr(e,r)}return n}function cr(e,t){switch(t){case W.TRUE:return!0;case W.FALSE:return!1;case W.BYTE:return e.view.getInt8(e.offset++);case W.I16:case W.I32:return dr(e);case W.I64:return fr(e);case W.DOUBLE:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case W.BINARY:{let t=lr(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case W.LIST:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=lr(e));let i=n===W.TRUE||n===W.FALSE,a=Array(r);for(let t=0;t<r;t++)a[t]=i?cr(e,W.BYTE)===1:cr(e,n);return a}case W.STRUCT:{let t={},n=0;for(;;){let[r,i,a]=pr(e,n);if(n=a,r===W.STOP)break;t[`field_${i}`]=cr(e,r)}return t}default:throw Error(`thrift unhandled type: ${t}`)}}function lr(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function ur(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function dr(e){let t=lr(e);return t>>>1^-(t&1)}function fr(e){let t=ur(e);return t>>1n^-(t&1n)}function pr(e,t){let n=e.view.getUint8(e.offset++),r=n&15;if(r===W.STOP)return[0,0,t];let i=n>>4,a=i?t+i:dr(e);return[r,a,a]}function mr(e,t){let n=new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let r=e[t],{logical_type:i,name:a,num_children:o,repetition_type:s,type:c}=r;if(o){t+=o;continue}c===`BYTE_ARRAY`&&i===void 0&&s!==`REPEATED`&&(r.logical_type=n.get(a))}}const hr=new TextDecoder;function G(e){return e&&hr.decode(e)}async function gr(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),_r(c,{parsers:t,geoparquet:r})}else return _r(a,{parsers:t,geoparquet:r})}function _r(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e);if(t={...qn,...t},r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let i=r.byteLength-8,a=r.getUint32(i,!0);if(a>r.byteLength-8)throw Error(`parquet metadata length ${a} exceeds available buffer ${r.byteLength-8}`);let o=sr({view:r,offset:i-a}),s=o.field_1,c=o.field_2.map(e=>({type:Pn[e.field_1],type_length:e.field_2,repetition_type:In[e.field_3],name:G(e.field_4),num_children:e.field_5,converted_type:Ln[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:yr(e.field_10)})),l=c.filter(e=>e.type),u=o.field_3,d=o.field_4.map(e=>({columns:e.field_1.map((e,n)=>({file_path:G(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:Pn[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>Fn[e]),path_in_schema:e.field_3.field_3.map(G),codec:Rn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:G(e.field_1),value:G(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:xr(e.field_3.field_12,l[n],t),encoding_stats:e.field_3.field_13?.map(e=>({page_type:zn[e.field_1],encoding:Fn[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),f=o.field_5?.map(e=>({key:G(e.field_1),value:G(e.field_2)})),p=G(o.field_6);return n&&mr(c,f),{version:s,schema:c,num_rows:u,row_groups:d,key_value_metadata:f,created_by:p,metadata_length:a}}function vr({schema:e}){return er(e,[])[0]}function yr(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:br(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:br(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:G(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:G(e.field_18.field_1),algorithm:Bn[e.field_18.field_2]}:e}function br(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function xr(e,t,n){return e&&{max:Sr(e.field_1,t,n),min:Sr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:Sr(e.field_5,t,n),min_value:Sr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function Sr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);return r===`FLOAT`&&o.byteLength===4?o.getFloat32(0,!0):r===`DOUBLE`&&o.byteLength===8?o.getFloat64(0,!0):r===`INT32`&&i===`DATE`?n.dateFromDays(o.getInt32(0,!0)):r===`INT64`&&i===`TIMESTAMP_MILLIS`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT64`&&i===`TIMESTAMP_MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`?n.timestampFromNanoseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?Xn(e)*10**-(t.scale||0):a?.type===`FLOAT16`?Qn(e):e}function Cr(e){let t=sr(e);return{page_locations:t.field_1.map(wr),unencoded_byte_array_data_bytes:t.field_2}}function wr(e){return{offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3}}function Tr(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function K(e,t,n=!0){if(n?e===t:e==t)return!0;if(e instanceof Uint8Array&&t instanceof Uint8Array)return K(Array.from(e),Array.from(t),n);if(!e||!t||typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!K(e[r],t[r],n))return!1;return!0}if(typeof e!=`object`)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!K(e[i],t[i],n))return!1;return!0}function Er(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Tr(t,n);return t}function Dr(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(Dr)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(Dr)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(Dr)):t.push(...Object.keys(e).map(e=>e.split(`.`)[0])),[...new Set(t)]}function Or(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>Or(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>Or(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>Or(e,t,n)):Object.entries(t).every(([t,r])=>{let i=Ar(e,t);return typeof r!=`object`||!r||Array.isArray(r)?K(i,r,n):Object.entries(r||{}).every(([e,r])=>e===`$gt`?i>r:e===`$gte`?i>=r:e===`$lt`?i<r:e===`$lte`?i<=r:e===`$eq`?K(i,r,n):e===`$ne`?!K(i,r,n):e===`$in`?Array.isArray(r)&&r.includes(i):e===`$nin`?Array.isArray(r)&&!r.includes(i):e===`$not`?!Or({[t]:i},{[t]:r},n):!0)})}function kr({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>kr({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>kr({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[i,a]of Object.entries(n)){let n=t.indexOf(i);if(n===-1)continue;let o=e.columns[n].meta_data?.statistics;if(!o)continue;let{min:s,max:c,min_value:l,max_value:u}=o,d=l===void 0?s:l,f=u===void 0?c:u;if(!(d===void 0||f===void 0)){for(let[e,t]of Object.entries(a||{}))if(e===`$gt`&&f<=t||e===`$gte`&&f<t||e===`$lt`&&d>=t||e===`$lte`&&d>t||e===`$eq`&&(t<d||t>f)||e===`$ne`&&K(d,f,r)&&K(d,t,r)||e===`$in`&&Array.isArray(t)&&t.every(e=>e<d||e>f)||e===`$nin`&&Array.isArray(t)&&K(d,f,r)&&t.includes(d))return!0}}return!1}function Ar(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}function jr({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,useOffsetIndex:o=!1}){if(!e)throw Error(`parquetPlan requires metadata`);let s=[],c=[],l=[],u=tr(vr(e)),d=0;for(let f of e.row_groups){let e=Number(f.num_rows),p=d+e;if(e>0&&p>t&&d<n&&!kr({rowGroup:f,physicalColumns:u,filter:i,strict:a})){let i=[],a=1/0,u=-1/0;for(let e of f.columns){let t=e.meta_data;if(e.file_path)throw Error(`parquet file_path not supported`);if(!t)throw Error(`parquet column metadata is undefined`);if(!r||r.includes(t.path_in_schema[0])){let n=t.dictionary_page_offset||t.data_page_offset,r=Number(n),s=Number(n+t.total_compressed_size);if(r<a&&(a=r),s>u&&(u=s),o&&e.offset_index_offset&&e.offset_index_length){let n=Number(e.offset_index_offset);i.push({columnMetadata:t,offsetIndex:{startByte:n,endByte:n+e.offset_index_length},bounds:{startByte:r,endByte:s}})}else i.push({columnMetadata:t,range:{startByte:r,endByte:s}})}}let p=Math.max(t-d,0),m=Math.min(n-d,e);s.push({chunks:i,rowGroup:f,groupStart:d,groupRows:e,selectStart:p,selectEnd:m});let h;for(let e of i)if(`offsetIndex`in e)l.push(e.offsetIndex);else{let{range:t}=e;r?c.push(t):h&&t.endByte-h.startByte<=2097152?h.endByte=t.endByte:(h&&c.push(h),h={...t})}h&&c.push(h)}d=p}return isFinite(n)||(n=d),c.push(...l),{metadata:e,rowStart:t,rowEnd:n,columns:r,fetches:c,groups:s}}function Mr(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}else return n[a]}}}const Nr=new TextDecoder,Pr=new WeakMap;function Fr(e,t=qn){if(Array.isArray(e))return e.map(e=>Fr(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=Rr(e.metadata),r=e.typed_value&&Ir(e.typed_value,n,t),i=e.value&&Br(Lr(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function Ir(e,t,n){if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e)return Ir(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return Br(Lr(e.value),t,n);let r={};for(let[i,a]of Object.entries(e))r[i]=Ir(a,t,n);return r}return e instanceof Uint8Array?Br(Lr(e),t,n):Array.isArray(e)?e.map(e=>Ir(e,t,n)):e}function Lr(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function Rr(e){let t=Pr.get(e.buffer);t||(t=new Map,Pr.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=Lr(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=zr(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=zr(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=Nr.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function zr(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function Br(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Vr(e,a,n);if(i===2)return Hr(e,a,t,n);if(i===3)return Ur(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,Nr.decode(o)}function Vr(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Wr(e,4);case 9:return Wr(e,8);case 10:return Wr(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return Gr(e);case 16:{let t=Gr(e);return Nr.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function Hr(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?zr(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=zr(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=zr(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=Br({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Ur(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=zr(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=zr(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++)u[t]=Br({view:e.view,offset:l+c[t]},n,r);return e.offset=l+c[c.length-1],u}function Wr(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function Gr(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function Kr(e,t,n,r,i){let a=rr(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function qr(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(ir(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),qr(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Jr(u,r),e.set(i,u),e.delete(l);return}if(ar(t)){let s=t.children[0].element.name;qr(e,t.children[0].children[0],n,o+1),qr(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Yr(c,l,o);a&&Jr(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u);return}if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){qr(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=Xr(s,o);t.element.logical_type?.type===`VARIANT`&&(c=Fr(c,n)),a&&Jr(c,r),e.set(i,c)}}function Jr(e,t){for(let n=0;n<e.length;n++)t?Jr(e[n],t-1):e[n]=e[n][0]}function Yr(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Yr(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function Xr(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(Xr(o,t-1)):i.push(o)}return i}function Zr(e,t,n){let r=n instanceof Int32Array,i=lr(e),a=lr(e);lr(e);let o=fr(e),s=0;n[s++]=r?Number(o):o;let c=i/a;for(;s<t;){let i=fr(e),l=new Uint8Array(a);for(let t=0;t<a;t++)l[t]=e.view.getUint8(e.offset++);for(let u=0;u<a&&s<t;u++){let a=BigInt(l[u]);if(a){let l=0n,u=c,d=(1n<<a)-1n;for(;u&&s<t;){let t=BigInt(e.view.getUint8(e.offset))>>l&d;for(l+=a;l>=8;)l-=8n,e.offset++,l&&(t|=BigInt(e.view.getUint8(e.offset))<<a-l&d);let c=i+t;o+=c,n[s++]=r?Number(o):o,u--}u&&(e.offset+=Math.ceil((u*Number(a)+Number(l))/8))}else for(let e=0;e<c&&s<t;e++)o+=i,n[s++]=r?Number(o):o}}}function Qr(e,t,n){let r=new Int32Array(t);Zr(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function $r(e,t,n){let r=new Int32Array(t);Zr(e,t,r);let i=new Int32Array(t);Zr(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function ei(e){return 32-Math.clz32(e)}function ti(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=lr(e);if(r&1)a=ri(e,r,t,n,a);else{let i=r>>>1;ni(e,i,t,n,a),a+=i}}e.offset=i+r}function ni(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function ri(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function ii(e,t,n,r){let i=ai(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function ai(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function oi(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return si(e,n);if(t===`INT32`)return ci(e,n);if(t===`INT64`)return li(e,n);if(t===`INT96`)return ui(e,n);if(t===`FLOAT`)return di(e,n);if(t===`DOUBLE`)return fi(e,n);if(t===`BYTE_ARRAY`)return pi(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return mi(e,n,r)}else throw Error(`parquet unhandled type: ${t}`)}function si(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8;n[r]=(e.view.getUint8(t)&1<<i)!=0}return e.offset+=Math.ceil(t/8),n}function ci(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(hi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function li(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(hi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function ui(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function di(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(hi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function fi(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(hi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function pi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function mi(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function hi(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const gi=[0,255,65535,16777215,4294967295];function _i(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function vi(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4;break;default:break}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);_i(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&gi[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);_i(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function yi(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=bi(o,t,i),{definitionLevels:l,numNulls:u}=xi(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=oi(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(ti(o,e,s),s=s.map(e=>!!e)):ti(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=ii(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Zr(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),Qr(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function bi(e,t,n){if(n.length>1){let r=nr(n);if(r){let n=Array(t.num_values);return ti(e,ei(r),n),n}}return[]}function xi(e,t,n){let r=rr(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);ti(e,ei(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function Si(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),vi(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function Ci(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=wi(r,l,o);r.offset=l.repetition_levels_byte_length;let d=Ti(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=Si(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=oi(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),ti(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),ti(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Zr(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),Qr(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),$r(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=ii(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function wi(e,t,n){let r=nr(n);if(!r)return[];let i=Array(t.num_values);return ti(e,ei(r),i,t.repetition_levels_byte_length),i}function Ti(e,t,n){let r=rr(n);if(r){let n=Array(t.num_values);return ti(e,ei(r),n,t.definition_levels_byte_length),n}}function Ei(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=or(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=Oi(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=Di(e,t,i,u,void 0,0);n&&(u=Yn(n,i))}else{let r=d?.length||0,a=Di(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function Di(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&or(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=yi(Si(d,Number(t.uncompressed_page_size),l,u),e,n),p=Jn(f,r,e.encoding,n);return{skipped:0,data:Kr(Array.isArray(i)?i:[],o,s,p,c)}}else if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=Ci(d,t,n),u=Jn(l,r,e.encoding,n);return{skipped:0,data:Kr(Array.isArray(i)?i:[],o,s,u,c)}}else if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=Si(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:oi({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}else throw Error(`parquet unsupported page type: ${t.type}`)}function Oi(e){let t=sr(e);return{type:zn[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:Fn[t.field_5.field_2],definition_level_encoding:Fn[t.field_5.field_3],repetition_level_encoding:Fn[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:Fn[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:Fn[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0?!0:t.field_8.field_7,statistics:t.field_8.field_8}}}function ki(e,{metadata:t},n){let{file:r,compressors:i,utf8:a}=e,o=[],s={...qn,...e.parsers};for(let c of n.chunks){let{columnMetadata:l}=c,u=er(t.schema,l.path_in_schema),d={pathInSchema:l.path_in_schema,type:l.type,element:u[u.length-1].element,schemaPath:u,codec:l.codec,parsers:s,compressors:i,utf8:a};if(!(`offsetIndex`in c)){o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.range.startByte,c.range.endByte)).then(t=>Ei({view:new DataView(t),offset:0},n,d,e.onPage))});continue}o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.offsetIndex.startByte,c.offsetIndex.endByte)).then(async t=>{let i=Cr({view:new DataView(t),offset:0}),{selectStart:a,selectEnd:o}=n,s=i.page_locations,c=NaN,l=NaN,u=0;for(let e=0;e<s.length;e++){let t=s[e],r=Number(t.first_row_index),i=e+1<s.length?Number(s[e+1].first_row_index):n.groupRows;r<o&&i>a&&(Number.isNaN(c)&&(c=Number(t.offset),u=r),l=Number(t.offset)+t.compressed_page_size)}let f=await r.slice(c,l),{data:p,skipped:m}=Ei({view:new DataView(f),offset:0},u?{...n,groupStart:n.groupStart+u,selectStart:n.selectStart-u,selectEnd:n.selectEnd-u}:n,d,e.onPage);return{data:p,skipped:u+m}})})}return{groupStart:n.groupStart,groupRows:n.groupRows,asyncColumns:o}}async function Ai({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(async({data:e})=>{let t=await e;return{...t,data:Er(t.data)}})),o=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),s=r??o,c=s.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),l=n-t;if(i===`object`){let n=Array(l);for(let r=0;r<l;r++){let i=t+r,o={};for(let t=0;t<e.length;t++){let{data:n,skipped:r}=a[t];o[e[t].pathInSchema[0]]=n[i-r]}n[r]=o}return n}let u=Array(l);for(let n=0;n<l;n++){let r=t+n,i=Array(e.length);for(let e=0;e<s.length;e++){let t=c[e];if(t>=0){let{data:n,skipped:o}=a[t];i[e]=n[r-o]}}u[n]=i}return u}function ji(e,t,n){let{asyncColumns:r}=e;n={...qn,...n};let i=[];for(let e of t.children)if(e.children.length){let t=r.filter(t=>t.pathInSchema[0]===e.element.name);if(!t.length)continue;let a=new Map,o=Promise.all(t.map(e=>e.data.then(({data:t})=>{a.set(e.pathInSchema.join(`.`),Er(t))}))).then(()=>{qr(a,e,n);let t=a.get(e.path.join(`.`));if(!t)throw Error(`parquet column data not assembled`);return{data:[t],skipped:0}});i.push({pathInSchema:e.path,data:o})}else{let t=r.find(t=>t.pathInSchema[0]===e.element.name);t&&i.push(t)}return{...e,asyncColumns:i}}async function Mi(e){e.metadata??=await gr(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);let l=Dr(s);if(l.length){let t=vr(e.metadata).children.map(e=>e.element.name),n=l.filter(e=>!t.includes(e));if(n.length)throw Error(`parquet filter columns not found: ${n.join(`, `)}`)}let u=r,d=!1;if(r&&s){let e=l.filter(e=>!r.includes(e));e.length&&(u=[...r,...e],d=!0)}let f=Ni(u===r?e:{...e,columns:u});if(!a&&!i){for(let{asyncColumns:e}of f)for(let{data:t}of e)await t;return}let p=vr(e.metadata),m=f.map(t=>ji(t,p,e.parsers));if(i)for(let e of m)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length});if(a){let e=[];for(let i of m){let a=Math.max(t-i.groupStart,0),f=Math.min((n??1/0)-i.groupStart,i.groupRows),p=o===`object`?await Ai(i,a,f,u,`object`):await Ai(i,a,f,r,`array`);if(s){for(let t of p)if(Or(t,s,c)){if(d&&r)for(let e of l)r.includes(e)||delete t[e];e.push(t)}}else Tr(e,p)}a(e)}else for(let{asyncColumns:e}of m)for(let{data:t}of e)await t}function Ni(e){if(!e.metadata)throw Error(`parquet requires metadata`);let t=jr(e);return e.file=Mr(e.file,t),t.groups.map(n=>ki(e,t,n))}function Pi(e){return new Promise((t,n)=>{Mi({...e,rowFormat:`object`,onComplete:t}).catch(n)})}var Fi=ArrayBuffer,q=Uint8Array,Ii=Uint16Array,Li=Int16Array,Ri=Int32Array,zi=function(e,t,n){if(q.prototype.slice)return q.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new q(n-t);return r.set(e.subarray(t,n)),r},Bi=function(e,t,n,r){if(q.prototype.fill)return q.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Vi=function(e,t,n,r){if(q.prototype.copyWithin)return q.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},Hi=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],J=function(e,t,n){var r=Error(t||Hi[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,J),!n)throw r;return r},Ui=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Wi=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gi=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&J(0);var c=6-i,l=o==3?4:o,u=Ui(e,c,l);c+=l;var d=s?1<<s:i,f=Ui(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&J(1);var h=new q((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Ri(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}else if((n>>4|e[3]<<20)==25481893)return Wi(e,4)+8;J(0)},Ki=function(e){for(var t=0;1<<t<=e;++t);return t-1},qi=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&J(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Fi(512+(a<<2)),f=new Li(d,0,256),p=new Ii(d,0,256),m=new Ii(d,512,a),h=512+(a<<1),g=new q(d,h,a),_=new q(d,h+a);s<255&&o>0;){var v=Ki(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&J(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1){p[k]=-A;continue}for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&J(0),l=0;l<a;++l){var j=p[g[l]]++;m[l]=(j<<(_[l]=i-Ki(j)))-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Ji=function(e,t){var n=0,r=-1,i=new q(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Ii(i.buffer,268);if(a<128){var l=qi(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||J(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ki(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&J(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&J(0),x+=S&&1<<S-1}var C=Ki(x)+1,w=1<<C,T=w-x;for(T&T-1&&J(0),o[r++]=Ki(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new q(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Bi(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&J(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Bi(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Yi=qi(new q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Xi=qi(new q([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Zi=qi(new q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Qi=function(e,t){for(var n=e.length,r=new Ri(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},$i=new q(new Ri([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),ea=Qi($i,0),ta=new q(new Ri([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),na=Qi(ta,3),ra=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||J(0);for(var c=0,l=n.b,u=(r<<3)-8+Ki(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&J(0)},ia=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;ra(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),ra(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),ra(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),ra(e.subarray(r),t.subarray(o),n)},aa=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Bi(n,e[i],t.y,t.y+=s),n):Bi(new q(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):zi(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new q(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Bi(h,e[i++],g);else{var _=t.h;if(u==2){var v=Ji(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||J(0);(m?ia:ra)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&J(0);for(var x=[Xi,Zi,Yi],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new q([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Ii(w.buffer,0,1),b:0}}else C==2?(r=qi(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||J(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||J(0);var A=(c<<3)-8+Ki(k)-O.b,j=A>>3,M=0,N=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var P=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var F=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var I=O.s[N],ee=O.n[N],te=E.s[F],ne=E.n[F],re=D.s[P],L=D.n[P];j=(A-=re)>>3;var ie=1<<re,R=ie+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&ie-1);j=(A-=ta[te])>>3;var ae=na[te]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<ta[te])-1);j=(A-=$i[I])>>3;var oe=ea[I]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<$i[I])-1);if(j=(A-=ee)>>3,N=O.t[N]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<ee)-1),j=(A-=ne)>>3,F=E.t[F]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<ne)-1),j=(A-=L)>>3,P=D.t[P]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<L)-1),R>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=R-=3;else{var se=R-(oe!=0);se?(R=se==3?t.o[0]-1:t.o[se],se>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=R):R=t.o[0]}for(var S=0;S<oe;++S)h[M+S]=h[g+S];M+=oe,g+=oe;var ce=M-R;if(ce<0){var le=-ce,ue=t.e+ce;le>ae&&(le=ae);for(var S=0;S<le;++S)h[M+S]=t.w[ue+S];M+=le,ae-=le,ce=0}for(var S=0;S<ae;++S)h[M+S]=h[ce+S];M+=ae}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=zi(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=zi(h,g));return t.b=c,h}J(2)}},oa=function(e,t){if(e.length==1)return e[0];for(var n=new q(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function sa(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=Gi(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=aa(e,o,t);s||J(5),t?o.e=o.y:(n.push(s),a+=s.length,Vi(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return oa(n,a)}function ca(){let e=la();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=64*1024,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function la(){let e=atob(ua),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const ua=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,da=4096;2*da+32;const fa=2*da-1,pa=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function Y(e){this.buf_=new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.reset()}Y.READ_SIZE=da,Y.IBUF_MASK=fa,Y.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0},Y.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,da);if(t<0)throw Error(`Unexpected end of input`);if(t<da){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[(da<<1)+e]=this.buf_[e];this.buf_ptr_=da}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}},Y.prototype.fillBitWindow=function(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&fa]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},Y.prototype.readBits=function(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&pa[e];return this.bit_pos_+=e,t};const ma=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),ha=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function X(e,t){this.bits=e,this.value=t}function ga(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function _a(e,t,n,r,i){do r-=n,e[t+r]=new X(i.bits,i.value);while(r>0)}function va(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function ya(e,t,n,r,i){let a=t,o=new Int32Array(16),s=new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new X(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new X(r&255,c[p++]&65535);_a(e,t+f,i,u,n),f=ga(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=va(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new X(l+n&255,t-a-h&65535));let s=new X(r-n&255,c[p++]&65535);_a(e,t+(f>>n),i,u,s),f=ga(f,r)}return d}function ba(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2;break}}else{let t=new Uint8Array(18),n=32,o=0,s=[new X(2,0),new X(2,4),new X(2,3),new X(3,2),new X(2,0),new X(2,4),new X(2,3),new X(4,1),new X(2,0),new X(2,4),new X(2,3),new X(3,2),new X(2,0),new X(2,4),new X(2,3),new X(4,5)];for(let e=a;e<18&&n>0;e++){let i=ma[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(!(o===1||n===0))throw Error(`[ReadHuffmanCode] invalid num_codes or space`);Sa(t,e,i,r)}let o=ya(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function xa(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function Sa(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new X(0,0));for(ya(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}function Ca(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*ha[e+31>>>5]),this.htrees=new Uint32Array(t)}Ca.prototype.decode=function(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=ba(this.alphabet_size,this.codes,t,e)};function wa([e,t]){return{offset:e,nbits:t}}const Ta=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(wa),Ea=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(wa),Da=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(wa),Oa=[0,0,8,8,0,16,8,16,16],ka=[0,8,0,8,16,0,16,8,16],Aa=1080,ja=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ma=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);function Na(e,t){let n=new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Pa,rev:Fa}=Na(ja,2);Pa[28]=258,Fa[258]=28;const{base:Ia}=Na(Ma,0),La=new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,La[e]=((t&65280)>>8|(t&255)<<8)>>1}function Ra(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[La[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=La[i[e[t]-1]++]>>15-e[t])}return a}const za=new Uint8Array(288);for(let e=0;e<144;e++)za[e]=8;for(let e=144;e<256;e++)za[e]=9;for(let e=256;e<280;e++)za[e]=7;for(let e=280;e<288;e++)za[e]=8;const Ba=new Uint8Array(32);for(let e=0;e<32;e++)Ba[e]=5;const Va=Ra(za,9,1),Ha=Ra(Ba,5,1);function Ua(e,t,n,r,i,a,o){let s=n*2,c=n,l=xa(t,n*Aa,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Wa(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function Ga(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&Y.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-- >0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>Y.IBUF_MASK){let e=Y.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Ka(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function qa(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function Ja(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Ya(e,t,n){let{offset:r,nbits:i}=Ta[xa(e,t,n)];return r+n.readBits(i)}const Xa=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Za=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Qa(e,t){let n=0;t.readMoreInput();let r=Ka(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<Aa;e++)a[e]=new X(0,0);ba(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=xa(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&eo(i,e),[r,i]}function $a(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function eo(e,t){let n=new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&$a(n,t)}}function to(e){this.buffer=e,this.pos=0}to.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n};function no(e){this.buffer=e,this.pos=0}no.prototype.write=function(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t};const ro=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function io(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function ao(e){return(e+7)/8|0}function oo(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function so(e,t,n=0,r=0){let i=t??new Uint8Array(1024);if(!(e.length-n))return i;let a=oo(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=ao(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}else if(t===1)u=Va,d=Ha,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=new Uint8Array(19);for(let t=0;t<n;++t)a[ro[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=Ra(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=Ra(m,c,1),d=Ra(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1,a=o;for(;;a=o){let s=u[io(e,o)&t],c=s>>4;if(o+=s&15,o>f)throw Error(`unexpected EOF`);if(!s)throw Error(`invalid length/literal`);if(c<256)i[r++]=c;else if(c===256){a=o,u=void 0;break}else{let t=c-254;if(c>264){let n=c-257,r=ja[n];t=Z(e,o,(1<<r)-1)+Pa[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[io(e,o)&n],s=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Ia[s];if(s>3){let t=Ma[s];l+=io(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}o=a,u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;so(e,i,t,r)}return t?i:i.subarray(0,r)}let co;function lo(){if(!co){co=new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n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\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\nBe7JUK/FprJQZb+yRyHOPQGDo8C4C/5kwRTkSToCkXUYelZRpb0dRDaT0tnB8RbSg8V+1OTKocVFW9e0\nN5l7gAFvh8luHVtsG95K/dVVc3c+d+ZHg/uQld1vXTbbIpCoLNDC61wm2YP+92QgkjmPZIs0iXFIct+O\nUV6DCgd0whuqkKDy8/3gFyKK169KZBOHpWQxhlkurqZOXko+FqrY513F2HaIqY0kYkssissMbgh10vK2\nAavIMUAph81UhOvBziOdwaxxpIIO2ty9Byp2gJvmeJNWUIY0R1yInE7AfJIyvDUnxGi4whzcoEh7Uut1\nKIXDhuuQuhYOm0WrU2HZ2RxmfSiDwiDrxfSFTQ2RHSIwXrRadPbKl5FWpCov6Il50hT5lCPMUYM12sru\n7+0sFhlx4eFx05JOnFziQmxjpgCU1nPonlAdIDu2IAHhjLUFZD1afJMpoEhHzuQB7iJHDYfOQCXtisAw\nWV97hQIVtS9brJWUBVyP2rWqPKVh02WotAMF1oecly6fSVyCY0Qy/fKlBZVWiK0zZ2m42k/AIEnSWrHZ\ndZiKSUOvzlok5jvuk1Gve5O2LLOtBeZepAUynAILLWbIUQiXJtm73kTotW/lUDZvN0c7YAFLOd5ikJMb\nWj1/1W2m7Il9Zn3PwrGdzYY9y1GbjTtbPgrXqTTqmU15IEOQzzkKQniSDF9UtXJ2jsr0Eouc9lnepcU4\nItmbI0Ziq1Z+B/RpiC9BfSjHuM21CU376IILYfO4SzJ5EvSI2uY9F+woV4UyaCWZAe+RLrznvPuZRmUi\nUlCqBalOfAq6qhuDTcTVVQZcBP5SIN40o7Al5ejPRttZwtVIa4dAwcSQJAq+amueNzlU74u9EP5RQlIK\nnTrpigwj3ClaPYvlqURqAg65/lAMXtVVisxhSAfsbNkZgJIj417fh1e1wYlYDHHohF8n5jvAYqka6H6A\nJTQhBR8ITU/hU+zkS+V+2x22LvsusKKi7g5x0h/5wxUtGcy25fmcZiIN9tAVCZwWhj7jvWyfORCCGISn\nE/JYcL5UOQ503gsbqwSwr586OtEVMjE7He/NrPShEArAHhVIUkH4kooqPpyVvEhI5MaRV1pZToPcGMR2\nm+FJexPs8VtboSrsguE8Xbi/JUy+mVbEpOJjS1PoYwd+iwWvNKgyrIeQLA4RFclas3wrspBewpmX1OKV\nkEDUOeWkSKQqIkLAiJhxSkSC/GD7btUxC4paueZlzWpxXsm3CIn9EM2wbSKVZ26pZPYxaWS7VDZSsymP\nLW5QEBOCLLNJ/WmcjgHhbCkCnSKWmbTNErDGJsK+fPdvQXvWgm05cTZT+etNciZpE+ck9xDikZ3n2i2y\nejtFW0emluZlEvUpW+4bJXUIp2GPpo0uoNcyL6a5BNYcCdXhZLBTsWUKQPBu0kdNSHLRkn4D5k4Sk8QU\nG1E32nX8ihwPT+pyXeo4bAsZF61kWwH7YDQYHC4C4xPaUZw7GWGoN1nyPZU/QixbWye0bGMqEGBVgIJq\nn8gEBKEgGoRW23Ltda/nY//kBN253DxuQkd8Iq6CzwNXL2PBYAIg25qettrvcraiC362XK7mENVKHckF\nAzDQtXv2Z3C8uQPT7oufp+wVDGeUmHE5Iz+DMdPsTjwPVwZmUof81WxOAc3QaJ0iE/cEILypm6RcleSc\nHYoSlPEm5EcJgBO9KvQ5IDABTCD+yGmbTWsJ8YI+4cZmlOCQOIRVKGWGXouJy7CBFB7HLJObulb3NotQ\n2N4pFqIIvlE1gZMiiJTaKVqjpG686H2I8XlNZuztDlgTkGwMHslqxUqegHC1im1tURG7iGPFCqLA6yi0\n7Me72WKBD3RVJq7IthCvXW1bTkXEeZqwYtive7WTVu/NgPbFvnw5J5F9fMxlM3QyZRW5ipLMoipRvmJe\nE38bujMw90NEgEyaUJCCuTpleybOaiPZDqlyAM335VY9a7DWCkUTe3WkSuCr6HgCAInAExXSOiTnqR2p\nofr0/0O2nxOEjehIFH2whRGUCOwh6bRlrZxUFaQpnE1vq4SOWZgePP42KX46WFvOmduZAwV6op8j4L+E\nfh4JbbnQQMHKyEG9j3MOIMcmV7WvZvJDQpa7/5FoA85XbqFbSXyeyMJgMkjTPKab3WdmalYlVdF6kFCu\n/EFtxNCCai0hgJCJON7p0zmnwpIOxJneVFKi3fLiA4lsi/Mnm7C2J1ZRE979eskIQVCDqD6P6eRblfbw\nwBbP5ENS9rh1SYwWSyZRK1sxbJgREQsgmdTlsrkacgWHxsNJUDLrd6P8CHVhQGPzo63uZ8ShhWXBsYKu\nnIs3ZPLsjU6FkPtyv127WB4923SyHop5c6tp1emdwqThx/6cZNN79RGxpHz2RgWQ3uSeQYYV/mpu+2fC\ndpQ1ag804Th9sQeX2gGBAel2Yfgwi5ZbaasaqNooFFZIRwn4WjrD8ufou40awf8kMjQJ15eeNKzktKsJ\nUemaMjmVpfTCVY9wBS/kDNsy5xcTpBW1SaJ+B3HHIHXIhbQ2eqWtsgvt8UMJQmwWo714pI7N28GV8jeJ\nXgwfvZWfwobvhfwYFnGCshiPGZPZHjtBKR0vnQDZ9m7NlmHWS4mWao2EkyVXZE44yzRYRWA2bcaLiaNJ\nkVs1dF9S9Ks3KLv7zYI0a5ja7W2cWRJe6qmcw1L2JHTpTBQJLuGQIcozUa5Q3TzzKJOVivFivDeqigQE\nn9ot91Td9pCgFFYAUpPTRQ3jIiPwo88eCoIOQ0Duo3RRCb4Aj+coMG2y+QJzGRwbB9EnsGhpG0mCrS9m\nnIylnPcwyapZ4bAggvZoNTSLMheHLL8W2h3YCNI2CEa3I4XV6vQOLDsiucMfss6te+Hwcoft9+1F0C3g\nT4ZuTf7YzbKHfhhHHbnynYyzux4sHnjwULHvvkN3f9VF4mV5jliSaeH3G7veXh2hDlVtobY2BTfywEAA\nb8esPNMqQfcmbUQGe1/SDBg0mYtguxL0uTZDC8+lBzX9c/2ZPo2FMCxa6LeouMEybqrFnL3Y7sg2cRaz\nyhR75LmGAmvSdxlR+K/NEPj5orNcPevfWSmtF8riftuZJ+P+YNgcNovv8ObNV3v6oz/hT2l4/fXLVPHy\nNAQhpz0s1bVWfEt5kAQJRcP5h5dkbCuelZsr9fqYq+OuAc5M1Ia9Y664o+yqNr0H1+pNUFSYozCTIyq2\nu4ZE5k9EQkU+wh7HZrsfkyuC2CpYzo2IJGLlst1r4Dl4fycnX+FjFR/1OyzlwbnlvfANf/t39/32l+6x\n/y1NpUbip00O804WptJA396RL8v5JpMGmt031RN7i755FfuGw3ICksFUrGfqxFn8GrDBozHLZUzmOsu5\nJsXU3Zf33sGZYXtnNbqj8OpTbiPPFXnwfqlXZ6okLOyZKhdmkqLYq0csreRPpPSHCgh1ipmpAHoq26rs\nGLpMzDYIcUZJCs8w5BpF82z0vD90MRWskJxE6PJnWvMIfrTCJd3J/FQcu9ifp/AajVQ0JjiSigLt3Jn3\n/UMQdSpUCYMilX4wILkC46lIcj5Y8xttUa+p+ATea40YdXJi0pYtc1mKiq0dE97xqvdSO1uPkM3WHllT\nK2BGMbbGrdOpfR07faYlWEylVnyTxAYVXMS0/nKFB9t58nTEzqwWnI37nW1NCbvalKs7szSVksiUesF7\n8CoO+t6SpphnZkgzSwxynkfJZqjbWBIY0DsWi4eb+bpb7LUZ31ZX2LXrtztT22khPtR+czYHALEzeh7B\nybXcGC2mMiy7R3k4BNV1raEpmo05kqq4bHH2bPrsmX+4yZZOVugVj6XtLTLjZNvdrX1r9uh8Vn9sVib7\nqIt/hsspboWpVB7Ic7lzxVTUZP8jlZ09UWvOU+d/gCJOg8026wQbBck/miR0rKWJF9zx2akQGJQH2wpZ\nmT5eSo4EF65NzTHpxee6Qz1xh+sP2Q40swQVYVtAyV9dnrqM1010h2Z2KkW+bWoLW57KKLXsSrQ1q9iH\noz6nJy9L2DliQx6b871ntRyuUKLKtpVuNTPlBcdzMlOwc2EqYJzVtVMhyGwnWppKyIajqOoph+r/fv0D\nu/Uf1v/93SdGCv80biT7wmOJyj1f3DWVWphK4yzRYHR1oqobuX1YH51i6nCamXJ2i2rVLN+mLiUNLGs2\nIlWt2gX6c2nKn6FSC3VlwyCTCY7IaE2/NEpiTkUbCvfvPZGtmHLsbh5L91HpTDmuU+G3wkuA+Ug37Ruj\nEKveiU0c2AtMxCJyC+5A+P4SoAqhNzKtndgVUWdLL3C6Jea1l2y1g7U/GLWOGSZq8gdoUZvXB2UTBw2o\nomakyVszE7Muad4Tb9BmbNDQTOjOfbK24Pu+PPVUZHV+zJ1NJwn9v6Wpo7mYMmdUTy7aQ98hyR1wx3S6\ndy3DNyW12x2FyifhB4gnp/WmytXLVIxKjhnDHXiF8TVIt9RQtuEiz6LVNj2m7JDtU6u4yCrNMoQSezUu\nun1q3Xq1Zz9NppLN0k4bho4+a7ylxEQWkoArWeRaeFnRjxR7WImjxFe4Fm7upUH3I54UplnYVNrBYCXX\naXttSy0gwpIVxS5QXhJAoWDQVqkqCe9e5JbxFO6mmPIli8Up/FKm1MAVkIGemlYdiugBwANSIetMu92m\nUatVRottamfPSvd9/uyoi6kJM2WXAxrlQtFoIXX7WYoSczDSwFJ7GlY8h30fYQ+mHPkfol5ccstV3TH6\nDSoqnLiMmvJ7yZPNRPF2bx3LdDQ8Wuh63ggPSGLC1+226QfM46TYIG0v6nmkx4N8cgebKJ4gju2Uo5cC\nxAraZTqfhVRAMj6tazN5tC9FYbgXTIVzp5o5mp1C4gm2QroteLZthI1zMFS9saqosZGCOPnqa6pI/alf\ndmdqgp7nSX3tzHEPG7hsvrv9Wd1B7/k2LzszldLMyhIWKuDBjB1TLy2PFnuZh2BS3joJ5hMFotSw52J8\nSSNQtGclq0gFvaW2LhMLkSCMhNq2WAHfgHnaAl3KrXpUxrrdPpPhjRpXpgxusdAcY6VJj91/3712+ny1\nokQJ85AJptZgR+tG7XZaVqk/pxImTTMerqlCSrLkkpYakAO2ABm7W518w87O1qNPqeiQnM8MvQNTdnl4\nWaluQVa5T9WEQp2ckWTv4qp7V1txPtZtFaHd/VP+kU5RHGYYNS6lVOptaiavZuo69skpp3V7vaYi1yx8\ntQa9aNUdQMuAHKtTGj7h4jiablE/4P2pOeGyaoM2n4V43FaVjfu+VqnC7jIztb3Faa9dgP2SzpXZqeU/\nBdgja7+FAqmw9WhDxS6UVYsdemE5n2jFFESS62g8BOjTV1Wrm7Polufa2tq3Z+ZnpjeKjVRQhtHLVHsW\nKaqpic3ES9qXaEGkgJ17iuERtXXF7SpTqQKmuFvs7lRTVrLajdYjsu1H1D+xQ28QyUO8tDzlQk9F1HZ6\n9bF2L4g8g2fgXGCMZ2PgthiRaAuC292TiBzvmWVj7ZOy1QPDyVqNyZLzowcLHgGGjarIrsvseqjU5FAD\n+5HjJYrMWJrZPjMVI1c1r1QeJ8E7uStm7bQ104bcfUYiheJIh6NeXEEGv1cm8b2nvSaKsHWm8BZZ5doC\nhy33rIjYe+nDvZ3+oFOo0FuUXj5wYM7sX2sXHXm0pS0FHGHYeojyTW3ylCOWoxUFZk3+ZskgQyA0rF+y\narFJxC2Uu7x0t6zDKkty5Wp6drR7yrt2BaZWKbAoUx0GooGTLMxg4AVo2t6X3yYvIPPx+GPqbMTmkVl5\nrRfFfaItVG6WQiuTLfuMSTvPqtJXSwUeA5+aVahJ5xUjWK5varPAT+Ym+X+tGmgWVIRlHJ2uWnqDIhNM\nc2iyr5UomurLrMhPdEVjAveR+TkbrPK6qtLZKkBfFUmffNKi2dMTYUtmiaepPWRLvnJUAt227fN3b8ub\nZ8eW9e4ULDAStG6fedbCF8VU8Hw1dgEl5Kbw+XOtRhYgf1P++9IUhtxW2FZzeLABbbzmsE33PJbw4Y/B\n/ZeaxofXwF1u/0rWfaazUG/pL7LTyUcnz/sGVQiCgZ+/d4088nedI389Z6Xbu38hLvr/+D0oALTX/OiZ\nDy9SY0AqCNkn7f3nXHuBegP867rY8c7yzu/wirUAfPCr5Kdnygv2V3tNqBGcmNICyDjwH32XqiPQc8A1\nL1LvQBxzaCOcSNd4nzz0J1KvUE2CvfE++fB/Snb7RTLJn/NeuUGVgatT3H2oBlwmG/19akq8PPV8YOo/\nm3QZTlAL4u2PHsXdWpUDfNKZ/RecGX+d/Hq0533eNd0Bo5T1xGX+vETuu38vvffehz/mp9+lqsEFZ6M9\nfuvsrTc/fir99nQwhMjiukIml/OpWnabWHOJx/YWeUevkU0WjLvgGb1in7lif708xeISn+rsrcsZO+n1\n/JNsjV3TWVWviE3lvCdw/N6w7z3m750kZ0pXuXLrOthd/gwnwAGzTz7p33uL7LEzU0y2aAsYbNGWV26d\nJ//tLedsncgYZK9M/XWWz/s0eIP46+OTLVcrOGB+v/NkjL2ja7Inz9q/15zJ9TRYcH4/8dHO2VWu2XfF\nYXvMOWJnQzXH+/PJjM/2CniI7d3zZ7A7nQV/Lb13XXxAFEUze1CAmuFiKoSpkygqvfiB35mO6mYlhbGd\nevmVIMFgu8OG5rlS5Fy+1RbMW/qt7mCVmlQMPrqyp22JFbJES9MB46nMnFm+01v5dHKnaQNh6xXSelMh\n3RmCSFZRmHaVUNtIPcHPB3RR8cOUrMwTN01EdrxVHt1Q3rtTZNZeOlyg0ylQ4sz04ReXivh4G0ag8zwV\n2qYvmvlrOxanXNUp07+zvGM6C7cyldNpn3d1MDhcfy6CuPBt9NU3ZTvv2bWY1xCxC0Qdc7/U/HSyA8ds\n5h1Nob5mZvLksZ2dS9OjkqXfcOXOFLag0/I2+G5bS5B/ehI15pU8thSW7CxPRQ2nra8lc3T1+aODYbeZ\ni2xtoXStF/COG+UVH+y1hWlrzVp1tOr12rIFRa7ivn06mOG94sWwZ7Kq7WHSePRX1o2Av14x1o29xFqZ\ncnj2TKeqlorpVHwkA9x6+TJr3idJ3ukQ5xc982qz8SHr7kkrNKdmtGkL8IE8DRZBIE7ktpZ3p5haKy3c\nTDMeTm1rUz44xOodHCv2b4yHqxtZ4WJ8eNrvJb4rWzwCsmwQamZG3Ld3zOaWlsY6HrdJOFZd2qdZbGe4\n3APMChCml5am8MsZ1GM87M0yxty6pM3nvJ9Iy8kcnmJX9pNXmwWs2jQF75v5PZkkID7fei4KhBVTSRXG\njdr+C3aVez4toLcAYnJ6N1s+mmpac6pQCvUbEC/HpfdmNbwzoz+82dD+9ZLIZpiGpqT7nrmQexZNwru5\nRrFwaKnsC6IpU3m2KA8+bt2BIlRyGXLKw5BF7tvZiOYIKsZher1yK22U5ES20ddUu1LvquiMI2ZXJlkd\neY0glrNuRLTzuqrTa2tgq1pqQFrHAjGU07zTe6c3RonAJ78wC5OFK5vFmb7WV6lFe0IM3vL0FpSDHBkK\nHWw9NBxsleuOtkk1mHnlrFhAEYSdRMiQrJy58ut9QEKrPuI/BxEvtWds88660QHmpdKotFsVt8KMGHvE\n5qz82COhOjmNZ5Fn2cb7pzjU1u5pdI/iuQlOl5NdfLFnWfCpTXT7jDn4eSmrNFe1yTAn4nhJrDLNULck\n9tRNkYOM44gRp3OxmIbhYGlkNXekfFjMShNxR6oyqGKG7ZGq4oc5+AubW+KjYkVT7uMsZTok0JRUgJ4N\nRY7zmd7UxdD/+Y4rw0Cu5EzICiVtE2mkXA0ZkNB1wYcvumLV6RdcxsQVfn4UGikfUAzknMvm+LtXXIXJ\nVV/yViVVmR+EsFISFQmtLdw3Pu8aStbUp/iV86FC80EIy1zLtGWszY9CYwRf+TGv/BPKnpzOVKdeDKmc\n5/3KfqmXQjNHSiwvZJf9GZVhngk1lTPRjKQPIwWk1+LdN6ZEh1z5JJR/klBYGhTvydMu6+SSXCf41hsh\n+fJmfP1kaLy8lmnghCQUbvTn0SrdVxov70TjXwyZsqdC1+g035Ls1Une8UleWYph3wlBp7MhovUKf/9J\n6BHl8i9SK/pZKMA8y57RlV+I+57iPHyW7byBf1+lnJerDF11CR38fjr68LlQptITnYv580M0BpeSGthr\nvNTVGMTXfGL7I1yL542e9Mn2LL+SlK9eD7GjD0JG6XJ03el43tcoJfRSfPdMXOdKjJHmRtKRey0m7emQ\nJHoxVIDOZipn78Rk1i2OxwpK8lNJRed0rKYTsRs8kY3CjVAEkr7Qyy49hA8/HyP+ZqgSnYm18KhfytfR\nd+KCL7Gf035yst0ivDPVpB/FbA9dL7+ytH0uxodjxnpPJtGw6Dp87Hn/Ct6SZFNoeeHPN+NGL8bWBBWp\nYdP8Tl5jY+doOsvDl3Mtd/fuYLAhAzltcM8sfQ6GUUzxynr18ue84pFzRudtL+el5lftEDrcZraK6fNk\n5+dM2pm4fvKry2mXfcfi53JDQC93zdyRgbKn+Jyt2uKTaA7tCT12D8UWdwqXDLp2HyijqOsYVvUSI7Go\nkQaJgGqvEHitt/A5z28GcIy83liSdYnas90u4XP30feohgk/LEJs0XxuABY+FytwDWSzTJuJXWGzM21C\n7h5ROHxv5xvI3B/uLFOTpmiRlxnaG3C8xZnPRQzmiulsfkkTW9Ya+JKfc9aX0v09w7j4uQ4QTqE1VYnV\nyemZxTTiKXN+xMvM6nDBCgpXM3zN5ONS/6Gz3PmcRzVTFFNpVVx493/KiB2eb7qrWivNDpsVoStJqBR3\nTh5RVXDXq4dw0LdGG/b+t9B/3zoC+GrmGma/CujyOT8kw8AC59HkuuD4wkFlnVJJm7zesDg4Wj5uJ+5x\npEYyIKcoI7gme6E/kK3YWZar0mIlc4ojx7uYxoNOz65du3x97DTzsETBD5E0QXlRfCjzoyk6Quc/q62H\nWqyrmMGrcsM70w7/zntIoGWGuWwG/bnPLYdtzZ2TQ+U6Mv6zzY4/2vVfP2faLs1/7oV2JihAdgeb9f/V\ndXW/TZ5X/LqW+B/euqqSaHEMo5pW4rgKga5MbUFdUDvtYnJsJxicOPPrkETVpIUApe0orVRGhaaWrrSk\nGdAUmuFQQqTtHpE7LuFm0v6LPefrec7zgZBCYr+fz+c5v/M7vzMwwH7DgIqPYQMyKGRBQMfvY177PPoe\nWVahXwIfpMdwhh2/U8H6YjXGqaj10KPLj342/+492n609ej+o5u750ANGDFzioPcR6R7BxHwPiLwd1Dr\nGBF28//nGKkAJB/1fv14B2v+3qNv8ewvUCEY9IS3MSbwJUYRNvFbiliQojJqPuP//vEagWc9ZdbA7e+e\nxzgGRAc2OTqxyVGBh/gEl3bPsQ4vqUZDDGYH9YZXSc3WPD+/3+4n/H7bGC9BpWxzxqbfHnj0Nj4rtc9m\nEB2RqICvice6ZArXPg9IN+PKCvGHnxa//lFFElZBqe3JGp9/98kWaObR9Z7cApUyvIPTJqOzPrJafRdQ\n702+x/uj3t66xBE8nbNvzROcpU+CZ3Sad3y/bmeq09PFWmwsn2K5RUy99ATLKuEehWscktx4pQsnVcUK\nQwFbpmM2V9T6UXM/p3VYAYrhRKroSiGY/E2IAZJe6FciwSNXZ46RNUZyxRstBsub485Zhv4ihESbbsHH\nqvOdOZzCOJmlumd2GEpKds2KOOIpN+wpeEgL5CpX/Mgo7DqCOXMTemYLUOLtKdwxRSmPY//XIBItPdIv\nwur1tZLMEYXQ+uC11NEBOXdBrJmx4jgUzRvO3mi2T2O+6zD2i46COAiDT3ZJ7Oj5m82GOf/mB0Aj1Ypn\noUHVp4CbDGXQAN20OUBRoGKgwmzoseJCb7r062K14FialpB4ullrK1gSYCzqzSxvIjoe7nZZaA4h0Udw\nPeSY6HQqeHRgcExTySXaBvzMGyQkqKRxxNqEet+sdadbS8Vq0LV7CpBq0yw1oC47CWMQFgxvBhsqMBmn\nM8JRJ4zFZTatWg5V5ZvZqVYbmDVdkBIMTEfiGtV7dsRYPSQB4Y6d6CCElY1zxVyp4GFfn2MCbfsuB5tz\nJ2tQuQTU3U6ZBzHfNktgYkGrzdRmm7x+uEwec/C7VACKK2hJDaVMjINj3Q6SsH5j/pibgoxhLYRDVB+W\nnkB1JGS8KCkwokUhO0VXU2VlN4mNiMvh8HHB1ISCKeQQZ93bpQ8xxbwsqWm2PbisFNhYiD7mfioUMIPI\nQnUwJkpILEBaHqRKtOq5p/yFmCmTval4U22mw/N4j0zkPaFZUAD+WKYLPZsxM5zpFcGThYK7vNUyrhAk\n8mbvYiQzt0aJrIWOhsbjQBkztLR5+mHYHh2iw0GRJATPoawTdSILVYowhaIy+S7EiDHt6kgVk2JIrbzT\ntlkxcKCX/C2A5lFjEVuxE85ydbXPW1B/UfgoCAFzro29qC6BjfnQs8jJa/VsWoEuxEtMq64ZJlxhk0iL\nNmmlDBUcoe5a0w9KjYeLtHcC7Ip1KIoEvGcZ2r3FTsnYvF1bmPHQApfDA6YWVCVsyAdwuW6r0/ATGTJq\nIN+xYn08jtu1lz1RQp77TnkStl0sTNhV64enXwen0OghvByb2tPchLiFdUxqUzkIJxifLFyELch9QPDw\nUeWVkqM0erK2ZOb7VM54QnnfiAtRSbYRdYbCucs8rbX5gyYIrPIlFCIZK5r1/HStbtwvZBHD9tccLL68\nf0Kl+Q1Ez1w9quq+YRHNYeUJkq30y4ojT8peqkQ3jFNc6x0wG5rZt4CPJpMwmvuFyCDL4wbS1hNp52TR\nyHPsTKnwWMxCQ60YeZRK14xvD4/1SrndMesyZ0821AClAekyAcUqQDW79rIS45A6iS4PazQyAnWgnPhu\nnrghHg85FLXGMoosUDaaHwqCfdjaF9ZUzbyACvm6KDlGJVTRY6+8eOjoxOTvjx3OpCu0aA/9LFZDTMrr\nYERVfL4f3GwsMjSATydimwttyCoNFhezVvhZT9Cvb9S65nkbGtFxRhVnTZOpDPm1AgYcXYLSXnrbZqv8\nVHMZuQJmxvBbqJGmPAXOz5xGpYm2yiHWI5zM8ywy2/2cDPioEm00I9Hu7edS4IrehnHSVsF1YK7iqLeq\nH2AT+pmNohzl8k5kU0P6AO5sniIVPrPN2bHmhc5wowQ6b4qCwVj32aJwpM8whn6vZSHGNBk9c+TX9By/\nGICoZrfTZREfsxG3F3IUkPCSLxF90dXZyNszQ41ShK32zcSRcYabXjdjZarTOWW5AU4pY45GTs3GbiXv\n2i3KmPbanFXZ+3Cd8V4b8LM6VYyl4Ld5E4GPhqUvuLZwz3HVaRXImfF/tNdTVSOr0RI5PpcFoXYldpKJ\n3Cc4MAtdZxJMdOZoSBszgZxhGC0zxspZyDkVLz8GZF/Q7ZhxAXHNqmbzBFV8FMGASAKzLjtHR0IzdAhq\njZM15NTYMYa4lwcIGyM/ZwGiTFRPlSYsKd2Y6+JCawPzJ0iYVBTKMZ+RmRIWbj0EyCPaUJKLbWWBM8pQ\nFVkjnakkWaROkZiMSK2bAHhkp6tRNbgOX50SsOooG0ID2AyPLkr8gsCh0M48p8BOK4s2gnUDzdkhzo8Z\nX5YGk0Vuss/v1isATv5F02p5oIVg5inznRRD5WAHVl4QhGH1vDzIITMunaIE8sgMcuHBMKccSujfTg+S\nP3KptikSTKDPo3Tf0U/ws39xFY38THtvUBBYGpk/MR9w7czoixbaglPHFOmjGohzdXCJYF/XR2mhrKPP\nMYezRAjK2fGTOsMB313odUW6eXFo1Mn4tEhftulR7bCJcVPNtEQcp2khJEPaantHsyAY5euT4DjEHRZ9\nvfJSCRBhdRPuxyxy5/W3hKLZ8IP9hdZMfJ75Fmq6PP5s96PHPwN3GeuFUZ2y8JPrVAUMmeTnAd/lym73\ngypsUtWOMU7/k91LjKre5QpvgKsCrruDfzMy/PhHPHOHWOXIp36AvxHKu2HuR2jsPWSVM8aMDG/mdfPd\nCVH+Gev6UV0zujvwvu/zWwTPA5gyIrjbjBj/dfcTZJ6fQ958n7FeqGz3I6PJ28j+3sYabZt4f3pTOIZ4\n+PLJfXoLrtIGd/8Uj7+PNeW2ocofxlsvCmFgQwKyFzCiuoKx6TsY7aX4siUwqLpjXMLpnJzynYRrtyS8\nflGi1RTS/VrVuvpOMQEo3q0rcAk7Aj6XsyDufBV//4pZHFxLiBgXV1Xw94wKu6/hM6yo6j8P1XtZtox9\ni75c5zM85Y7UPlsTcsiG8Ar+gtff4Lg5cwmIV0NlcW4JReSBvOYFPEWfRS2j2pnbcF1OUVV4HMfgosTT\nNbliRzE31qWRP5SO2FL8HNWGjkBiuQSaCvJQul7YCI6N83dHIfBq3q0oFoqtNvUB8jGoxXakd+4JKUKR\nizymx0WpgbWOv+wgw+Qh129yT3tGqukRe+SqT025IwffwBPPuDd191qXHrmMZ91mggoX46MBdkPa5LZU\n4KKmuy5ltqSmG9/9tjd64ZjzyJ9Zx88vCY3hYyEFUZE7ep6/qfY/L4/3gYxn2843mZfiaEUPZPSuyfRZ\nkxJUdowJ68Z9Qt20ptp5012HyCE8L9ZkxtnCW2v4hD+oYnBYMRD+vG2vE8eRvNwUl5Gyao5aw2yOdZvV\nINWM4Jgt8/8PXnUe94nUaQrjQ99znsgFjFD9hFEqujLktKxhxSJ+HqlxpD65i9GuszYydROfawWyObiO\nz43wXnjspvymHEqBYBb3j3S6M+V9r776ankJRXzARwhBIXR74dvRzIYCIhRGVJtUfY4iqLeI6vdYsTM9\nXdSSdizjNwrlNiBUL6R/Y7FEgFL2UpAfAmagDllxDMdaWS9ZY6EYeyS6oAd/VKhE8Zhy+fDbxUzfcBFE\nSxrN4+8cmYAU0zm0lviGJ43VTZc4EAaeQfsgjKnkdYvqZBaP03JWfNsstu5if9wzyPjGcddmYIUGiJYE\nKrDdCYgqJ/o2Bp6wJbCTKSj0WrWwGIVBXgtCb4itYKzfu1YWeawHYrylgGihV92jV4khqSyNlQRkdgXM\nyMn++MaX8kpIkKqDl3COemGZL2HgIHsP8Nfp2NLQ4TMBXO1TluFkJb4kQzSLYon7bJ4JInJmIsxMQT1v\nBgWMLz0DjJZoIrRmhVSlXJjxeq3RnCVcgpgjuUKShNWjvUp+/BEzaNiJOLh8pDHYagyRktxJIWaDSyxu\nhkh7DY2y4ozXt7GJXvD6mTCyaowYC1e56bJcmCaOhS9YA0PXdODQtRcBp5/xytHyqkEQrBhohWFouwNp\nz17hBwjFgfc/N9MDYcVDIxMj8bgvkQ6DaEEAsDGsS5OJuofzChsq3TpIG1IBM4E6OUMM4n+CP2YxADnb\nyv3ybJ3pSQHWhrMT7BTmMbo5YZax2alWTV2suWQGJIuicHLKQk7VCVS7MRDoRX8BrvFBu9r0NBRd6KkX\nQu45tzFPKwfeKYW4CAIXYAWOOwKXmGtoqiPPNBeFs962LhnAk/uoxC4Xm1PmnZuoLFKDYGO355IWabcD\nDMgG3YBnJLiijbaKCIJVuXidkV31yExl0hWAWBVeD5O3jT/s+gub0EtxquG6U6/N16QgiWi7+MCtN+Qg\nNYWG3PRCF8epWsdce1EVA8jvkHIWbikFCGzZtMEMCMCRsFncQRU/NPRe6fh4af7Eck5sB1ukBniAZkuF\nJUxGn8Wm6vBFHdh2g/IaLjiKywA2PPJG6B1zVuWwOBfnnFmLBqryaPiHgEgoddVFjSmYJhjOwH6sQ23B\nLghFQLu8vP/wy/sneIyZP4pDQ6MhIgU7pCdSKBi2GVZ/DPIeQ34t0CyDRRqpl3Gc7b0S6MgeMjNpcAgW\n7cnWrPktiyGYoretsGXhLCRn8wQJuViVzr6DMo1QqlZmF6/nctyAagM/dZb5xpaOo6J4CZOJEXq9PvXE\nQNJ3ZmlW3xSBynqLk6gxXIPtepmH3oRNjcQe0PXuZOHxyLd8I1+7g5N6Ap5zj2QrZrq1WeS/WAaELnAk\n5CV7Pce28BJr5bjEjh1vn38qVhIGjdqOrI3qxS/4aGrloKd+Va3Ai+ohLIpyegSiURdkYod8a2gXsc90\nJLmY2DcT1luR+rLn9WWesPz2FOLnq6YGPi8GUpAO6o+NJjYNpxjmCqbYylVSnaQFxQy4bIPmYBPn3yNY\nBZHPCvz0qklwXIzex1c/VlPvdKfVGNw7NFr0FMdtqnPsqrmYg1u6qwmT2+cf0m9BhjqSS4gDhTVHSfMO\n3lcpW8lkqMQgc52j2rBztFvT2LzDXh1EIaPES1jmNCjhODIPGq35NgmLWgWb3On6uPfFgRHw37JEG3Dw\nOhcbB+OLCfPRq3alTDevXBdpfEUeHZVSw2i3/U2XbpKqFGYE98LIirFxT9FIdGOrIcUieP2ypDMpiMRt\namv1qOM4ruW5R0GCNFIJsE9PA48IZJCboI6Uk2U3D/FOq3Q1aB1k50OotrIRUaeC7eyjRBdVs4QDiRwc\nIiUgcQiejcqX+XQIHJFYFsjxK1V1KrRXFls5cOkwmo7TUNKTYX0Jbu4nXtK8pPphTYwpthr0fvxC8IeN\nOtqomtogoEM6s2bkKsPLK5fIPTCdWF+Qj8lloZgfhGL6CzML/1nPs0GKrS8MiR7O7pXH27srGO3YwBhC\n8Nnjaxg1WEGNIIqNbIWxC2KYm3POYhTggcRTzPUkCuJiCNukGSTRB9DWic9lrnz42TWKopjrAoe9bzn6\nFA/ZtKo88fU+oeeFJ3ZaO+b+pA60gZ+hHo7omyDmdxMrr59nfO0nRgpXFXf8DH325BZ85u9Rxydfh7Uk\nJ+vLLJQqF8ZP3eVyrN6qI6MJZU3GsgEca7LYR8sOWFQBkkXoULh7435dTG0GiiPuliRrjRSUOYLTLZx+\nlZSRIl96Fo7LChElMGNxRTYjXDgDDfJW/ZS3yw2KZasM2z8rwVCxdIrZMTTdB3LtV2WRQQiNFRraaM1H\n23QPU1K8rYv+C9d2dWTw8yXQ/YTp+L6ZyiVO2yqkbFwSran64jW0eQVwhBxa0McGJkWh8mKp9AdfwGO8\n1YUnqRYSLZKyTBef9q897d952v8efm6dfdq/8rT/j2er3z5b/fTZ6rVnq1eerX7zbPXqs9Uv/nvrm//9\n83Obcr61Yv4akrjYhgQvKMrwNeL2H3IIjAM9ErXhjMuLEm6zWaVBBMeGJ2xQwGahrksSaJ+jkHCWDfz1\nVe6wzSy2ybNXVPgmCAh+LEnQOxLD+lIe75zkk26oIKPNGrbxyjVJ+NWBm5UoNfsyZ5hyUEzHs4I07euS\nzHuRk9a5TdYwf3ZHvlqXANllOXJHQn5fqdOpfc7gM+sP1yV718+C56fdUFHI6ypCZPudzvpGTrwtrWru\n/rVXuNR6wTGbEPgHyoxQaWnRsIf/2DsJLQgQW1G3kfwbXLBC/zK16xer4RpI0yWByy/NttWxbjEL5KVk\n9VSaNMqbMbtAwoZK2cPlaghpkFczkl65lcfpJr1eSN3qGvMvYfkM3FDOBlWru3LxSuXyu/snyuVDk4ey\n996YfOvNbN/I3sx3ugSRCRwelsoyj8s6Tei6QY6EaaiCt3vKKQ7J+K1p9N9xo6faMT84k/L/sqCx2KPF\nuwwEvTkQY1BIIPKvwP2aJbessYFfJCJQleSWWYBAz3DWA+VOePVhDL2prC+Vjubnkcs4Sy796Qngb2fW\nQEghRabnu61aibrAvHl3wThK/75XobYP50F7bO8o5aEr8+h95fjj0D6QgTJScqCeeOGFFJ5W60EF+fBJ\nYjwI3jj5Ful9tZlshrFu8nbNsZSxoq3xRic72DVGentIaS32UbeRuDx3kBMENvK/HH/H0528I9mYmHt5\nl9QjFacpcQXzKVzhEulDAsOHck/91TM7dvzgm0cmsuJcrzQZCBlA98WYygR8D2gM0850fJVWYrMQzuW6\n7dPLwaT5k9bOfaWed0Fl2k6+w4eUExaymY2jOgNSbS0IFfXeNpNshPJWDiL9Nbl+zNVO5vGYNVey7uzQ\nCPLhefDGNiyegGM43mti1BG/TiFdxrtVu4I26ivp3SJGrfCh1B6iJfcSnACcJemVMkZHsJFrI0lnJdms\ns6lwLLwmV4gKR4seJzhMXhnZuy+b9Hd/G3B8zj0TLgY+ZDEEUnkHS7w8hj3Hkm3YGxzI0vvCc9qr2Egb\nMTkwg9sJOkT8/jQ3KmnzBOLJyS9wLo3ELR3NZZ75gRlhN8fndGHhOc1ZSa3T8F7PabYqsjMvqRWKVy/i\nYEruPHv9jvnYZxalzUMH9iWulTvIaLTXEa5ZX8xVa61fFraX9QCIAKg5bh8rVRiy7m8o4pJl5O0ogZ8d\nvmbCnCfH5TJKTBFva0O4Wl+l/Ix13xO6KCJPD5H51fete+aO/R8EyzZRoN8BAA==`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);so(t,co)}return co}function Q(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}const uo=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],fo=uo.length;function po(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function mo(e,t,n,r,i){let a=lo(),{prefix:o}=uo[i],{suffix:s}=uo[i],c=uo[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)po(e,f);else if(c===11)for(;r>0;){let t=po(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const ho=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),go=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),_o=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),vo=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function yo(e,t){let n=new Uint8Array(t);return bo(new to(e),new no(n)),n}function bo(e,t){let n=0,r=0,i=0,a=0,o=[16,15,11,4],s=0,c=0,l=0,u=[new Ca(0,0),new Ca(0,0),new Ca(0,0)],d=128+Y.READ_SIZE,f=new Y(e);i=qa(f);let p=(1<<i)-16,m=1<<i,h=m-1,g=new Uint8Array(m+d+24),_=m,v=[],y=[];for(let e=0;e<3*Aa;e++)v[e]=new X(0,0),y[e]=new X(0,0);for(;!r;){let e=0,i=[1<<28,1<<28,1<<28],d=[0],b=[1,1,1],x=[0,1,0,1,0,1],S=[0],C=0;for(let e=0;e<3;e++)u[e].codes=[],u[e].htrees=new Uint32Array;f.readMoreInput();let w=Wa(f);if(e=w.meta_block_length,n+e>t.buffer.length){let r=new Uint8Array(n+e);r.set(t.buffer),t.buffer=r}if(r=w.input_end,w.is_metadata){for(Ja(f);e>0;--e)f.readMoreInput(),f.readBits(8);continue}if(e===0)continue;if(w.is_uncompressed){f.bit_pos_=f.bit_pos_+7&-8,Ga(t,e,n,g,h,f),n+=e;continue}for(let e=0;e<3;e++)b[e]=Ka(f)+1,b[e]>=2&&(ba(b[e]+2,v,e*Aa,f),ba(26,y,e*Aa,f),i[e]=Ya(y,e*Aa,f),S[e]=1);f.readMoreInput();let T=f.readBits(2),E=16+(f.readBits(4)<<T),D=(1<<T)-1,O=E+(48<<T),k=new Uint8Array(b[0]);for(let e=0;e<b[0];e++)f.readMoreInput(),k[e]=f.readBits(2)<<1;let[A,j]=Qa(b[0]<<6,f),[M,N]=Qa(b[2]<<2,f);u[0]=new Ca(256,A),u[1]=new Ca(704,b[1]),u[2]=new Ca(O,M);for(let e=0;e<3;++e)u[e].decode(f);let P=0,F=0,I=k[d[0]],ee=Za[I],te=Za[I+1],ne=u[1].htrees[0];for(;e>0;){let r;f.readMoreInput(),i[1]===0&&(Ua(b[1],v,1,d,x,S,f),i[1]=Ya(y,Aa,f),ne=u[1].htrees[d[1]]),i[1]--;let w=xa(u[1].codes,ne,f),O=w>>6;O>=2?(O-=2,r=-1):r=0;let A=Ea[Oa[O]+(w>>3&7)],M=A.offset+f.readBits(A.nbits),re=Da[ka[O]+(w&7)],L=re.offset+f.readBits(re.nbits);c=g[n-1&h],l=g[n-2&h];for(let e=0;e<M;e++){f.readMoreInput(),i[0]===0&&(Ua(b[0],v,0,d,x,S,f),i[0]=Ya(y,0,f),C=d[0]<<6,P=C,I=k[d[0]],ee=Za[I],te=Za[I+1]);let e=Xa[ee+c]|Xa[te+l],r=j[P+e];i[0]--,l=c,c=xa(u[0].codes,u[0].htrees[r],f),g[n&h]=c,(n&h)===h&&t.write(g,m),n++}if(e-=M,e<=0)break;if(r<0){f.readMoreInput(),i[2]===0&&(Ua(b[2],v,2,d,x,S,f),i[2]=Ya(y,2*Aa,f),F=d[2]<<2),i[2]--;let e=(L>4?3:L-2)&255,t=N[F+e];if(r=xa(u[2].codes,u[2].htrees[t],f),r>=E){r-=E;let e=r&D;r>>=T;let t=(r>>1)+1;r=E+((2+(r&1)<<t)-4+f.readBits(t)<<T)+e}}let ie=xo(r,o,s);if(ie<0)throw Error(`[BrotliDecompress] invalid distance`);a=n<p&&a!==p?n:p;let R=n&h;if(ie>a)if(L>=4&&L<=24){let r=_o[L],i=ie-a-1,o=vo[L],s=i&(1<<o)-1,c=i>>o;if(r+=s*L,c<fo){let i=mo(g,R,r,L,c);if(R+=i,n+=i,e-=i,R>=_){t.write(g,m);for(let e=0;e<R-_;e++)g[e]=g[_+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`);else{if(r>0&&(o[s&3]=ie,s++),L>e)throw Error(`Invalid backward reference`);for(let r=0;r<L;r++)g[n&h]=g[n-ie&h],(n&h)===h&&t.write(g,m),n++,e--}c=g[n-1&h],l=g[n-2&h]}n&=1073741823}t.write(g,n&h)}function xo(e,t,n){return e<16?(n+=ho[e],n&=3,t[n]+go[e]):e-16+1}function So(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||wo(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;wo(e,n,0)}return n}function Co(e,t){let n=new Uint8Array(t);return wo(e,n,0),n}function wo(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=(a&15)+4,l=c+240;for(;l===255;)c+=l=e[i++];let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const To={SNAPPY:ca(),GZIP:(e,t)=>so(e,new Uint8Array(t)),BROTLI:yo,ZSTD:e=>sa(e),LZ4:So,LZ4_RAW:Co},Eo=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),Do=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return Oo(n)}catch{return}},Oo=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(!(s===0||c===0)&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},ko=async e=>{let t=Eo(e),n=_r(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??Do(n.key_value_metadata),i=await Pi({file:t,compressors:To}),a=[],o=[];if(i.length>0){let e=Object.keys(i[0]).filter(e=>!/^__index_level_\\d+__$/.test(e)),t=Math.min(i.length,100);for(let n of e){let e=null;for(let r=0;r<t;r++){let t=i[r][n];if(t!=null){if(typeof t==`number`){e=`number`;break}if(typeof t==`string`){e=`string`;break}}}e===`number`?a.push(n):e===`string`&&o.push(n)}}let s=i.length,c={};for(let e of a)c[e]=new Float32Array(s);let l=new Map,u=new Map;for(let e of o)l.set(e,new Map),u.set(e,new Uint32Array(s));for(let e=0;e<s;e++){let t=i[e];for(let n of a){let r=t[n];c[n][e]=typeof r==`number`&&Number.isFinite(r)?r:0}for(let n of o){let r=String(t[n]??``),i=l.get(n),a=i.get(r);a===void 0&&(a=i.size,i.set(r,a)),u.get(n)[e]=a}}return{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},Ao=async e=>{let t=Nn(e)===`parquet`?await ko(e):null,n=t??kn(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:a}=l(t);return{name:e,values:t,min:r,max:i,range:a}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},jo=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,Mo=0,No=[],Po=new Map,Fo=new Map,Io=new Map,Lo=0;self.onmessage=async e=>{let n=e.data;if(n.type===`init`){$=n.gpuPort;return}if(n.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await Ao(n.buffer);Mo++,Lo=e.rowCount,No=e.columns.map(e=>e.name),Po=new Map,Fo=new Map;for(let t of e.columns)Po.set(t.name,t.min),Fo.set(t.name,t.range);Io=new Map;for(let t of e.categoricalColumns)Io.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let r={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.map(e=>e.name),categoricalLabels:t,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),embeddedConfig:e.embeddedConfig}};self.postMessage(r);let i=e.columns.map(e=>e.values),a=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),o=[...new Set(i.map(e=>e.buffer)),...a.map(e=>e.indices.buffer)],s={type:`data`,dataVersion:Mo,dims:e.columns.length,rows:e.rowCount,buffers:i,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),categoricalColumns:a};$.postMessage(s,o)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(n.type===`encodeColor`){if(!$)return;let{column:e,palette:t,theme:r,colorMap:l}=n,u=r===`light`,d=Io.get(e);if(d){let t;if(l)t=d.map(e=>l[e]??[128,128,128]);else{let e=u?o:a;t=d.length<=i.length?i:[...i,...Array(Math.ceil((d.length-i.length)/e.length)).fill(void 0).flatMap(()=>e)]}let n=jo(t),r={type:`setColorCategorical`,dataVersion:Mo,catColumnName:e,palette:n};$.postMessage(r,[n.buffer]);return}let f=No.indexOf(e);if(f>=0){let n=Po.get(e)??0,r=Fo.get(e)??1,i=t===`magma`?c:s,a=jo(u?[...i].reverse():i),o={type:`setColorContinuous`,dataVersion:Mo,columnIndex:f,min:n,range:r,colormap:a};$.postMessage(o,[a.buffer])}}if(n.type===`encodeColor2D`){if(!$)return;let{columnX:e,columnY:i,colormap:a}=n,o=No.indexOf(e),s=No.indexOf(i);if(o<0||s<0)return;let c=t[a]??0,l=r(c),u=[];l&&u.push(l.buffer);let d={type:`setColor2D`,dataVersion:Mo,columnIndexX:o,columnIndexY:s,minX:Po.get(e)??0,rangeX:Fo.get(e)??1,minY:Po.get(i)??0,rangeY:Fo.get(i)??1,lut:l,mapIndex:c};$.postMessage(d,u)}if(n.type===`selectByColumn`){if(!$||Lo===0)return;let{column:e,labelIndices:t,valueRanges:r}=n,i=Io.get(e);if(i&&t&&t.length>0){let n=new Uint32Array(i.length);for(let e of t)e<n.length&&(n[e]=1);let r={type:`selectCategorical`,dataVersion:Mo,catColumnName:e,selectedLabels:n};$.postMessage(r,[n.buffer]);return}let a=No.indexOf(e);if(a>=0&&r&&r.length>=2){let e={type:`selectContinuous`,dataVersion:Mo,columnIndex:a,ranges:r};$.postMessage(e,[r.buffer]);return}}};", t = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", e], { type: "text/javascript;charset=utf-8" });
|
|
3
3
|
function n(n) {
|
|
4
4
|
let r;
|
|
5
5
|
try {
|
|
@@ -20,7 +20,7 @@ function n(n) {
|
|
|
20
20
|
}
|
|
21
21
|
//#endregion
|
|
22
22
|
//#region src/gpu/worker.ts?worker&inline
|
|
23
|
-
var r = "var e=`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - min) / range - 0.5\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range - 0.5;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const t=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},n=t=>{let n=t.createShaderModule({label:`compute-pca`,code:e}),r=t.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),i=t.createPipelineLayout({bindGroupLayouts:[r]});return{partialPipeline:t.createComputePipeline({label:`pca-partial-pipeline`,layout:i,compute:{module:n,entryPoint:`reduce_partial`}}),finalPipeline:t.createComputePipeline({label:`pca-final-pipeline`,layout:i,compute:{module:n,entryPoint:`final_reduce`}}),bindGroupLayout:r,paramsBuffer:t.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},r=async(e,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,e.queue.writeBuffer(n.paramsBuffer,0,u);let f=e.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=e.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return t(x,s)},i=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},a=2e6,o=(e,t,n,r,i,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(i>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<i;e+=a){let t=Math.min(a,i-e);s.draw(4,t,0,e)}}s.end()},s=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},c=1e-10,l=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,s=n*n+i*i,l=a+s,u=a*s-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(o)>c){let e=f-s,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-s,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>c&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>c&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=c&&h>c?(v[0]=-v[3],v[2]=v[1]):h<=c&&m>c?(v[1]=-v[2],v[3]=v[0]):m<=c&&h<=c&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},u=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},d=(e,t,n,r,i,a,o)=>{let s=o*o,c=s*o,l=.5*(-o+2*s-c),d=.5*(2-5*s+3*c),f=.5*(o+4*s-3*c),p=.5*(-s+c);for(let o=0;o<a*2;o++)e[o]=l*t[o]+d*n[o]+f*r[o]+p*i[o];return u(e,a),e},f=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=l(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},p=(e,t)=>{let n=e.length,r=new Float32Array(n+1);r[0]=0;let i=new Float32Array(t*2),a=new Float32Array(t*2);for(let o=0;o<n;o++){let s=(o-1+n)%n,c=o,l=(o+1)%n,u=(o+2)%n,p=0;d(i,e[s],e[c],e[l],e[u],t,0);for(let n=1;n<=8;n++){let r=n/8;d(a,e[s],e[c],e[l],e[u],t,r),p+=f(i,a,t),i.set(a)}r[o+1]=r[o]+p}let o=r[n];if(o>1e-10)for(let e=1;e<=n;e++)r[e]=r[e]/o;return r},m=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},h=(e,t,n,r,i)=>{let a=t.length,{segment:o,localT:s}=m(n,i),c=(o-1+a)%a,l=o,u=(o+1)%a,f=(o+2)%a;return d(e,t[c],t[l],t[u],t[f],r,s)};var g=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,_=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const v=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,_),selectCategorical:r(`select-categorical`,g),bindGroupLayout:t,paramsBuffer:i}},y=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),b=(e,t,n,r,i)=>{let a=new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},x=(e,t,n,r)=>{let i=new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},S=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var C=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Zooming out compresses points → more overlap → must reduce opacity.\n let z = camera.zoom * camera.inset_zoom;\n let eff_opacity = uni.opacity * z * z;\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,w=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const T={pointSize:.012,opacity:.7,color:[.25,.5,.9]},E={useSelectionMask:!1},D={mode:0,columnOffset:0,min:0,range:1,numStops:0},O={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},k=new ArrayBuffer(80),A=new Float32Array(k),j=new Uint32Array(k),M=new Float32Array(80/4),ee=new Float32Array(4),te=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:C}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return ne(e,c,T,E,D),re(e,l,O),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},ne=(e,t,n,r=E,i=D,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{A[0]=n.pointSize,A[1]=n.opacity,j[2]=i.mode,A[3]=r.useSelectionMask?1:0,A[4]=n.color[0],A[5]=n.color[1],A[6]=n.color[2],A[7]=1,A[8]=a?1:0,j[9]=o,j[10]=s,j[11]=u,A[12]=c,A[13]=l,j[14]=i.columnOffset,A[15]=i.min,A[16]=i.range,j[17]=i.numStops,A[18]=d,A[19]=0,e.queue.writeBuffer(t,0,k)},re=(e,t,n)=>{M[0]=n.panX,M[1]=n.panY,M[2]=n.zoom,M[3]=n.aspect,M[4]=n.viewportHeight,M[5]=n.insetOffsetY,M[6]=n.insetZoom,M[7]=n.use3d?1:0;let r=n.rotation;M[8]=r?r[0]:1,M[9]=r?r[1]:0,M[10]=r?r[2]:0,M[11]=0,M[12]=r?r[3]:0,M[13]=r?r[4]:1,M[14]=r?r[5]:0,M[15]=0,M[16]=r?r[6]:0,M[17]=r?r[7]:0,M[18]=r?r[8]:1,M[19]=0,e.queue.writeBuffer(t,0,M)},ie=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),ae=(e,t,n)=>{ee[0]=n,e.queue.writeBuffer(t,0,ee,0,1)},oe=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:w}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},se=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var ce=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [min, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: (raw - min) / range - 0.5) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(min, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n // Center to [-0.5, 0.5]\n let v = (raw - np.x) / range - 0.5;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const le=e=>{let t=e.createShaderModule({label:`compute-projection`,code:ce}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ue=(e,t,n,r,i)=>{let a=new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},de=(e,t,n,r)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:n*r*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:r*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),fe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),pe=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var me=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range - 0.5;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const he=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:me}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ge=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),_e(b,c,s,a)},_e=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;N(s,a,o,t),P(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}N(c,a,o,t),P(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},N=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},P=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let F=null,I=[],L=null;const R=(e,t)=>{self.postMessage(e,t??[])},ve=(e,t,n,r)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let i=t*r,a=n*r,o=i*a*.5/e,s=Math.sqrt(o/Math.PI),c=r,l,u;return s>=c?(l=s,u=1):(l=c,u=Math.max(.01,o/(Math.PI*c*c))),{pointSize:2*l/a,opacity:u}},z=(e,t)=>e*F.dpr/t,ye=e=>{let{style:t,numPoints:n,dpr:r}=F;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:z(t.pointSize,e.height),opacity:t.opacity,color:t.color};let i=ve(n,e.width/r,e.height/r,r);return{pointSize:t.pointSize===`auto`?i.pointSize:z(t.pointSize,e.height),opacity:t.opacity===`auto`?i.opacity:t.opacity,color:t.color}},B=()=>{let{device:e,mainView:t,tonemapPipeline:n}=F,{width:r,height:i}=t.canvas,a=F.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();F.mainHdrTexture=o,F.mainHdrTextureView=s,F.mainTonemapBindGroup=se(e,n.bindGroupLayout,s,n.paramsBuffer)},be=()=>{if(!F.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=F,{width:n,height:r}=F.previewGpuCanvas,i=F.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();F.previewHdrTexture=a,F.previewHdrTextureView=o,F.previewTonemapBindGroup=se(e,t.bindGroupLayout,o,t.paramsBuffer)},xe=e=>Math.ceil(e/32)*4,Se=()=>{if(!F)throw Error(`state not initialized`);let e=xe(F.numPoints);return(!F.selectionBuffer||F.selectionBuffer.size!==e)&&(F.selectionBuffer?.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})),F.selectionBuffer};let V=null;const Ce=(e,t,n,r,i=2)=>{let a=r*i;(!V||V.length!==a)&&(V=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2/l;V[a]=u*f,V[r+a]=d*f;let p=-t[a]/l-.5;if(o+=p*u*2,s+=p*d*2,i===3){let t=e[2*r+a];V[2*r+a]=t*f,c+=p*t*2}}return{weights:V,biasX:o,biasY:s,biasZ:c}};let H=null,U=0,W=!0,G=!1;const K=()=>W?(W=!1,G=!1,X(),F.device.queue.onSubmittedWorkDone().then(()=>{W=!0,G&&F&&!H&&(G=!1,K())},()=>{W=!0,R({type:`error`,message:`WebGPU device lost during rendering`})}),!0):(G=!0,!1),we=e=>{if(!H||!F?.tour)return;let t=H.prevTime===null?void 0:e-H.prevTime;if(t!==void 0){let e=t/1e3*H.speed*H.direction/20,n=F.tour.position+e;n-=Math.floor(n),F.tour.position=n}H.prevTime=e,F.directBasis=null,K()&&(H.lastRenderedRafTime!==null&&H.frameTimes.push(e-H.lastRenderedRafTime),H.lastRenderedRafTime=e),e-U>=33&&(R({type:`playbackTick`,position:F.tour.position,frameMs:t}),U=e),H.rafId=requestAnimationFrame(we)},Te=(e,t)=>{H?(H.speed=e,H.direction=t):(W=!0,H={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},H.rafId=requestAnimationFrame(we))},Ee=()=>{if(H){cancelAnimationFrame(H.rafId),F?.tour&&R({type:`playbackTick`,position:F.tour.position});let e=Float64Array.from(H.frameTimes);R({type:`playbackStopped`,frameTimes:e},[e.buffer]),H=null}},q=(e,t,n,r,i,a)=>{if(!F||!F.projectionResources||!F.adjBasisBuffer||!F.normMins||!F.normRanges)return;let{device:c,numPoints:l,numDims:u}=F,d=F.is3dActive&&F.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(F.residualPC,u*2)):p=e;let{weights:m,biasX:h,biasY:g,biasZ:_}=Ce(p,F.normMins,F.normRanges,u,f),v=u*f*4;F.adjBasisBuffer.size<v&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:v,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Z()),c.queue.writeBuffer(F.adjBasisBuffer,0,m);let y=ye(t.canvas),b=F.backgroundColor,x=.2126*b[0]+.7152*b[1]+.0722*b[2],S=F.colorState.mode>0,C=!S&&x>.5,w,T;S?(w=F.pointPipeline.normalPipeline,T=1):C?(w=F.pointPipeline.subtractivePipeline,T=1):(w=F.pointPipeline.additivePipeline,T=0),ne(c,F.pointPipeline.uniformBuffer,y,F.styleFlags,F.colorState,C,l,u,h,g,F.maxPoints,_),ae(c,F.tonemapPipeline.paramsBuffer,T);let E=t.canvas,D=E.width/E.height||1;re(c,F.pointPipeline.cameraBuffer,{...i,aspect:D,viewportHeight:E.height});let O=c.createCommandEncoder({label:`render-frame`});o(O,n,w,a,l,b),s(O,t,F.tonemapPipeline.pipeline,r),c.queue.submit([O.finish()])},De={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},Oe=()=>{!F||F.previewGpuCanvas||(F.previewGpuCanvas=new OffscreenCanvas(300,300),F.previewGpuView=i(F.previewGpuCanvas,F.device))};let J=!1;const ke=(e,t)=>{if(!F?.projectionResources||!F.renderBindGroup)return;let n=F.previewCanvases.get(e);n&&(Oe(),be(),!(!F.previewGpuView||!F.previewHdrTextureView||!F.previewTonemapBindGroup)&&((F.previewGpuCanvas.width!==n.canvas.width||F.previewGpuCanvas.height!==n.canvas.height)&&(F.previewGpuCanvas.width=n.canvas.width,F.previewGpuCanvas.height=n.canvas.height,be(),!F.previewHdrTextureView||!F.previewTonemapBindGroup)||(q(t,F.previewGpuView,F.previewHdrTextureView,F.previewTonemapBindGroup,De,F.renderBindGroup),n.ctx2d.drawImage(F.previewGpuCanvas,0,0),R({type:`rendered`,viewIndex:e}))))},Ae=()=>{if(!F?.projectionResources||!F.tour)return;let{tour:e,previewCanvases:t}=F;for(let[n]of t)n<e.bases.length&&ke(n,e.bases[n])},je=()=>{J||(J=!0,setTimeout(()=>{J=!1,Ae()},0))},Y=()=>{F?.projectionResources&&(X(),je())},X=()=>{if(!F?.projectionResources||!F.renderBindGroup||(B(),!F.mainHdrTextureView||!F.mainTonemapBindGroup))return;if(F.directBasis){q(F.directBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0});return}if(!F.tour)return;let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),q(e.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0})},Z=()=>{if(!F||!F.projectionResources||!F.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=F,i=F.colorLutBuffer??n.defaultColorLutBuffer,a=F.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;F.colorState.mode===2&&F.activeCatColumnName&&(o=F.categoricalBuffers.get(F.activeCatColumnName)??o),F.projectionBindGroup=fe(e,t.bindGroupLayout,t.paramsBuffer,r),F.renderBindGroup=ie(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,F.adjBasisBuffer,o)},Me=()=>{F&&(Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y())},Ne=()=>{F&&(F.styleFlags.useSelectionMask=!0,Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y())};let Q=0;const Pe=e=>{if(!F)return;let{device:t}=F;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==Q)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,a),F.colorState={mode:1,columnOffset:n*F.numPoints,min:r,range:i,numStops:a.length},F.activeCatColumnName=null,Me();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==Q)return;let{catColumnName:n,palette:r}=e.data;if(!F.categoricalBuffers.has(n))return;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,r),F.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length},F.activeCatColumnName=n,Me();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==Q||!F.projectionResources)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=F,o=Se(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),b(t,a.paramsBuffer,i,n*i,r.length/2);let c=y(t,a.bindGroupLayout,F.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),Ne();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==Q)return;let{catColumnName:n,selectedLabels:r}=e.data,i=F.categoricalBuffers.get(n);if(!i)return;let{numPoints:a,colorPipelines:o}=F,s=Se(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),x(t,o.paramsBuffer,a,r.length);let l=y(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),Ne();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,categoricalColumns:c}=e.data;if(Q=n,r<2||i===0||a.length<2){R({type:`error`,message:`Need at least 2 dimensions to render`});return}F.projectionResources&&(F.projectionResources.dataBuffer.destroy(),F.projectionResources.normParamsBuffer.destroy(),F.projectionResources.basisBuffer.destroy(),F.projectionResources.projectedBuffer.destroy()),F.adjBasisBuffer&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=null),F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null);for(let e of F.categoricalBuffers.values())e.destroy();F.categoricalBuffers.clear(),F.styleFlags={useSelectionMask:!1},F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0},F.activeCatColumnName=null,F.is3dActive=!1,F.rotation3d=null,F.residualPC=null,F.camera.use3d=!1,F.camera.rotation=null;let{projectionPipeline:l}=F,u=de(t,l,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(u.dataBuffer,e*i*4,a[e]);let d=new Float32Array(r*2);for(let e=0;e<r;e++)d[e*2]=o[e],d[e*2+1]=s[e];t.queue.writeBuffer(u.normParamsBuffer,0,d);for(let e of c){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(n,0,e.indices),F.categoricalBuffers.set(e.name,n)}if(ue(t,l.paramsBuffer,i,r,2),F.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.normMins=new Float32Array(o),F.normRanges=new Float32Array(s),F.projectionResources={...u,bindGroup:null},F.numPoints=i,F.numDims=r,Z(),F.tour&&F.tour.dims===r)Y();else{let e=Math.max(1,F.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}F.tour={bases:t,arcLengths:p(t,r),dims:r,position:0,interpolatedBasis:new Float32Array(r*2)},Y()}},Fe=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=he(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),ge(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{!F||!F.is3dActive||(F.residualPC=e,R({type:`residualPC`,residualPC:new Float32Array(e)}),X())}))},$=e=>{if(F){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=p(t,n);F.tour={bases:t,arcLengths:r,dims:n,position:F.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},F.projectionResources&&Y();return}if(e.type===`setTourPosition`){if(!F.tour)return;F.tour.position=e.position,F.directBasis=null,K();return}if(e.type===`setStyle`){F.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color},(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`setCamera`){F.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:F.camera.aspect,viewportHeight:F.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:F.camera.use3d,rotation:F.camera.rotation},K();return}if(e.type===`resize`){e.dpr!==void 0&&(F.dpr=e.dpr),e.viewIndex===0&&(F.mainView.canvas.width=e.width,F.mainView.canvas.height=e.height,(F.tour||F.directBasis)&&F.projectionResources&&X());return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;F.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),F.tour&&F.projectionResources&&e.id<F.tour.bases.length&&ke(e.id,F.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){F.previewCanvases.delete(e.id);return}if(e.type===`render`){(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`setDirectBasis`){if(!F.projectionResources||!F.renderBindGroup)return;F.directBasis=e.basis,K(),F.is3dActive&&F.projectionResources&&Fe(F,e.basis);return}if(e.type===`clearColors`){F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0},F.activeCatColumnName=null,Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`setBackgroundColor`){F.backgroundColor=e.color,(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`setMaxPoints`){F.maxPoints=e.maxPoints,(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`setSelectionMask`){let{mask:t}=e;F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.device.queue.writeBuffer(F.selectionBuffer,0,t),F.styleFlags.useSelectionMask=!0,Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`clearSelectionMask`){F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null),F.styleFlags.useSelectionMask=!1,Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y();return}if(e.type===`enable3d`){if(!F.projectionResources)return;let e=F.directBasis??F.tour?.interpolatedBasis;if(!e)return;if(F.is3dActive=!0,F.camera.use3d=!0,F.adjBasisBuffer){let e=F.numDims*3*4;F.adjBasisBuffer.size<e&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=F.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Z())}X(),Fe(F,e);return}if(e.type===`disable3d`){F.is3dActive=!1,F.residualPC=null,F.rotation3d=null,F.camera.use3d=!1,F.camera.rotation=null,X();return}if(e.type===`set3dRotation`){F.rotation3d=e.matrix,F.camera.rotation=e.matrix,K();return}if(e.type===`startPlayback`){if(!F.tour)return;Te(e.speed,e.direction);return}if(e.type===`stopPlayback`){Ee();return}if(e.type===`computePCA`){if(!F.projectionResources||F.numDims<2){R({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:t,numPoints:i,numDims:a}=F;L||=n(e),r(e,L,t.dataBuffer,t.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{R({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{R({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})});return}if(e.type===`lassoSelect`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0)return;let{device:t,numPoints:n,projectionPipeline:r,projectionResources:i,camera:a}=F,{polygon:o}=e,s=o.length/2;if(s<3)return;let c=null;if(F.directBasis)c=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),c=e.interpolatedBasis}if(!c)return;t.queue.writeBuffer(i.basisBuffer,0,c);let l=pe(t,r,F.projectionBindGroup,n);t.queue.submit([l]);let u=F.mainView.canvas,d=u.width/u.height||1,f=a.insetZoom,p=a.zoom*f,m=new Float32Array(o.length);for(let e=0;e<s;e++)m[e*2]=o[e*2]*d/p-a.panX,m[e*2+1]=(o[e*2+1]-a.insetOffsetY)/p-a.panY;let g=n*2*4,_=t.createBuffer({label:`proj-readback`,size:g,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=t.createCommandEncoder();v.copyBufferToBuffer(i.projectedBuffer,0,_,0,g),t.queue.submit([v.finish()]),_.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(_.getMappedRange()),r=new Uint32Array(Math.ceil(n/32));for(let t=0;t<n;t++){let n=e[t*2],i=e[t*2+1];if(ze(n,i,m,s)){let e=t>>5;r[e]=(r[e]??0)|1<<(t&31)}}_.unmap(),_.destroy(),F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=t.createBuffer({label:`selection-mask`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.selectionBuffer,0,r),F.styleFlags.useSelectionMask=!0,Z(),(F.tour||F.directBasis)&&F.projectionResources&&Y()});return}if(e.type===`benchmark`){Re(e.numFrames);return}if(e.type===`getMetrics`){Le();return}}},Ie=()=>{if(!F)return 0;let e=0;if(F.projectionResources){let t=F.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}F.adjBasisBuffer&&(e+=F.adjBasisBuffer.size),F.selectionBuffer&&(e+=F.selectionBuffer.size),F.colorLutBuffer&&(e+=F.colorLutBuffer.size);for(let t of F.categoricalBuffers.values())e+=t.size;F.mainHdrTexture&&(e+=F.mainHdrTexture.width*F.mainHdrTexture.height*16),F.previewHdrTexture&&(e+=F.previewHdrTexture.width*F.previewHdrTexture.height*16);let t=F.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=F.projectionPipeline.paramsBuffer.size,e+=F.tonemapPipeline.paramsBuffer.size,e},Le=()=>{if(!F)return;let e=0;if(F.tour){for(let t of F.tour.bases)e+=t.byteLength;e+=F.tour.interpolatedBasis.byteLength}R({type:`metricsResult`,gpuMemoryBytes:Ie(),numPoints:F.numPoints,numDims:F.numDims,workerJsHeapBytes:e})},Re=async e=>{if(!F||!F.tour||!F.renderBindGroup||F.numPoints===0){R({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=F,a=i.position;F.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position),B(),q(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position);let r=performance.now();q(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,R({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},ze=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`){try{let{device:e}=await S(),n=i(t.canvas,e),r=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=te(e,a),s=le(e),c=v(e),l=oe(e,r);F={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9]},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Pe;let u=I;if(I=null,u)for(let e of u)$(e);R({type:`ready`})}catch(e){R({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(I){I.push(t);return}$(t)};", i = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", r], { type: "text/javascript;charset=utf-8" });
|
|
23
|
+
var r = "var e=`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - min) / range - 0.5\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range - 0.5;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const t=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},n=t=>{let n=t.createShaderModule({label:`compute-pca`,code:e}),r=t.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),i=t.createPipelineLayout({bindGroupLayouts:[r]});return{partialPipeline:t.createComputePipeline({label:`pca-partial-pipeline`,layout:i,compute:{module:n,entryPoint:`reduce_partial`}}),finalPipeline:t.createComputePipeline({label:`pca-final-pipeline`,layout:i,compute:{module:n,entryPoint:`final_reduce`}}),bindGroupLayout:r,paramsBuffer:t.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},r=async(e,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,e.queue.writeBuffer(n.paramsBuffer,0,u);let f=e.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=e.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return t(x,s)},i=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},a=2e6,o=(e,t,n,r,i,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(i>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<i;e+=a){let t=Math.min(a,i-e);s.draw(4,t,0,e)}}s.end()},s=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},c=1e-10,l=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,s=n*n+i*i,l=a+s,u=a*s-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(o)>c){let e=f-s,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-s,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>c&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>c&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=c&&h>c?(v[0]=-v[3],v[2]=v[1]):h<=c&&m>c?(v[1]=-v[2],v[3]=v[0]):m<=c&&h<=c&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},u=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},d=(e,t,n,r,i,a,o)=>{let s=o*o,c=s*o,l=.5*(-o+2*s-c),d=.5*(2-5*s+3*c),f=.5*(o+4*s-3*c),p=.5*(-s+c);for(let o=0;o<a*2;o++)e[o]=l*t[o]+d*n[o]+f*r[o]+p*i[o];return u(e,a),e},f=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=l(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},p=(e,t)=>{let n=e.length,r=new Float32Array(n+1);r[0]=0;let i=new Float32Array(t*2),a=new Float32Array(t*2);for(let o=0;o<n;o++){let s=(o-1+n)%n,c=o,l=(o+1)%n,u=(o+2)%n,p=0;d(i,e[s],e[c],e[l],e[u],t,0);for(let n=1;n<=8;n++){let r=n/8;d(a,e[s],e[c],e[l],e[u],t,r),p+=f(i,a,t),i.set(a)}r[o+1]=r[o]+p}let o=r[n];if(o>1e-10)for(let e=1;e<=n;e++)r[e]=r[e]/o;return r},m=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},h=(e,t,n,r,i)=>{let a=t.length,{segment:o,localT:s}=m(n,i),c=(o-1+a)%a,l=o,u=(o+1)%a,f=(o+2)%a;return d(e,t[c],t[l],t[u],t[f],r,s)};var g=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,_=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const v=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,_),selectCategorical:r(`select-categorical`,g),bindGroupLayout:t,paramsBuffer:i}},y=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),b=(e,t,n,r,i)=>{let a=new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},x=(e,t,n,r)=>{let i=new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},S=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var C=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n // 2D colormap params (used when color_mode == 3)\n color_column_offset_v: u32, // second column index * num_points\n color_min_v: f32,\n color_range_v: f32,\n color2d_map_index: u32, // 0-5 = LUT-based, 6 = oklab_polar\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ─── 2D Colormap helpers ──────────────────────────────────────────────────\n\n// Read f32 from the colorLut buffer (which stores u32). Used for 2D colormap LUT curves.\nfn lut_f32(index: u32) -> f32 {\n return bitcast<f32>(colorLut[index]);\n}\n\n// Linearly interpolate a 16-entry LUT curve stored in colorLut at the given base offset.\nfn lut_interp(base: u32, t: f32) -> f32 {\n let pos = t * 15.0;\n let lo = min(u32(floor(pos)), 14u);\n let hi = lo + 1u;\n return mix(lut_f32(base + lo), lut_f32(base + hi), fract(pos));\n}\n\n// Reconstruct a 2D colormap color from SVD rank-1 LUT curves stored in colorLut.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nfn colormap2d_lut(u: f32, v: f32) -> vec3f {\n let r = lut_interp(0u, u) * lut_interp(16u, v);\n let g = lut_interp(32u, u) * lut_interp(48u, v);\n let b = lut_interp(64u, u) * lut_interp(80u, v)\n + lut_interp(96u, u) * lut_interp(112u, v); // rank-2 correction\n return clamp(vec3f(r, g, b), vec3f(0.0), vec3f(1.0));\n}\n\n// Oklab → linear sRGB conversion\nfn oklab_to_linear(L: f32, a: f32, b: f32) -> vec3f {\n let l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n let m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n let s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n return vec3f(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nfn colormap2d_oklab_polar(u: f32, v: f32) -> vec3f {\n let cx = u - 0.5;\n let cy = v - 0.5;\n let radius = min(length(vec2f(cx, cy)) * 2.0, 1.0);\n let angle = atan2(cy, cx);\n let chroma = radius * 0.25;\n let lightness = 0.80 - radius * 0.30;\n let a_val = chroma * cos(angle);\n let b_val = chroma * sin(angle);\n let linear = oklab_to_linear(lightness, a_val, b_val);\n // Linear to sRGB gamma (approximate)\n return pow(clamp(linear, vec3f(0.0), vec3f(1.0)), vec3f(1.0 / 2.2));\n}\n\n// Dispatch 2D colormap by index\nfn colormap2d(map_index: u32, u: f32, v: f32) -> vec3f {\n if map_index == 6u {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Zooming out compresses points → more overlap → must reduce opacity.\n let z = camera.zoom * camera.inset_zoom;\n let eff_opacity = uni.opacity * z * z;\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else if uni.color_mode == 3u {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n let raw_u = data[uni.color_column_offset + ii];\n let raw_v = data[uni.color_column_offset_v + ii];\n let inv_range_u = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let inv_range_v = select(0.0, 1.0 / uni.color_range_v, uni.color_range_v > 0.0);\n let u_val = clamp((raw_u - uni.color_min) * inv_range_u, 0.0, 1.0);\n let v_val = clamp((raw_v - uni.color_min_v) * inv_range_v, 0.0, 1.0);\n let rgb = colormap2d(uni.color2d_map_index, u_val, v_val);\n col = vec4f(rgb, 1.0);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,w=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const T={pointSize:.012,opacity:.7,color:[.25,.5,.9]},E={useSelectionMask:!1},D={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},O={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},k=new ArrayBuffer(96),A=new Float32Array(k),j=new Uint32Array(k),M=new Float32Array(80/4),ee=new Float32Array(4),te=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:C}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:96,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return ne(e,c,T,E,D),re(e,l,O),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},ne=(e,t,n,r=E,i=D,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{A[0]=n.pointSize,A[1]=n.opacity,j[2]=i.mode,A[3]=r.useSelectionMask?1:0,A[4]=n.color[0],A[5]=n.color[1],A[6]=n.color[2],A[7]=1,A[8]=a?1:0,j[9]=o,j[10]=s,j[11]=u,A[12]=c,A[13]=l,j[14]=i.columnOffset,A[15]=i.min,A[16]=i.range,j[17]=i.numStops,A[18]=d,j[19]=i.columnOffsetV,A[20]=i.minV,A[21]=i.rangeV,j[22]=i.mapIndex,A[23]=0,e.queue.writeBuffer(t,0,k)},re=(e,t,n)=>{M[0]=n.panX,M[1]=n.panY,M[2]=n.zoom,M[3]=n.aspect,M[4]=n.viewportHeight,M[5]=n.insetOffsetY,M[6]=n.insetZoom,M[7]=n.use3d?1:0;let r=n.rotation;M[8]=r?r[0]:1,M[9]=r?r[1]:0,M[10]=r?r[2]:0,M[11]=0,M[12]=r?r[3]:0,M[13]=r?r[4]:1,M[14]=r?r[5]:0,M[15]=0,M[16]=r?r[6]:0,M[17]=r?r[7]:0,M[18]=r?r[8]:1,M[19]=0,e.queue.writeBuffer(t,0,M)},ie=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),ae=(e,t,n)=>{ee[0]=n,e.queue.writeBuffer(t,0,ee,0,1)},oe=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:w}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},se=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var ce=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [min, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: (raw - min) / range - 0.5) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(min, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n // Center to [-0.5, 0.5]\n let v = (raw - np.x) / range - 0.5;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const le=e=>{let t=e.createShaderModule({label:`compute-projection`,code:ce}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ue=(e,t,n,r,i)=>{let a=new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},de=(e,t,n,r)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:n*r*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:r*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),fe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),N=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var pe=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range - 0.5;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const me=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:pe}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},he=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),ge(b,c,s,a)},ge=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;P(s,a,o,t),F(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}P(c,a,o,t),F(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},P=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},F=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let I=null,L=[],R=null;const z=(e,t)=>{self.postMessage(e,t??[])},_e=(e,t,n,r)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let i=t*r,a=n*r,o=i*a*.5/e,s=Math.sqrt(o/Math.PI),c=r,l,u;return s>=c?(l=s,u=1):(l=c,u=Math.max(.01,o/(Math.PI*c*c))),{pointSize:2*l/a,opacity:u}},ve=(e,t)=>e*I.dpr/t,ye=e=>{let{style:t,numPoints:n,dpr:r}=I;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:ve(t.pointSize,e.height),opacity:t.opacity,color:t.color};let i=_e(n,e.width/r,e.height/r,r);return{pointSize:t.pointSize===`auto`?i.pointSize:ve(t.pointSize,e.height),opacity:t.opacity===`auto`?i.opacity:t.opacity,color:t.color}},be=()=>{let{device:e,mainView:t,tonemapPipeline:n}=I,{width:r,height:i}=t.canvas,a=I.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:I.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();I.mainHdrTexture=o,I.mainHdrTextureView=s,I.mainTonemapBindGroup=se(e,n.bindGroupLayout,s,n.paramsBuffer)},xe=()=>{if(!I.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=I,{width:n,height:r}=I.previewGpuCanvas,i=I.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:I.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();I.previewHdrTexture=a,I.previewHdrTextureView=o,I.previewTonemapBindGroup=se(e,t.bindGroupLayout,o,t.paramsBuffer)},Se=e=>Math.ceil(e/32)*4,Ce=()=>{if(!I)throw Error(`state not initialized`);let e=Se(I.numPoints);return(!I.selectionBuffer||I.selectionBuffer.size!==e)&&(I.selectionBuffer?.destroy(),I.selectionBuffer=I.device.createBuffer({label:`selection-mask`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})),I.selectionBuffer};let B=null;const we=(e,t,n,r,i=2)=>{let a=r*i;(!B||B.length!==a)&&(B=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2/l;B[a]=u*f,B[r+a]=d*f;let p=-t[a]/l-.5;if(o+=p*u*2,s+=p*d*2,i===3){let t=e[2*r+a];B[2*r+a]=t*f,c+=p*t*2}}return{weights:B,biasX:o,biasY:s,biasZ:c}};let V=null,H=0,U=!0,W=!1;const G=()=>U?(U=!1,W=!1,Y(),I.device.queue.onSubmittedWorkDone().then(()=>{U=!0,W&&I&&!V&&(W=!1,G())},()=>{U=!0,z({type:`error`,message:`WebGPU device lost during rendering`})}),!0):(W=!0,!1),Te=e=>{if(!V||!I?.tour)return;let t=V.prevTime===null?void 0:e-V.prevTime;if(t!==void 0){let e=t/1e3*V.speed*V.direction/20,n=I.tour.position+e;n-=Math.floor(n),I.tour.position=n}V.prevTime=e,I.directBasis=null,G()&&(V.lastRenderedRafTime!==null&&V.frameTimes.push(e-V.lastRenderedRafTime),V.lastRenderedRafTime=e),e-H>=33&&(z({type:`playbackTick`,position:I.tour.position,frameMs:t}),H=e),V.rafId=requestAnimationFrame(Te)},Ee=(e,t)=>{V?(V.speed=e,V.direction=t):(U=!0,V={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},V.rafId=requestAnimationFrame(Te))},De=()=>{if(V){cancelAnimationFrame(V.rafId),I?.tour&&z({type:`playbackTick`,position:I.tour.position});let e=Float64Array.from(V.frameTimes);z({type:`playbackStopped`,frameTimes:e},[e.buffer]),V=null}},K=(e,t,n,r,i,a)=>{if(!I||!I.projectionResources||!I.adjBasisBuffer||!I.normMins||!I.normRanges)return;let{device:c,numPoints:l,numDims:u}=I,d=I.is3dActive&&I.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(I.residualPC,u*2)):p=e;let{weights:m,biasX:h,biasY:g,biasZ:_}=we(p,I.normMins,I.normRanges,u,f),v=u*f*4;I.adjBasisBuffer.size<v&&(I.adjBasisBuffer.destroy(),I.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:v,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),X()),c.queue.writeBuffer(I.adjBasisBuffer,0,m);let y=ye(t.canvas),b=I.backgroundColor,x=.2126*b[0]+.7152*b[1]+.0722*b[2],S=I.colorState.mode>0,C=!S&&x>.5,w,T;S?(w=I.pointPipeline.normalPipeline,T=1):C?(w=I.pointPipeline.subtractivePipeline,T=1):(w=I.pointPipeline.additivePipeline,T=0),ne(c,I.pointPipeline.uniformBuffer,y,I.styleFlags,I.colorState,C,l,u,h,g,I.maxPoints,_),ae(c,I.tonemapPipeline.paramsBuffer,T);let E=t.canvas,D=E.width/E.height||1;re(c,I.pointPipeline.cameraBuffer,{...i,aspect:D,viewportHeight:E.height});let O=c.createCommandEncoder({label:`render-frame`});o(O,n,w,a,l,b),s(O,t,I.tonemapPipeline.pipeline,r),c.queue.submit([O.finish()])},Oe={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},ke=()=>{!I||I.previewGpuCanvas||(I.previewGpuCanvas=new OffscreenCanvas(300,300),I.previewGpuView=i(I.previewGpuCanvas,I.device))};let q=!1;const Ae=(e,t)=>{if(!I?.projectionResources||!I.renderBindGroup)return;let n=I.previewCanvases.get(e);n&&(ke(),xe(),!(!I.previewGpuView||!I.previewHdrTextureView||!I.previewTonemapBindGroup)&&((I.previewGpuCanvas.width!==n.canvas.width||I.previewGpuCanvas.height!==n.canvas.height)&&(I.previewGpuCanvas.width=n.canvas.width,I.previewGpuCanvas.height=n.canvas.height,xe(),!I.previewHdrTextureView||!I.previewTonemapBindGroup)||(K(t,I.previewGpuView,I.previewHdrTextureView,I.previewTonemapBindGroup,Oe,I.renderBindGroup),n.ctx2d.drawImage(I.previewGpuCanvas,0,0),z({type:`rendered`,viewIndex:e}))))},je=()=>{if(!I?.projectionResources||!I.tour)return;let{tour:e,previewCanvases:t}=I;for(let[n]of t)n<e.bases.length&&Ae(n,e.bases[n])},Me=()=>{q||(q=!0,setTimeout(()=>{q=!1,je()},0))},J=()=>{I?.projectionResources&&(Y(),Me())},Y=()=>{if(!I?.projectionResources||!I.renderBindGroup||(be(),!I.mainHdrTextureView||!I.mainTonemapBindGroup))return;if(I.directBasis){K(I.directBasis,I.mainView,I.mainHdrTextureView,I.mainTonemapBindGroup,I.camera,I.renderBindGroup),z({type:`rendered`,viewIndex:0});return}if(!I.tour)return;let{tour:e}=I;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),K(e.interpolatedBasis,I.mainView,I.mainHdrTextureView,I.mainTonemapBindGroup,I.camera,I.renderBindGroup),z({type:`rendered`,viewIndex:0})},X=()=>{if(!I||!I.projectionResources||!I.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=I,i=I.colorLutBuffer??n.defaultColorLutBuffer,a=I.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;I.colorState.mode===2&&I.activeCatColumnName&&(o=I.categoricalBuffers.get(I.activeCatColumnName)??o),I.projectionBindGroup=fe(e,t.bindGroupLayout,t.paramsBuffer,r),I.renderBindGroup=ie(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,I.adjBasisBuffer,o)},Z=()=>{I&&(X(),(I.tour||I.directBasis)&&I.projectionResources&&J())},Ne=()=>{I&&(I.styleFlags.useSelectionMask=!0,X(),(I.tour||I.directBasis)&&I.projectionResources&&J())};let Q=0;const Pe=e=>{if(!I)return;let{device:t}=I;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==Q)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;I.colorLutBuffer?.destroy(),I.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(I.colorLutBuffer,0,a),I.colorState={mode:1,columnOffset:n*I.numPoints,min:r,range:i,numStops:a.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},I.activeCatColumnName=null,Z();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==Q)return;let{catColumnName:n,palette:r}=e.data;if(!I.categoricalBuffers.has(n))return;I.colorLutBuffer?.destroy(),I.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(I.colorLutBuffer,0,r),I.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},I.activeCatColumnName=n,Z();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==Q)return;let{columnIndexX:n,columnIndexY:r,minX:i,rangeX:a,minY:o,rangeY:s,lut:c,mapIndex:l}=e.data;c&&(I.colorLutBuffer?.destroy(),I.colorLutBuffer=t.createBuffer({label:`color-lut-2d`,size:c.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(I.colorLutBuffer,0,c)),I.colorState={mode:3,columnOffset:n*I.numPoints,min:i,range:a,numStops:0,columnOffsetV:r*I.numPoints,minV:o,rangeV:s,mapIndex:l},I.activeCatColumnName=null,Z();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==Q||!I.projectionResources)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=I,o=Ce(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),b(t,a.paramsBuffer,i,n*i,r.length/2);let c=y(t,a.bindGroupLayout,I.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),Ne();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==Q)return;let{catColumnName:n,selectedLabels:r}=e.data,i=I.categoricalBuffers.get(n);if(!i)return;let{numPoints:a,colorPipelines:o}=I,s=Ce(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),x(t,o.paramsBuffer,a,r.length);let l=y(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),Ne();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,categoricalColumns:c}=e.data;if(Q=n,r<2||i===0||a.length<2){z({type:`error`,message:`Need at least 2 dimensions to render`});return}I.projectionResources&&(I.projectionResources.dataBuffer.destroy(),I.projectionResources.normParamsBuffer.destroy(),I.projectionResources.basisBuffer.destroy(),I.projectionResources.projectedBuffer.destroy()),I.adjBasisBuffer&&(I.adjBasisBuffer.destroy(),I.adjBasisBuffer=null),I.colorLutBuffer&&(I.colorLutBuffer.destroy(),I.colorLutBuffer=null),I.selectionBuffer&&(I.selectionBuffer.destroy(),I.selectionBuffer=null);for(let e of I.categoricalBuffers.values())e.destroy();I.categoricalBuffers.clear(),I.styleFlags={useSelectionMask:!1},I.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},I.activeCatColumnName=null,I.is3dActive=!1,I.rotation3d=null,I.residualPC=null,I.camera.use3d=!1,I.camera.rotation=null;let{projectionPipeline:l}=I,u=de(t,l,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(u.dataBuffer,e*i*4,a[e]);let d=new Float32Array(r*2);for(let e=0;e<r;e++)d[e*2]=o[e],d[e*2+1]=s[e];t.queue.writeBuffer(u.normParamsBuffer,0,d);for(let e of c){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});t.queue.writeBuffer(n,0,e.indices),I.categoricalBuffers.set(e.name,n)}if(ue(t,l.paramsBuffer,i,r,2),I.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),I.normMins=new Float32Array(o),I.normRanges=new Float32Array(s),I.projectionResources={...u,bindGroup:null},I.numPoints=i,I.numDims=r,X(),I.tour&&I.tour.dims===r)J();else{let e=Math.max(1,I.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}I.tour={bases:t,arcLengths:p(t,r),dims:r,position:0,interpolatedBasis:new Float32Array(r*2)},J()}},Fe=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=me(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),he(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{!I||!I.is3dActive||(I.residualPC=e,z({type:`residualPC`,residualPC:new Float32Array(e)}),Y())}))},$=e=>{if(I){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=p(t,n);I.tour={bases:t,arcLengths:r,dims:n,position:I.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},I.projectionResources&&J();return}if(e.type===`setTourPosition`){if(!I.tour)return;I.tour.position=e.position,I.directBasis=null,G();return}if(e.type===`setStyle`){I.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color},(I.tour||I.directBasis)&&I.projectionResources&&J();return}if(e.type===`setCamera`){I.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:I.camera.aspect,viewportHeight:I.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:I.camera.use3d,rotation:I.camera.rotation},G();return}if(e.type===`resize`){e.dpr!==void 0&&(I.dpr=e.dpr),e.viewIndex===0&&(I.mainView.canvas.width=e.width,I.mainView.canvas.height=e.height,(I.tour||I.directBasis)&&I.projectionResources&&Y());return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;I.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),I.tour&&I.projectionResources&&e.id<I.tour.bases.length&&Ae(e.id,I.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){I.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=I.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,I.tour&&I.projectionResources&&Me();return}if(e.type===`render`){(I.tour||I.directBasis)&&I.projectionResources&&J();return}if(e.type===`setDirectBasis`){if(!I.projectionResources||!I.renderBindGroup)return;I.directBasis=e.basis,G(),I.is3dActive&&I.projectionResources&&Fe(I,e.basis);return}if(e.type===`clearColors`){I.colorLutBuffer&&(I.colorLutBuffer.destroy(),I.colorLutBuffer=null),I.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},I.activeCatColumnName=null,X(),(I.tour||I.directBasis)&&I.projectionResources&&J();return}if(e.type===`setBackgroundColor`){I.backgroundColor=e.color,(I.tour||I.directBasis)&&I.projectionResources&&J();return}if(e.type===`setMaxPoints`){I.maxPoints=e.maxPoints,(I.tour||I.directBasis)&&I.projectionResources&&J();return}if(e.type===`setSelectionMask`){let{mask:t}=e;I.selectionBuffer&&I.selectionBuffer.destroy(),I.selectionBuffer=I.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),I.device.queue.writeBuffer(I.selectionBuffer,0,t),I.styleFlags.useSelectionMask=!0,X(),(I.tour||I.directBasis)&&I.projectionResources&&J();let n=new Uint32Array(t);z({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){I.selectionBuffer&&(I.selectionBuffer.destroy(),I.selectionBuffer=null),I.styleFlags.useSelectionMask=!1,X(),(I.tour||I.directBasis)&&I.projectionResources&&J(),z({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`enable3d`){if(!I.projectionResources)return;let e=I.directBasis??I.tour?.interpolatedBasis;if(!e)return;if(I.is3dActive=!0,I.camera.use3d=!0,I.adjBasisBuffer){let e=I.numDims*3*4;I.adjBasisBuffer.size<e&&(I.adjBasisBuffer.destroy(),I.adjBasisBuffer=I.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),X())}Y(),Fe(I,e);return}if(e.type===`disable3d`){I.is3dActive=!1,I.residualPC=null,I.rotation3d=null,I.camera.use3d=!1,I.camera.rotation=null,Y();return}if(e.type===`set3dRotation`){I.rotation3d=e.matrix,I.camera.rotation=e.matrix,G();return}if(e.type===`startPlayback`){if(!I.tour)return;Ee(e.speed,e.direction);return}if(e.type===`stopPlayback`){De();return}if(e.type===`computePCA`){if(!I.projectionResources||I.numDims<2){z({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:t,numPoints:i,numDims:a}=I;R||=n(e),r(e,R,t.dataBuffer,t.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{z({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{z({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})});return}if(e.type===`lassoSelect`){if(!I.projectionResources||!I.projectionBindGroup||I.numPoints===0)return;let{device:t,numPoints:n,projectionPipeline:r,projectionResources:i,camera:a}=I,{polygon:o}=e,s=o.length/2;if(s<3)return;let c=null;if(I.directBasis)c=I.directBasis;else if(I.tour){let{tour:e}=I;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),c=e.interpolatedBasis}if(!c)return;t.queue.writeBuffer(i.basisBuffer,0,c);let l=N(t,r,I.projectionBindGroup,n);t.queue.submit([l]);let u=I.mainView.canvas,d=u.width/u.height||1,f=a.insetZoom,p=a.zoom*f,m=new Float32Array(o.length);for(let e=0;e<s;e++)m[e*2]=o[e*2]*d/p-a.panX,m[e*2+1]=(o[e*2+1]-a.insetOffsetY)/p-a.panY;let g=n*2*4,_=t.createBuffer({label:`proj-readback`,size:g,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=t.createCommandEncoder();v.copyBufferToBuffer(i.projectedBuffer,0,_,0,g),t.queue.submit([v.finish()]),_.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(_.getMappedRange()),r=new Uint32Array(Math.ceil(n/32));for(let t=0;t<n;t++){let n=e[t*2],i=e[t*2+1];if(ze(n,i,m,s)){let e=t>>5;r[e]=(r[e]??0)|1<<(t&31)}}_.unmap(),_.destroy(),I.selectionBuffer&&I.selectionBuffer.destroy(),I.selectionBuffer=t.createBuffer({label:`selection-mask`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(I.selectionBuffer,0,r),I.styleFlags.useSelectionMask=!0,X(),(I.tour||I.directBasis)&&I.projectionResources&&J();let i=new Uint32Array(r);z({type:`selectionResult`,mask:i},[i.buffer])});return}if(e.type===`getProjectedPositions`){if(!I.projectionResources||!I.projectionBindGroup||I.numPoints===0){z({type:`projectedPositions`,positions:new Float32Array},[]);return}let{device:e,numPoints:t,projectionPipeline:n,projectionResources:r}=I,i=null;if(I.directBasis)i=I.directBasis;else if(I.tour){let{tour:e}=I;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),i=e.interpolatedBasis}if(!i){z({type:`projectedPositions`,positions:new Float32Array},[]);return}e.queue.writeBuffer(r.basisBuffer,0,i);let a=N(e,n,I.projectionBindGroup,t);e.queue.submit([a]);let o=t*2*4,s=e.createBuffer({label:`proj-positions-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=e.createCommandEncoder();c.copyBufferToBuffer(r.projectedBuffer,0,s,0,o),e.queue.submit([c.finish()]),s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();s.unmap(),s.destroy(),z({type:`projectedPositions`,positions:e},[e.buffer])});return}if(e.type===`getPointData`){if(!I.projectionResources||I.numPoints===0){z({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{device:t,numPoints:n,numDims:r,projectionResources:i}=I,a=e.pointIndex;if(a<0||a>=n){z({type:`pointData`,pointIndex:a,numericValues:{},categoricalValues:{}});return}let o=r*4,s=t.createBuffer({label:`point-data-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=t.createCommandEncoder();for(let e=0;e<r;e++)c.copyBufferToBuffer(i.dataBuffer,(e*n+a)*4,s,e*4,4);let l=Array.from(I.categoricalBuffers.keys()),u=l.length*4,d=null;if(u>0){d=t.createBuffer({label:`point-cat-readback`,size:u,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});let e=0;for(let t of l){let n=I.categoricalBuffers.get(t);c.copyBufferToBuffer(n,a*4,d,e,4),e+=4}}t.queue.submit([c.finish()]);let f=s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();return s.unmap(),s.destroy(),e}),p=d?d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(d.getMappedRange()).slice();return d.unmap(),d.destroy(),e}):Promise.resolve(new Uint32Array);Promise.all([f,p]).then(([e,t])=>{let n={};for(let t=0;t<r;t++)n[String(t)]=e[t];let i={};for(let e=0;e<l.length;e++)i[l[e]]=t[e];z({type:`pointData`,pointIndex:a,numericValues:n,categoricalValues:i})});return}if(e.type===`benchmark`){Re(e.numFrames);return}if(e.type===`getMetrics`){Le();return}}},Ie=()=>{if(!I)return 0;let e=0;if(I.projectionResources){let t=I.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}I.adjBasisBuffer&&(e+=I.adjBasisBuffer.size),I.selectionBuffer&&(e+=I.selectionBuffer.size),I.colorLutBuffer&&(e+=I.colorLutBuffer.size);for(let t of I.categoricalBuffers.values())e+=t.size;I.mainHdrTexture&&(e+=I.mainHdrTexture.width*I.mainHdrTexture.height*16),I.previewHdrTexture&&(e+=I.previewHdrTexture.width*I.previewHdrTexture.height*16);let t=I.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=I.projectionPipeline.paramsBuffer.size,e+=I.tonemapPipeline.paramsBuffer.size,e},Le=()=>{if(!I)return;let e=0;if(I.tour){for(let t of I.tour.bases)e+=t.byteLength;e+=I.tour.interpolatedBasis.byteLength}z({type:`metricsResult`,gpuMemoryBytes:Ie(),numPoints:I.numPoints,numDims:I.numDims,workerJsHeapBytes:e})},Re=async e=>{if(!I||!I.tour||!I.renderBindGroup||I.numPoints===0){z({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=I,a=i.position;I.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position),be(),K(i.interpolatedBasis,I.mainView,I.mainHdrTextureView,I.mainTonemapBindGroup,I.camera,I.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position);let r=performance.now();K(i.interpolatedBasis,I.mainView,I.mainHdrTextureView,I.mainTonemapBindGroup,I.camera,I.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,z({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},ze=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`){try{let{device:e}=await S(),n=i(t.canvas,e),r=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=te(e,a),s=le(e),c=v(e),l=oe(e,r);I={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9]},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Pe;let u=L;if(L=null,u)for(let e of u)$(e);z({type:`ready`})}catch(e){z({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(L){L.push(t);return}$(t)};", i = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", r], { type: "text/javascript;charset=utf-8" });
|
|
24
24
|
function a(e) {
|
|
25
25
|
let t;
|
|
26
26
|
try {
|
|
@@ -170,14 +170,21 @@ var o = (e) => {
|
|
|
170
170
|
...n ? { theme: n } : {},
|
|
171
171
|
...r ? { colorMap: r } : {}
|
|
172
172
|
});
|
|
173
|
-
}, E = (e) => {
|
|
173
|
+
}, E = (e, t, n = "schumann") => {
|
|
174
|
+
c(u, {
|
|
175
|
+
type: "encodeColor2D",
|
|
176
|
+
columnX: e,
|
|
177
|
+
columnY: t,
|
|
178
|
+
colormap: n
|
|
179
|
+
});
|
|
180
|
+
}, D = (e) => {
|
|
174
181
|
s(l, {
|
|
175
182
|
type: "setBackgroundColor",
|
|
176
183
|
color: e
|
|
177
184
|
});
|
|
178
|
-
},
|
|
185
|
+
}, O = () => {
|
|
179
186
|
s(l, { type: "clearColors" });
|
|
180
|
-
},
|
|
187
|
+
}, k = (e, t) => {
|
|
181
188
|
let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
|
|
182
189
|
n && r.push(n.buffer), c(u, {
|
|
183
190
|
type: "selectByColumn",
|
|
@@ -185,52 +192,52 @@ var o = (e) => {
|
|
|
185
192
|
labelIndices: t.labelIndices,
|
|
186
193
|
valueRanges: n
|
|
187
194
|
}, r);
|
|
188
|
-
},
|
|
195
|
+
}, A = (e) => {
|
|
189
196
|
s(l, {
|
|
190
197
|
type: "setSelectionMask",
|
|
191
198
|
mask: e
|
|
192
199
|
}, [e.buffer]);
|
|
193
|
-
},
|
|
200
|
+
}, j = (e) => {
|
|
194
201
|
s(l, {
|
|
195
202
|
type: "lassoSelect",
|
|
196
203
|
polygon: e
|
|
197
204
|
}, [e.buffer]);
|
|
198
|
-
}, j = () => {
|
|
199
|
-
s(l, { type: "clearSelectionMask" });
|
|
200
205
|
}, M = () => {
|
|
206
|
+
s(l, { type: "clearSelectionMask" });
|
|
207
|
+
}, N = () => {
|
|
201
208
|
s(l, { type: "computePCA" });
|
|
202
|
-
},
|
|
209
|
+
}, P = (e, t) => {
|
|
203
210
|
s(l, {
|
|
204
211
|
type: "startPlayback",
|
|
205
212
|
speed: e,
|
|
206
213
|
direction: t
|
|
207
214
|
});
|
|
208
|
-
},
|
|
215
|
+
}, F = () => {
|
|
209
216
|
s(l, { type: "stopPlayback" });
|
|
210
|
-
},
|
|
217
|
+
}, I = (e) => {
|
|
211
218
|
s(l, {
|
|
212
219
|
type: "setMaxPoints",
|
|
213
220
|
maxPoints: e
|
|
214
221
|
});
|
|
215
|
-
}, I = () => {
|
|
216
|
-
s(l, { type: "enable3d" });
|
|
217
222
|
}, L = () => {
|
|
223
|
+
s(l, { type: "enable3d" });
|
|
224
|
+
}, R = () => {
|
|
218
225
|
s(l, { type: "disable3d" });
|
|
219
|
-
},
|
|
226
|
+
}, z = (e) => {
|
|
220
227
|
s(l, {
|
|
221
228
|
type: "set3dRotation",
|
|
222
229
|
matrix: e
|
|
223
230
|
});
|
|
224
|
-
},
|
|
225
|
-
let n =
|
|
231
|
+
}, B = (e = 120) => new Promise((t) => {
|
|
232
|
+
let n = H((e) => {
|
|
226
233
|
e.type === "benchmarkResult" && (n(), t(e));
|
|
227
234
|
});
|
|
228
235
|
s(l, {
|
|
229
236
|
type: "benchmark",
|
|
230
237
|
numFrames: e
|
|
231
238
|
});
|
|
232
|
-
}),
|
|
233
|
-
let t =
|
|
239
|
+
}), V = () => new Promise((e) => {
|
|
240
|
+
let t = H((n) => {
|
|
234
241
|
if (n.type !== "metricsResult") return;
|
|
235
242
|
t();
|
|
236
243
|
let r = typeof performance < "u" && "memory" in performance ? performance.memory.usedJSHeapSize : void 0, i = Number.isFinite(r) ? r : null, a = Number.isFinite(n.workerJsHeapBytes) ? n.workerJsHeapBytes : null;
|
|
@@ -241,7 +248,7 @@ var o = (e) => {
|
|
|
241
248
|
});
|
|
242
249
|
});
|
|
243
250
|
s(l, { type: "getMetrics" });
|
|
244
|
-
}),
|
|
251
|
+
}), H = (e) => (f.add(e), () => f.delete(e)), U;
|
|
245
252
|
return {
|
|
246
253
|
loadData: _,
|
|
247
254
|
setBases: v,
|
|
@@ -252,21 +259,37 @@ var o = (e) => {
|
|
|
252
259
|
render: C,
|
|
253
260
|
setDirectBasis: w,
|
|
254
261
|
encodeColor: T,
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
262
|
+
encodeColor2D: E,
|
|
263
|
+
setBackgroundColor: D,
|
|
264
|
+
clearColor: O,
|
|
265
|
+
selectByColumn: k,
|
|
266
|
+
setSelectionMask: A,
|
|
267
|
+
lassoSelect: j,
|
|
268
|
+
clearSelection: M,
|
|
269
|
+
getProjectedPositions: () => (U && U.unsub(), new Promise((e) => {
|
|
270
|
+
let t = H((n) => {
|
|
271
|
+
n.type === "projectedPositions" && (t(), U = void 0, e(n.positions));
|
|
272
|
+
});
|
|
273
|
+
U = { unsub: t }, s(l, { type: "getProjectedPositions" });
|
|
274
|
+
})),
|
|
275
|
+
getPointData: (e) => new Promise((t) => {
|
|
276
|
+
let n = H((r) => {
|
|
277
|
+
r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
|
|
278
|
+
});
|
|
279
|
+
s(l, {
|
|
280
|
+
type: "getPointData",
|
|
281
|
+
pointIndex: e
|
|
282
|
+
});
|
|
283
|
+
}),
|
|
284
|
+
computePCA: N,
|
|
285
|
+
startPlayback: P,
|
|
286
|
+
stopPlayback: F,
|
|
287
|
+
setMaxPoints: I,
|
|
288
|
+
enable3d: L,
|
|
289
|
+
disable3d: R,
|
|
290
|
+
set3dRotation: z,
|
|
291
|
+
benchmark: B,
|
|
292
|
+
getMetrics: V,
|
|
270
293
|
addPreviewCanvas: (e, t) => {
|
|
271
294
|
let n = t.transferControlToOffscreen();
|
|
272
295
|
s(l, {
|
|
@@ -281,12 +304,20 @@ var o = (e) => {
|
|
|
281
304
|
id: e
|
|
282
305
|
});
|
|
283
306
|
},
|
|
284
|
-
|
|
307
|
+
resizePreview: (e, t, n) => {
|
|
308
|
+
s(l, {
|
|
309
|
+
type: "resizePreview",
|
|
310
|
+
id: e,
|
|
311
|
+
width: t,
|
|
312
|
+
height: n
|
|
313
|
+
});
|
|
314
|
+
},
|
|
315
|
+
subscribe: H,
|
|
285
316
|
destroy: () => {
|
|
286
317
|
l.terminate(), u.terminate(), f.clear();
|
|
287
318
|
}
|
|
288
319
|
};
|
|
289
|
-
}, u = "var e=`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`,t=`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Effective opacity: scale by zoom^2 for constant visual fill density (Reusser)\n float z = u_zoom * u_insetZoom;\n v_effOpacity = u_opacity * z * z;\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,n=`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`,r=`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;const i=1e-10,a=e=>{let t=e[0],n=e[1],r=e[2],a=e[3],o=t*t+r*r,s=t*n+r*a,c=n*n+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(s)>i){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>i&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+a*_[1])/m),h>i&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+a*_[3])/h),m<=i&&h>i?(v[0]=-v[3],v[2]=v[1]):h<=i&&m>i?(v[1]=-v[2],v[3]=v[0]):m<=i&&h<=i&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},o=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},s=(e,t,n,r,i,a,s)=>{let c=s*s,l=c*s,u=.5*(-s+2*c-l),d=.5*(2-5*c+3*l),f=.5*(s+4*c-3*l),p=.5*(-c+l);for(let o=0;o<a*2;o++)e[o]=u*t[o]+d*n[o]+f*r[o]+p*i[o];return o(e,a),e},c=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=a(r),o=Math.acos(Math.max(-1,Math.min(1,i[0]))),s=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(o*o+s*s)},l=(e,t)=>{let n=e.length,r=new Float32Array(n+1);r[0]=0;let i=new Float32Array(t*2),a=new Float32Array(t*2);for(let o=0;o<n;o++){let l=(o-1+n)%n,u=o,d=(o+1)%n,f=(o+2)%n,p=0;s(i,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;s(a,e[l],e[u],e[d],e[f],t,r),p+=c(i,a,t),i.set(a)}r[o+1]=r[o]+p}let o=r[n];if(o>1e-10)for(let e=1;e<=n;e++)r[e]=r[e]/o;return r},u=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},d=(e,t,n,r,i)=>{let a=t.length,{segment:o,localT:c}=u(n,i),l=(o-1+a)%a,d=o,f=(o+1)%a,p=(o+2)%a;return s(e,t[l],t[d],t[f],t[p],r,c)};let f=null,p=[];const m=(e,t)=>{self.postMessage(e,t??[])},h=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},_=(e,t,n)=>e.getUniformLocation(t,n),v=(e,t,n,r)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let i=t*r,a=n*r,o=i*a*.5/e,s=Math.sqrt(o/Math.PI),c=r,l,u;return s>=c?(l=s,u=1):(l=c,u=Math.max(.01,o/(Math.PI*c*c))),{pointSize:2*l/a,opacity:u}},y=(e,t)=>e*f.dpr/t,b=(e,t)=>{let{style:n,numPoints:r,dpr:i}=f;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:y(n.pointSize,t),opacity:n.opacity,color:n.color};let a=v(r,e/i,t/i,i);return{pointSize:n.pointSize===`auto`?a.pointSize:y(n.pointSize,t),opacity:n.opacity===`auto`?a.opacity:n.opacity,color:n.color}};let x=null;const S=(e,t,n,r)=>{(!x||x.length!==r*2)&&(x=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2/s;x[o]=c*u,x[r+o]=l*u;let d=-t[o]/s-.5;i+=d*c*2,a+=d*l*2}return{weights:x,biasX:i,biasY:a}},C=(e,t,n)=>{if(!f)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=f,o=f.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let c=o.createTexture();o.bindTexture(o.TEXTURE_2D,c),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let l=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,l),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,c,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),f.hdrFbos[e]=l,f.hdrTextures[e]=c,f.hdrSizes[e]=[t,n]},w=(e,t)=>{if(!f)return;let n=f.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=f.mainView.gl;f.blitFbo&&r.deleteFramebuffer(f.blitFbo),f.blitTexture&&r.deleteTexture(f.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),f.blitFbo=a,f.blitTexture=i,f.blitSize=[e,t]};let T=null,E=0,D=null,O=!1,k=null;const A=()=>{if(!D||!f)return!0;let e=f.mainView.gl;return e.clientWaitSync(D,0,0)===e.TIMEOUT_EXPIRED?!1:(e.deleteSync(D),D=null,!0)},j=()=>{if(!A())return O=!0,k||=setTimeout(function(){k=null,O&&f&&!T&&j()},2),!1;if(O=!1,U(),f){let e=f.mainView.gl;D=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},M=e=>{if(!T||!f?.tour)return;let t=T.prevTime===null?void 0:e-T.prevTime;if(t!==void 0){let e=t/1e3*T.speed*T.direction/20,n=f.tour.position+e;n-=Math.floor(n),f.tour.position=n}T.prevTime=e,f.directBasis=null,j()&&(T.lastRenderedRafTime!==null&&T.frameTimes.push(e-T.lastRenderedRafTime),T.lastRenderedRafTime=e),e-E>=33&&(m({type:`playbackTick`,position:f.tour.position,frameMs:t}),E=e),T.rafId=requestAnimationFrame(M)},N=(e,t)=>{T?(T.speed=e,T.direction=t):(D=null,O=!1,T={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},T.rafId=requestAnimationFrame(M))},P=()=>{if(T){cancelAnimationFrame(T.rafId),f?.tour&&m({type:`playbackTick`,position:f.tour.position});let e=Float64Array.from(T.frameTimes);m({type:`playbackStopped`,frameTimes:e},[e.buffer]),T=null}},F=(e,t,n,r,i,a)=>{if(!f||!f.dataTexture||!f.normMins||!f.normRanges)return;let{numPoints:o,numDims:s,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d}=f,p=f.mainView.gl,{weights:m,biasX:h,biasY:g}=S(e,f.normMins,f.normRanges,s),_=b(t,n),v=f.backgroundColor,y=.2126*v[0]+.7152*v[1]+.0722*v[2],x=f.colorMode>0,w=!x&&y>.5,T;T=x||w?1:0;let E=t/n||1;if(C(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,f.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(v[0],v[1],v[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(c),p.enable(p.BLEND),x?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):w?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.dataTexture),p.uniform1i(l.u_data,0),p.activeTexture(p.TEXTURE1),f.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,f.colorLutTexture),p.uniform1i(l.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),f.selectionTexture&&p.bindTexture(p.TEXTURE_2D,f.selectionTexture),p.uniform1i(l.u_selectionTex,2),p.activeTexture(p.TEXTURE3),f.colorMode===2&&f.activeCatColumnName){let e=f.catIndexTextures.get(f.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(l.u_catIndexTex,3);let e=new Float32Array(128),t=new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=m[n],t[n]=m[s+n];p.uniform1fv(l.u_adjBasisX,e),p.uniform1fv(l.u_adjBasisY,t),p.uniform2f(l.u_bias,h,g),p.uniform1f(l.u_pointSize,_.pointSize),p.uniform1f(l.u_opacity,_.opacity),p.uniform4f(l.u_color,_.color[0],_.color[1],_.color[2],1),p.uniform1f(l.u_useSubtractive,w?1:0),p.uniform2f(l.u_pan,i.panX,i.panY),p.uniform1f(l.u_zoom,i.zoom),p.uniform1f(l.u_aspect,E),p.uniform1f(l.u_viewportHeight,n),p.uniform1f(l.u_insetOffsetY,i.insetOffsetY),p.uniform1f(l.u_insetZoom,i.insetZoom),p.uniform1i(l.u_numPoints,o),p.uniform1i(l.u_numDims,s),p.uniform1i(l.u_maxPoints,f.maxPoints),p.uniform1i(l.u_texWidth,f.texWidth),p.uniform1i(l.u_colorMode,f.colorMode),p.uniform1i(l.u_colorColumnIndex,f.colorColumnIndex),p.uniform1f(l.u_colorMin,f.colorMin),p.uniform1f(l.u_colorRange,f.colorRange),p.uniform1i(l.u_colorNumStops,f.colorNumStops),p.uniform1f(l.u_useSelectionMask,f.styleFlags.useSelectionMask?1:0),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(u),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.hdrTextures[r]),p.uniform1i(d.u_hdrTexture,0),p.uniform1f(d.u_mode,T),p.drawArrays(p.TRIANGLES,0,3)};let I=!1,L=null,R=null;const z=(e,t)=>{if(!f?.dataTexture)return;let n=f.previewCanvases.get(e);if(!n){m({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){m({type:`rendered`,viewIndex:e});return}let a=f.mainView.gl;w(r,i),F(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},f.blitFbo);let o=r*i*4,s=r*4;(!L||L.length<o)&&(L=new Uint8Array(o)),(!R||R.length<s)&&(R=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,f.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,L),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;R.set(L.subarray(t,t+s)),L.copyWithin(t,n,n+s),L.set(R,n)}let c=new ImageData(new Uint8ClampedArray(L.buffer,0,o),r,i);n.ctx2d.putImageData(c,0,0),m({type:`rendered`,viewIndex:e})},B=()=>{if(!f?.dataTexture||!f.tour)return;let{tour:e}=f;for(let[t]of f.previewCanvases)t>=e.bases.length||z(t,e.bases[t])},V=()=>{I||(I=!0,setTimeout(()=>{I=!1,B()},0))},H=()=>{f?.dataTexture&&(U(),V())},U=()=>{if(!f?.dataTexture)return;let{canvas:e}=f.mainView;if(f.directBasis){F(f.directBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(!f.tour)return;let{tour:t}=f;d(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position),F(t.interpolatedBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0})},W=()=>{f&&(f.tour||f.directBasis)&&f.dataTexture&&H()},G=()=>{f&&(f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H())};let K=0;const q=e=>{if(!f)return;let t=f.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,a),f.colorMode=1,f.colorColumnIndex=n,f.colorMin=r,f.colorRange=i,f.colorNumStops=a.length,f.activeCatColumnName=null,W();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,palette:r}=e.data;if(!f.catIndexTextures.has(n))return;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,r),f.colorMode=2,f.colorNumStops=r.length,f.activeCatColumnName=n,W();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=f,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),c=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<c;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),G();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,selectedLabels:r}=e.data,i=f.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=f,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),G();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,categoricalColumns:c}=e.data;if(K=n,r<2||i===0||a.length<2){m({type:`error`,message:`Need at least 2 dimensions to render`});return}f.dataTexture&&(t.deleteTexture(f.dataTexture),f.dataTexture=null),f.colorLutTexture&&(t.deleteTexture(f.colorLutTexture),f.colorLutTexture=null);for(let e of f.catIndexTextures.values())t.deleteTexture(e);f.catIndexTextures.clear(),f.selectionTexture&&(t.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags={useSelectionMask:!1},f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,f.categoricalBuffers.clear(),f.dataBuffers=a,f.normMins=new Float32Array(o),f.normRanges=new Float32Array(s),f.numPoints=i,f.numDims=r;let u=t.getParameter(t.MAX_TEXTURE_SIZE),d=Math.min(i,u),p=Math.ceil(i/d);f.texWidth=d;let h=t.createTexture();t.bindTexture(t.TEXTURE_2D,h);let g=r*p,_=new Float32Array(d*g);for(let e=0;e<r;e++){let t=a[e],n=e*p;for(let e=0;e<i;e++){let r=e%d,i=n+Math.floor(e/d);_[i*d+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,d,g,0,t.RED,t.FLOAT,_),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),f.dataTexture=h;for(let e of c)f.categoricalBuffers.set(e.name,e.indices),f.catIndexTextures.set(e.name,Y(t,e.indices,i,d));if(f.tour&&f.tour.dims===r)H();else{let e=Math.max(1,f.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}f.tour={bases:t,arcLengths:l(t,r),dims:r,position:0,interpolatedBasis:new Float32Array(r*2)},H()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!f)return;f.selectionTexture&&e.deleteTexture(f.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),f.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=e=>{if(!f||!f.normMins||!f.normRanges||f.numPoints===0)return;let{numPoints:t,numDims:n,dataBuffers:r,camera:i}=f,a=e.length/2;if(a<3)return;let o=null;if(f.directBasis)o=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),o=e.interpolatedBasis}if(!o)return;let{weights:s,biasX:c,biasY:l}=S(o,f.normMins,f.normRanges,n),u=f.mainView.canvas,p=u.width/u.height||1,m=i.insetZoom,h=i.zoom*m,g=new Float32Array(e.length);for(let t=0;t<a;t++)g[t*2]=e[t*2]*p/h-i.panX,g[t*2+1]=(e[t*2+1]-i.insetOffsetY)/h-i.panY;let _=new Uint32Array(Math.ceil(t/32));for(let e=0;e<t;e++){let t=c,i=l;for(let a=0;a<n;a++){let o=r[a][e];t+=o*s[a],i+=o*s[n+a]}Z(t,i,g,a)&&(_[e>>5]=_[e>>5]|0|1<<(e&31))}let v=f.mainView.gl;X(v,_),G()},ee=()=>{if(!f)return 0;let e=0;if(f.dataTexture){let t=Math.ceil(f.numPoints/f.texWidth);e+=f.texWidth*f.numDims*t*4}for(let t=0;t<f.hdrSizes.length;t++){let n=f.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}f.blitSize&&(e+=f.blitSize[0]*f.blitSize[1]*4),f.colorLutTexture&&(e+=f.colorNumStops*4);for(let t of f.categoricalBuffers.values())e+=t.byteLength;return f.selectionTexture&&(e+=Math.ceil(f.numPoints/32)*4),e},te=()=>{if(!f)return;let e=0;for(let t of f.dataBuffers)e+=t.byteLength;for(let t of f.categoricalBuffers.values())e+=t.byteLength;if(f.normMins&&(e+=f.normMins.byteLength),f.normRanges&&(e+=f.normRanges.byteLength),f.tour){for(let t of f.tour.bases)e+=t.byteLength;e+=f.tour.interpolatedBasis.byteLength}m({type:`metricsResult`,gpuMemoryBytes:ee(),numPoints:f.numPoints,numDims:f.numDims,workerJsHeapBytes:e})},ne=e=>{if(!f||!f.tour||!f.dataTexture||f.numPoints===0){m({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=f.mainView.gl,{numPoints:n,numDims:r,tour:i}=f,a=i.position;f.directBasis=null;let o=new Uint8Array(4),s=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position),F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s();let c=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position);let n=performance.now();F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s(),c[t]=performance.now()-n}i.position=a,m({type:`benchmarkResult`,frameTimes:c,numPoints:n,numDims:r},[c.buffer])},$=e=>{if(f){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2;f.tour={bases:t,arcLengths:l(t,n),dims:n,position:f.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},f.dataTexture&&H();return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;f.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&z(e.id,f.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){f.previewCanvases.delete(e.id);return}if(e.type===`setTourPosition`){if(!f.tour)return;f.tour.position=e.position,f.directBasis=null,j();return}if(e.type===`setStyle`){f.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color},(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setCamera`){f.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:f.camera.aspect,viewportHeight:f.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},U();return}if(e.type===`resize`){e.dpr!==void 0&&(f.dpr=e.dpr),e.viewIndex===0&&(f.mainView.canvas.width=e.width,f.mainView.canvas.height=e.height,(f.tour||f.directBasis)&&f.dataTexture&&U());return}if(e.type===`render`){(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setDirectBasis`){if(!f.dataTexture)return;f.directBasis=e.basis,F(e.basis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(e.type===`clearColors`){f.colorLutTexture&&(f.mainView.gl.deleteTexture(f.colorLutTexture),f.colorLutTexture=null),f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setBackgroundColor`){f.backgroundColor=e.color,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setMaxPoints`){f.maxPoints=e.maxPoints,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setSelectionMask`){let t=f.mainView.gl;X(t,e.mask),f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`clearSelectionMask`){f.selectionTexture&&(f.mainView.gl.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags.useSelectionMask=!1,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`startPlayback`){if(!f.tour)return;N(e.speed,e.direction);return}if(e.type===`stopPlayback`){P();return}if(e.type===`computePCA`){m({type:`error`,message:`PCA not yet implemented in WebGL backend`});return}if(e.type===`lassoSelect`){Q(e.polygon);return}if(e.type===`benchmark`){ne(e.numFrames);return}if(e.type===`getMetrics`){te();return}}};self.onmessage=i=>{let a=i.data;if(a.type===`init`){try{let i=a.canvas,o=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!o)throw Error(`WebGL2 not supported`);o.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),o.getExtension(`OES_texture_float_linear`);let s=o,c=g(s,t,e),l={u_data:_(s,c,`u_data`),u_adjBasisX:_(s,c,`u_adjBasisX`),u_adjBasisY:_(s,c,`u_adjBasisY`),u_bias:_(s,c,`u_bias`),u_pointSize:_(s,c,`u_pointSize`),u_opacity:_(s,c,`u_opacity`),u_color:_(s,c,`u_color`),u_useSubtractive:_(s,c,`u_useSubtractive`),u_pan:_(s,c,`u_pan`),u_zoom:_(s,c,`u_zoom`),u_aspect:_(s,c,`u_aspect`),u_viewportHeight:_(s,c,`u_viewportHeight`),u_insetOffsetY:_(s,c,`u_insetOffsetY`),u_insetZoom:_(s,c,`u_insetZoom`),u_numPoints:_(s,c,`u_numPoints`),u_numDims:_(s,c,`u_numDims`),u_maxPoints:_(s,c,`u_maxPoints`),u_texWidth:_(s,c,`u_texWidth`),u_colorMode:_(s,c,`u_colorMode`),u_colorColumnIndex:_(s,c,`u_colorColumnIndex`),u_colorMin:_(s,c,`u_colorMin`),u_colorRange:_(s,c,`u_colorRange`),u_colorNumStops:_(s,c,`u_colorNumStops`),u_colorLutTex:_(s,c,`u_colorLutTex`),u_catIndexTex:_(s,c,`u_catIndexTex`),u_useSelectionMask:_(s,c,`u_useSelectionMask`),u_selectionTex:_(s,c,`u_selectionTex`)},u=g(s,r,n),d={u_hdrTexture:_(s,u,`u_hdrTexture`),u_mode:_(s,u,`u_mode`)};f={mainView:{canvas:i,gl:o},previewCanvases:new Map,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9]},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,camera:{panX:0,panY:0,zoom:a.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:a.dpr,maxPoints:0,texWidth:0},a.dataPort.onmessage=q;let h=p;if(p=null,h)for(let e of h)$(e);m({type:`ready`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(p){p.push(a);return}$(a)};", d = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", u], { type: "text/javascript;charset=utf-8" });
|
|
320
|
+
}, u = "var e=`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`,t=`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Effective opacity: scale by zoom^2 for constant visual fill density (Reusser)\n float z = u_zoom * u_insetZoom;\n v_effOpacity = u_opacity * z * z;\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,n=`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`,r=`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;const i=1e-10,a=e=>{let t=e[0],n=e[1],r=e[2],a=e[3],o=t*t+r*r,s=t*n+r*a,c=n*n+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(s)>i){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>i&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+a*_[1])/m),h>i&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+a*_[3])/h),m<=i&&h>i?(v[0]=-v[3],v[2]=v[1]):h<=i&&m>i?(v[1]=-v[2],v[3]=v[0]):m<=i&&h<=i&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},o=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},s=(e,t,n,r,i,a,s)=>{let c=s*s,l=c*s,u=.5*(-s+2*c-l),d=.5*(2-5*c+3*l),f=.5*(s+4*c-3*l),p=.5*(-c+l);for(let o=0;o<a*2;o++)e[o]=u*t[o]+d*n[o]+f*r[o]+p*i[o];return o(e,a),e},c=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=a(r),o=Math.acos(Math.max(-1,Math.min(1,i[0]))),s=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(o*o+s*s)},l=(e,t)=>{let n=e.length,r=new Float32Array(n+1);r[0]=0;let i=new Float32Array(t*2),a=new Float32Array(t*2);for(let o=0;o<n;o++){let l=(o-1+n)%n,u=o,d=(o+1)%n,f=(o+2)%n,p=0;s(i,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;s(a,e[l],e[u],e[d],e[f],t,r),p+=c(i,a,t),i.set(a)}r[o+1]=r[o]+p}let o=r[n];if(o>1e-10)for(let e=1;e<=n;e++)r[e]=r[e]/o;return r},u=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},d=(e,t,n,r,i)=>{let a=t.length,{segment:o,localT:c}=u(n,i),l=(o-1+a)%a,d=o,f=(o+1)%a,p=(o+2)%a;return s(e,t[l],t[d],t[f],t[p],r,c)};let f=null,p=[];const m=(e,t)=>{self.postMessage(e,t??[])},h=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},_=(e,t,n)=>e.getUniformLocation(t,n),v=(e,t,n,r)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let i=t*r,a=n*r,o=i*a*.5/e,s=Math.sqrt(o/Math.PI),c=r,l,u;return s>=c?(l=s,u=1):(l=c,u=Math.max(.01,o/(Math.PI*c*c))),{pointSize:2*l/a,opacity:u}},y=(e,t)=>e*f.dpr/t,b=(e,t)=>{let{style:n,numPoints:r,dpr:i}=f;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:y(n.pointSize,t),opacity:n.opacity,color:n.color};let a=v(r,e/i,t/i,i);return{pointSize:n.pointSize===`auto`?a.pointSize:y(n.pointSize,t),opacity:n.opacity===`auto`?a.opacity:n.opacity,color:n.color}};let x=null;const S=(e,t,n,r)=>{(!x||x.length!==r*2)&&(x=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2/s;x[o]=c*u,x[r+o]=l*u;let d=-t[o]/s-.5;i+=d*c*2,a+=d*l*2}return{weights:x,biasX:i,biasY:a}},C=(e,t,n)=>{if(!f)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=f,o=f.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let c=o.createTexture();o.bindTexture(o.TEXTURE_2D,c),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let l=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,l),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,c,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),f.hdrFbos[e]=l,f.hdrTextures[e]=c,f.hdrSizes[e]=[t,n]},w=(e,t)=>{if(!f)return;let n=f.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=f.mainView.gl;f.blitFbo&&r.deleteFramebuffer(f.blitFbo),f.blitTexture&&r.deleteTexture(f.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),f.blitFbo=a,f.blitTexture=i,f.blitSize=[e,t]};let T=null,E=0,D=null,O=!1,k=null;const A=()=>{if(!D||!f)return!0;let e=f.mainView.gl;return e.clientWaitSync(D,0,0)===e.TIMEOUT_EXPIRED?!1:(e.deleteSync(D),D=null,!0)},j=()=>{if(!A())return O=!0,k||=setTimeout(function(){k=null,O&&f&&!T&&j()},2),!1;if(O=!1,U(),f){let e=f.mainView.gl;D=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},M=e=>{if(!T||!f?.tour)return;let t=T.prevTime===null?void 0:e-T.prevTime;if(t!==void 0){let e=t/1e3*T.speed*T.direction/20,n=f.tour.position+e;n-=Math.floor(n),f.tour.position=n}T.prevTime=e,f.directBasis=null,j()&&(T.lastRenderedRafTime!==null&&T.frameTimes.push(e-T.lastRenderedRafTime),T.lastRenderedRafTime=e),e-E>=33&&(m({type:`playbackTick`,position:f.tour.position,frameMs:t}),E=e),T.rafId=requestAnimationFrame(M)},N=(e,t)=>{T?(T.speed=e,T.direction=t):(D=null,O=!1,T={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},T.rafId=requestAnimationFrame(M))},P=()=>{if(T){cancelAnimationFrame(T.rafId),f?.tour&&m({type:`playbackTick`,position:f.tour.position});let e=Float64Array.from(T.frameTimes);m({type:`playbackStopped`,frameTimes:e},[e.buffer]),T=null}},F=(e,t,n,r,i,a)=>{if(!f||!f.dataTexture||!f.normMins||!f.normRanges)return;let{numPoints:o,numDims:s,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d}=f,p=f.mainView.gl,{weights:m,biasX:h,biasY:g}=S(e,f.normMins,f.normRanges,s),_=b(t,n),v=f.backgroundColor,y=.2126*v[0]+.7152*v[1]+.0722*v[2],x=f.colorMode>0,w=!x&&y>.5,T;T=x||w?1:0;let E=t/n||1;if(C(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,f.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(v[0],v[1],v[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(c),p.enable(p.BLEND),x?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):w?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.dataTexture),p.uniform1i(l.u_data,0),p.activeTexture(p.TEXTURE1),f.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,f.colorLutTexture),p.uniform1i(l.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),f.selectionTexture&&p.bindTexture(p.TEXTURE_2D,f.selectionTexture),p.uniform1i(l.u_selectionTex,2),p.activeTexture(p.TEXTURE3),f.colorMode===2&&f.activeCatColumnName){let e=f.catIndexTextures.get(f.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(l.u_catIndexTex,3);let e=new Float32Array(128),t=new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=m[n],t[n]=m[s+n];p.uniform1fv(l.u_adjBasisX,e),p.uniform1fv(l.u_adjBasisY,t),p.uniform2f(l.u_bias,h,g),p.uniform1f(l.u_pointSize,_.pointSize),p.uniform1f(l.u_opacity,_.opacity),p.uniform4f(l.u_color,_.color[0],_.color[1],_.color[2],1),p.uniform1f(l.u_useSubtractive,w?1:0),p.uniform2f(l.u_pan,i.panX,i.panY),p.uniform1f(l.u_zoom,i.zoom),p.uniform1f(l.u_aspect,E),p.uniform1f(l.u_viewportHeight,n),p.uniform1f(l.u_insetOffsetY,i.insetOffsetY),p.uniform1f(l.u_insetZoom,i.insetZoom),p.uniform1i(l.u_numPoints,o),p.uniform1i(l.u_numDims,s),p.uniform1i(l.u_maxPoints,f.maxPoints),p.uniform1i(l.u_texWidth,f.texWidth),p.uniform1i(l.u_colorMode,f.colorMode),p.uniform1i(l.u_colorColumnIndex,f.colorColumnIndex),p.uniform1f(l.u_colorMin,f.colorMin),p.uniform1f(l.u_colorRange,f.colorRange),p.uniform1i(l.u_colorNumStops,f.colorNumStops),p.uniform1f(l.u_useSelectionMask,f.styleFlags.useSelectionMask?1:0),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(u),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.hdrTextures[r]),p.uniform1i(d.u_hdrTexture,0),p.uniform1f(d.u_mode,T),p.drawArrays(p.TRIANGLES,0,3)};let I=!1,L=null,R=null;const z=(e,t)=>{if(!f?.dataTexture)return;let n=f.previewCanvases.get(e);if(!n){m({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){m({type:`rendered`,viewIndex:e});return}let a=f.mainView.gl;w(r,i),F(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},f.blitFbo);let o=r*i*4,s=r*4;(!L||L.length<o)&&(L=new Uint8Array(o)),(!R||R.length<s)&&(R=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,f.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,L),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;R.set(L.subarray(t,t+s)),L.copyWithin(t,n,n+s),L.set(R,n)}let c=new ImageData(new Uint8ClampedArray(L.buffer,0,o),r,i);n.ctx2d.putImageData(c,0,0),m({type:`rendered`,viewIndex:e})},B=()=>{if(!f?.dataTexture||!f.tour)return;let{tour:e}=f;for(let[t]of f.previewCanvases)t>=e.bases.length||z(t,e.bases[t])},V=()=>{I||(I=!0,setTimeout(()=>{I=!1,B()},0))},H=()=>{f?.dataTexture&&(U(),V())},U=()=>{if(!f?.dataTexture)return;let{canvas:e}=f.mainView;if(f.directBasis){F(f.directBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(!f.tour)return;let{tour:t}=f;d(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position),F(t.interpolatedBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0})},W=()=>{f&&(f.tour||f.directBasis)&&f.dataTexture&&H()},G=()=>{f&&(f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H())};let K=0;const q=e=>{if(!f)return;let t=f.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,a),f.colorMode=1,f.colorColumnIndex=n,f.colorMin=r,f.colorRange=i,f.colorNumStops=a.length,f.activeCatColumnName=null,W();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,palette:r}=e.data;if(!f.catIndexTextures.has(n))return;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,r),f.colorMode=2,f.colorNumStops=r.length,f.activeCatColumnName=n,W();return}if(e.data.type===`setColor2D`){console.warn(`2D colormaps are not supported in the WebGL backend`);return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=f,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),c=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<c;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),G();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,selectedLabels:r}=e.data,i=f.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=f,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),G();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,categoricalColumns:c}=e.data;if(K=n,r<2||i===0||a.length<2){m({type:`error`,message:`Need at least 2 dimensions to render`});return}f.dataTexture&&(t.deleteTexture(f.dataTexture),f.dataTexture=null),f.colorLutTexture&&(t.deleteTexture(f.colorLutTexture),f.colorLutTexture=null);for(let e of f.catIndexTextures.values())t.deleteTexture(e);f.catIndexTextures.clear(),f.selectionTexture&&(t.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags={useSelectionMask:!1},f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,f.categoricalBuffers.clear(),f.dataBuffers=a,f.normMins=new Float32Array(o),f.normRanges=new Float32Array(s),f.numPoints=i,f.numDims=r;let u=t.getParameter(t.MAX_TEXTURE_SIZE),d=Math.min(i,u),p=Math.ceil(i/d);f.texWidth=d;let h=t.createTexture();t.bindTexture(t.TEXTURE_2D,h);let g=r*p,_=new Float32Array(d*g);for(let e=0;e<r;e++){let t=a[e],n=e*p;for(let e=0;e<i;e++){let r=e%d,i=n+Math.floor(e/d);_[i*d+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,d,g,0,t.RED,t.FLOAT,_),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),f.dataTexture=h;for(let e of c)f.categoricalBuffers.set(e.name,e.indices),f.catIndexTextures.set(e.name,Y(t,e.indices,i,d));if(f.tour&&f.tour.dims===r)H();else{let e=Math.max(1,f.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}f.tour={bases:t,arcLengths:l(t,r),dims:r,position:0,interpolatedBasis:new Float32Array(r*2)},H()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!f)return;f.selectionTexture&&e.deleteTexture(f.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),f.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=e=>{if(!f||!f.normMins||!f.normRanges||f.numPoints===0)return;let{numPoints:t,numDims:n,dataBuffers:r,camera:i}=f,a=e.length/2;if(a<3)return;let o=null;if(f.directBasis)o=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),o=e.interpolatedBasis}if(!o)return;let{weights:s,biasX:c,biasY:l}=S(o,f.normMins,f.normRanges,n),u=f.mainView.canvas,p=u.width/u.height||1,h=i.insetZoom,g=i.zoom*h,_=new Float32Array(e.length);for(let t=0;t<a;t++)_[t*2]=e[t*2]*p/g-i.panX,_[t*2+1]=(e[t*2+1]-i.insetOffsetY)/g-i.panY;let v=new Uint32Array(Math.ceil(t/32));for(let e=0;e<t;e++){let t=c,i=l;for(let a=0;a<n;a++){let o=r[a][e];t+=o*s[a],i+=o*s[n+a]}Z(t,i,_,a)&&(v[e>>5]=v[e>>5]|0|1<<(e&31))}let y=f.mainView.gl;X(y,v),G();let b=new Uint32Array(v);m({type:`selectionResult`,mask:b},[b.buffer])},ee=()=>{if(!f)return 0;let e=0;if(f.dataTexture){let t=Math.ceil(f.numPoints/f.texWidth);e+=f.texWidth*f.numDims*t*4}for(let t=0;t<f.hdrSizes.length;t++){let n=f.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}f.blitSize&&(e+=f.blitSize[0]*f.blitSize[1]*4),f.colorLutTexture&&(e+=f.colorNumStops*4);for(let t of f.categoricalBuffers.values())e+=t.byteLength;return f.selectionTexture&&(e+=Math.ceil(f.numPoints/32)*4),e},te=()=>{if(!f)return;let e=0;for(let t of f.dataBuffers)e+=t.byteLength;for(let t of f.categoricalBuffers.values())e+=t.byteLength;if(f.normMins&&(e+=f.normMins.byteLength),f.normRanges&&(e+=f.normRanges.byteLength),f.tour){for(let t of f.tour.bases)e+=t.byteLength;e+=f.tour.interpolatedBasis.byteLength}m({type:`metricsResult`,gpuMemoryBytes:ee(),numPoints:f.numPoints,numDims:f.numDims,workerJsHeapBytes:e})},ne=e=>{if(!f||!f.tour||!f.dataTexture||f.numPoints===0){m({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=f.mainView.gl,{numPoints:n,numDims:r,tour:i}=f,a=i.position;f.directBasis=null;let o=new Uint8Array(4),s=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position),F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s();let c=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position);let n=performance.now();F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s(),c[t]=performance.now()-n}i.position=a,m({type:`benchmarkResult`,frameTimes:c,numPoints:n,numDims:r},[c.buffer])},$=e=>{if(f){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2;f.tour={bases:t,arcLengths:l(t,n),dims:n,position:f.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},f.dataTexture&&H();return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;f.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&z(e.id,f.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){f.previewCanvases.delete(e.id);return}if(e.type===`setTourPosition`){if(!f.tour)return;f.tour.position=e.position,f.directBasis=null,j();return}if(e.type===`setStyle`){f.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color},(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setCamera`){f.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:f.camera.aspect,viewportHeight:f.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},U();return}if(e.type===`resize`){e.dpr!==void 0&&(f.dpr=e.dpr),e.viewIndex===0&&(f.mainView.canvas.width=e.width,f.mainView.canvas.height=e.height,(f.tour||f.directBasis)&&f.dataTexture&&U());return}if(e.type===`render`){(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setDirectBasis`){if(!f.dataTexture)return;f.directBasis=e.basis,F(e.basis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(e.type===`clearColors`){f.colorLutTexture&&(f.mainView.gl.deleteTexture(f.colorLutTexture),f.colorLutTexture=null),f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setBackgroundColor`){f.backgroundColor=e.color,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setMaxPoints`){f.maxPoints=e.maxPoints,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setSelectionMask`){let t=f.mainView.gl;X(t,e.mask),f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H();let n=new Uint32Array(e.mask);m({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){f.selectionTexture&&(f.mainView.gl.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags.useSelectionMask=!1,(f.tour||f.directBasis)&&f.dataTexture&&H(),m({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`startPlayback`){if(!f.tour)return;N(e.speed,e.direction);return}if(e.type===`stopPlayback`){P();return}if(e.type===`computePCA`){m({type:`error`,message:`PCA not yet implemented in WebGL backend`});return}if(e.type===`lassoSelect`){Q(e.polygon);return}if(e.type===`getProjectedPositions`){if(!f||!f.normMins||!f.normRanges||f.numPoints===0){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{numPoints:e,numDims:t,dataBuffers:n}=f,r=null;if(f.directBasis)r=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position),r=e.interpolatedBasis}if(!r){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{weights:i,biasX:a,biasY:o}=S(r,f.normMins,f.normRanges,t),s=new Float32Array(e*2);for(let r=0;r<e;r++){let e=a,c=o;for(let a=0;a<t;a++){let o=n[a][r];e+=o*i[a],c+=o*i[t+a]}s[r*2]=e,s[r*2+1]=c}m({type:`projectedPositions`,positions:s},[s.buffer]);return}if(e.type===`getPointData`){if(!f||f.numPoints===0){m({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{numDims:t,dataBuffers:n}=f,r=e.pointIndex;if(r<0||r>=f.numPoints){m({type:`pointData`,pointIndex:r,numericValues:{},categoricalValues:{}});return}let i={};for(let e=0;e<t;e++)i[String(e)]=n[e][r];let a={};for(let[e,t]of f.categoricalBuffers)a[e]=t[r];m({type:`pointData`,pointIndex:r,numericValues:i,categoricalValues:a});return}if(e.type===`benchmark`){ne(e.numFrames);return}if(e.type===`getMetrics`){te();return}}};self.onmessage=i=>{let a=i.data;if(a.type===`init`){try{let i=a.canvas,o=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!o)throw Error(`WebGL2 not supported`);o.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),o.getExtension(`OES_texture_float_linear`);let s=o,c=g(s,t,e),l={u_data:_(s,c,`u_data`),u_adjBasisX:_(s,c,`u_adjBasisX`),u_adjBasisY:_(s,c,`u_adjBasisY`),u_bias:_(s,c,`u_bias`),u_pointSize:_(s,c,`u_pointSize`),u_opacity:_(s,c,`u_opacity`),u_color:_(s,c,`u_color`),u_useSubtractive:_(s,c,`u_useSubtractive`),u_pan:_(s,c,`u_pan`),u_zoom:_(s,c,`u_zoom`),u_aspect:_(s,c,`u_aspect`),u_viewportHeight:_(s,c,`u_viewportHeight`),u_insetOffsetY:_(s,c,`u_insetOffsetY`),u_insetZoom:_(s,c,`u_insetZoom`),u_numPoints:_(s,c,`u_numPoints`),u_numDims:_(s,c,`u_numDims`),u_maxPoints:_(s,c,`u_maxPoints`),u_texWidth:_(s,c,`u_texWidth`),u_colorMode:_(s,c,`u_colorMode`),u_colorColumnIndex:_(s,c,`u_colorColumnIndex`),u_colorMin:_(s,c,`u_colorMin`),u_colorRange:_(s,c,`u_colorRange`),u_colorNumStops:_(s,c,`u_colorNumStops`),u_colorLutTex:_(s,c,`u_colorLutTex`),u_catIndexTex:_(s,c,`u_catIndexTex`),u_useSelectionMask:_(s,c,`u_useSelectionMask`),u_selectionTex:_(s,c,`u_selectionTex`)},u=g(s,r,n),d={u_hdrTexture:_(s,u,`u_hdrTexture`),u_mode:_(s,u,`u_mode`)};f={mainView:{canvas:i,gl:o},previewCanvases:new Map,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9]},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,camera:{panX:0,panY:0,zoom:a.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:a.dpr,maxPoints:0,texWidth:0},a.dataPort.onmessage=q;let h=p;if(p=null,h)for(let e of h)$(e);m({type:`ready`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(p){p.push(a);return}$(a)};", d = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", u], { type: "text/javascript;charset=utf-8" });
|
|
290
321
|
function f(e) {
|
|
291
322
|
let t;
|
|
292
323
|
try {
|
|
@@ -433,14 +464,21 @@ var p = (e, t, n) => {
|
|
|
433
464
|
...n ? { theme: n } : {},
|
|
434
465
|
...r ? { colorMap: r } : {}
|
|
435
466
|
});
|
|
436
|
-
}, T = (e) => {
|
|
467
|
+
}, T = (e, t, n = "schumann") => {
|
|
468
|
+
m(o, {
|
|
469
|
+
type: "encodeColor2D",
|
|
470
|
+
columnX: e,
|
|
471
|
+
columnY: t,
|
|
472
|
+
colormap: n
|
|
473
|
+
});
|
|
474
|
+
}, E = (e) => {
|
|
437
475
|
p(a, {
|
|
438
476
|
type: "setBackgroundColor",
|
|
439
477
|
color: e
|
|
440
478
|
});
|
|
441
|
-
},
|
|
479
|
+
}, D = () => {
|
|
442
480
|
p(a, { type: "clearColors" });
|
|
443
|
-
},
|
|
481
|
+
}, O = (e, t) => {
|
|
444
482
|
let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
|
|
445
483
|
n && r.push(n.buffer), m(o, {
|
|
446
484
|
type: "selectByColumn",
|
|
@@ -448,55 +486,55 @@ var p = (e, t, n) => {
|
|
|
448
486
|
labelIndices: t.labelIndices,
|
|
449
487
|
valueRanges: n
|
|
450
488
|
}, r);
|
|
451
|
-
},
|
|
489
|
+
}, k = (e) => {
|
|
452
490
|
p(a, {
|
|
453
491
|
type: "setSelectionMask",
|
|
454
492
|
mask: e
|
|
455
493
|
}, [e.buffer]);
|
|
456
|
-
},
|
|
494
|
+
}, A = (e) => {
|
|
457
495
|
p(a, {
|
|
458
496
|
type: "lassoSelect",
|
|
459
497
|
polygon: e
|
|
460
498
|
}, [e.buffer]);
|
|
461
|
-
}, A = () => {
|
|
462
|
-
p(a, { type: "clearSelectionMask" });
|
|
463
499
|
}, j = () => {
|
|
500
|
+
p(a, { type: "clearSelectionMask" });
|
|
501
|
+
}, M = () => {
|
|
464
502
|
p(a, { type: "computePCA" });
|
|
465
|
-
},
|
|
503
|
+
}, N = (e, t) => {
|
|
466
504
|
p(a, {
|
|
467
505
|
type: "startPlayback",
|
|
468
506
|
speed: e,
|
|
469
507
|
direction: t
|
|
470
508
|
});
|
|
471
|
-
},
|
|
509
|
+
}, P = () => {
|
|
472
510
|
p(a, { type: "stopPlayback" });
|
|
473
|
-
},
|
|
511
|
+
}, F = (e) => {
|
|
474
512
|
p(a, {
|
|
475
513
|
type: "setMaxPoints",
|
|
476
514
|
maxPoints: e
|
|
477
515
|
});
|
|
478
|
-
},
|
|
516
|
+
}, I = (e, t) => {
|
|
479
517
|
let n = t.transferControlToOffscreen();
|
|
480
518
|
p(a, {
|
|
481
519
|
type: "addPreviewCanvas",
|
|
482
520
|
id: e,
|
|
483
521
|
canvas: n
|
|
484
522
|
}, [n]);
|
|
485
|
-
},
|
|
523
|
+
}, L = (e) => {
|
|
486
524
|
p(a, {
|
|
487
525
|
type: "removePreviewCanvas",
|
|
488
526
|
id: e
|
|
489
527
|
});
|
|
490
|
-
},
|
|
491
|
-
let n =
|
|
528
|
+
}, R = () => {}, z = () => {}, B = (e) => {}, V = (e = 120) => new Promise((t) => {
|
|
529
|
+
let n = U((e) => {
|
|
492
530
|
e.type === "benchmarkResult" && (n(), t(e));
|
|
493
531
|
});
|
|
494
532
|
p(a, {
|
|
495
533
|
type: "benchmark",
|
|
496
534
|
numFrames: e
|
|
497
535
|
});
|
|
498
|
-
}),
|
|
499
|
-
let t =
|
|
536
|
+
}), H = () => new Promise((e) => {
|
|
537
|
+
let t = U((n) => {
|
|
500
538
|
if (n.type !== "metricsResult") return;
|
|
501
539
|
t();
|
|
502
540
|
let r = typeof performance < "u" && "memory" in performance ? performance.memory.usedJSHeapSize : void 0, i = Number.isFinite(r) ? r : null, a = Number.isFinite(n.workerJsHeapBytes) ? n.workerJsHeapBytes : null;
|
|
@@ -507,7 +545,7 @@ var p = (e, t, n) => {
|
|
|
507
545
|
});
|
|
508
546
|
});
|
|
509
547
|
p(a, { type: "getMetrics" });
|
|
510
|
-
}),
|
|
548
|
+
}), U = (e) => (c.add(e), () => c.delete(e)), W;
|
|
511
549
|
return {
|
|
512
550
|
loadData: g,
|
|
513
551
|
setBases: _,
|
|
@@ -518,24 +556,41 @@ var p = (e, t, n) => {
|
|
|
518
556
|
render: S,
|
|
519
557
|
setDirectBasis: C,
|
|
520
558
|
encodeColor: w,
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
559
|
+
encodeColor2D: T,
|
|
560
|
+
setBackgroundColor: E,
|
|
561
|
+
clearColor: D,
|
|
562
|
+
selectByColumn: O,
|
|
563
|
+
setSelectionMask: k,
|
|
564
|
+
lassoSelect: A,
|
|
565
|
+
clearSelection: j,
|
|
566
|
+
getProjectedPositions: () => (W && W.unsub(), new Promise((e) => {
|
|
567
|
+
let t = U((n) => {
|
|
568
|
+
n.type === "projectedPositions" && (t(), W = void 0, e(n.positions));
|
|
569
|
+
});
|
|
570
|
+
W = { unsub: t }, p(a, { type: "getProjectedPositions" });
|
|
571
|
+
})),
|
|
572
|
+
getPointData: (e) => new Promise((t) => {
|
|
573
|
+
let n = U((r) => {
|
|
574
|
+
r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
|
|
575
|
+
});
|
|
576
|
+
p(a, {
|
|
577
|
+
type: "getPointData",
|
|
578
|
+
pointIndex: e
|
|
579
|
+
});
|
|
580
|
+
}),
|
|
581
|
+
computePCA: M,
|
|
582
|
+
startPlayback: N,
|
|
583
|
+
stopPlayback: P,
|
|
584
|
+
setMaxPoints: F,
|
|
585
|
+
addPreviewCanvas: I,
|
|
586
|
+
removePreviewCanvas: L,
|
|
587
|
+
resizePreview: () => {},
|
|
588
|
+
enable3d: R,
|
|
589
|
+
disable3d: z,
|
|
590
|
+
set3dRotation: B,
|
|
591
|
+
benchmark: V,
|
|
592
|
+
getMetrics: H,
|
|
593
|
+
subscribe: U,
|
|
539
594
|
destroy: () => {
|
|
540
595
|
a.terminate(), o.terminate(), c.clear();
|
|
541
596
|
}
|
|
@@ -2497,7 +2552,724 @@ var p = (e, t, n) => {
|
|
|
2497
2552
|
253,
|
|
2498
2553
|
191
|
|
2499
2554
|
]
|
|
2500
|
-
], A = (
|
|
2555
|
+
], A = new Float32Array(16), j = [
|
|
2556
|
+
"schumann",
|
|
2557
|
+
"bremm",
|
|
2558
|
+
"steiger",
|
|
2559
|
+
"ziegler",
|
|
2560
|
+
"teulingfig2",
|
|
2561
|
+
"cubediagonal",
|
|
2562
|
+
"oklab_polar"
|
|
2563
|
+
], M = {
|
|
2564
|
+
schumann: 0,
|
|
2565
|
+
bremm: 1,
|
|
2566
|
+
steiger: 2,
|
|
2567
|
+
ziegler: 3,
|
|
2568
|
+
teulingfig2: 4,
|
|
2569
|
+
cubediagonal: 5,
|
|
2570
|
+
oklab_polar: 6
|
|
2571
|
+
}, N = [
|
|
2572
|
+
{
|
|
2573
|
+
r_x: [
|
|
2574
|
+
-0,
|
|
2575
|
+
-1.5085,
|
|
2576
|
+
-3.017,
|
|
2577
|
+
-4.5255,
|
|
2578
|
+
-6.034,
|
|
2579
|
+
-7.5425,
|
|
2580
|
+
-9.051,
|
|
2581
|
+
-10.5595,
|
|
2582
|
+
-12.068,
|
|
2583
|
+
-13.4877,
|
|
2584
|
+
-14.9075,
|
|
2585
|
+
-16.3272,
|
|
2586
|
+
-17.747,
|
|
2587
|
+
-19.1668,
|
|
2588
|
+
-20.5865,
|
|
2589
|
+
-22.0063
|
|
2590
|
+
],
|
|
2591
|
+
r_y: [
|
|
2592
|
+
-.0442,
|
|
2593
|
+
-.0442,
|
|
2594
|
+
-.0442,
|
|
2595
|
+
-.0442,
|
|
2596
|
+
-.0442,
|
|
2597
|
+
-.0442,
|
|
2598
|
+
-.0442,
|
|
2599
|
+
-.0442,
|
|
2600
|
+
-.0442,
|
|
2601
|
+
-.0442,
|
|
2602
|
+
-.0442,
|
|
2603
|
+
-.0442,
|
|
2604
|
+
-.0442,
|
|
2605
|
+
-.0442,
|
|
2606
|
+
-.0442,
|
|
2607
|
+
-.0442
|
|
2608
|
+
],
|
|
2609
|
+
g_x: [
|
|
2610
|
+
-12.9953,
|
|
2611
|
+
-12.9953,
|
|
2612
|
+
-12.9953,
|
|
2613
|
+
-12.9953,
|
|
2614
|
+
-12.9953,
|
|
2615
|
+
-12.9953,
|
|
2616
|
+
-12.9953,
|
|
2617
|
+
-12.9953,
|
|
2618
|
+
-12.9953,
|
|
2619
|
+
-12.9953,
|
|
2620
|
+
-12.9953,
|
|
2621
|
+
-12.9953,
|
|
2622
|
+
-12.9953,
|
|
2623
|
+
-12.9953,
|
|
2624
|
+
-12.9953,
|
|
2625
|
+
-12.9953
|
|
2626
|
+
],
|
|
2627
|
+
g_y: [
|
|
2628
|
+
-.076,
|
|
2629
|
+
-.0709,
|
|
2630
|
+
-.0661,
|
|
2631
|
+
-.061,
|
|
2632
|
+
-.0561,
|
|
2633
|
+
-.051,
|
|
2634
|
+
-.0462,
|
|
2635
|
+
-.041,
|
|
2636
|
+
-.0359,
|
|
2637
|
+
-.0308,
|
|
2638
|
+
-.0257,
|
|
2639
|
+
-.0205,
|
|
2640
|
+
-.0154,
|
|
2641
|
+
-.0103,
|
|
2642
|
+
-.0051,
|
|
2643
|
+
0
|
|
2644
|
+
],
|
|
2645
|
+
b_x: [
|
|
2646
|
+
-11.3581,
|
|
2647
|
+
-11.3581,
|
|
2648
|
+
-11.3581,
|
|
2649
|
+
-11.3581,
|
|
2650
|
+
-11.3581,
|
|
2651
|
+
-11.3581,
|
|
2652
|
+
-11.3581,
|
|
2653
|
+
-11.3581,
|
|
2654
|
+
-11.3581,
|
|
2655
|
+
-11.3581,
|
|
2656
|
+
-11.3581,
|
|
2657
|
+
-11.3581,
|
|
2658
|
+
-11.3581,
|
|
2659
|
+
-11.3581,
|
|
2660
|
+
-11.3581,
|
|
2661
|
+
-11.3581
|
|
2662
|
+
],
|
|
2663
|
+
b_y: [
|
|
2664
|
+
-.0442,
|
|
2665
|
+
-.0442,
|
|
2666
|
+
-.0442,
|
|
2667
|
+
-.0442,
|
|
2668
|
+
-.0442,
|
|
2669
|
+
-.0442,
|
|
2670
|
+
-.0442,
|
|
2671
|
+
-.0442,
|
|
2672
|
+
-.0442,
|
|
2673
|
+
-.0442,
|
|
2674
|
+
-.0442,
|
|
2675
|
+
-.0442,
|
|
2676
|
+
-.0442,
|
|
2677
|
+
-.0442,
|
|
2678
|
+
-.0442,
|
|
2679
|
+
-.0442
|
|
2680
|
+
]
|
|
2681
|
+
},
|
|
2682
|
+
{
|
|
2683
|
+
r_x: [
|
|
2684
|
+
-15.2067,
|
|
2685
|
+
-15.095,
|
|
2686
|
+
-14.9554,
|
|
2687
|
+
-14.7857,
|
|
2688
|
+
-14.5812,
|
|
2689
|
+
-14.3334,
|
|
2690
|
+
-14.0291,
|
|
2691
|
+
-13.6663,
|
|
2692
|
+
-13.2288,
|
|
2693
|
+
-12.7355,
|
|
2694
|
+
-12.1699,
|
|
2695
|
+
-11.5268,
|
|
2696
|
+
-10.802,
|
|
2697
|
+
-9.9949,
|
|
2698
|
+
-9.1075,
|
|
2699
|
+
-8.1425
|
|
2700
|
+
],
|
|
2701
|
+
r_y: [
|
|
2702
|
+
-.0066,
|
|
2703
|
+
-.0112,
|
|
2704
|
+
-.0161,
|
|
2705
|
+
-.021,
|
|
2706
|
+
-.026,
|
|
2707
|
+
-.031,
|
|
2708
|
+
-.036,
|
|
2709
|
+
-.0408,
|
|
2710
|
+
-.0449,
|
|
2711
|
+
-.0486,
|
|
2712
|
+
-.0521,
|
|
2713
|
+
-.0554,
|
|
2714
|
+
-.0586,
|
|
2715
|
+
-.0617,
|
|
2716
|
+
-.0647,
|
|
2717
|
+
-.0676
|
|
2718
|
+
],
|
|
2719
|
+
g_x: [
|
|
2720
|
+
-10.7187,
|
|
2721
|
+
-10.7357,
|
|
2722
|
+
-10.755,
|
|
2723
|
+
-10.7798,
|
|
2724
|
+
-10.8079,
|
|
2725
|
+
-10.8405,
|
|
2726
|
+
-10.8775,
|
|
2727
|
+
-10.92,
|
|
2728
|
+
-10.9701,
|
|
2729
|
+
-11.0227,
|
|
2730
|
+
-11.0828,
|
|
2731
|
+
-11.147,
|
|
2732
|
+
-11.2183,
|
|
2733
|
+
-11.2958,
|
|
2734
|
+
-11.3803,
|
|
2735
|
+
-11.4703
|
|
2736
|
+
],
|
|
2737
|
+
g_y: [
|
|
2738
|
+
-.054,
|
|
2739
|
+
-.0531,
|
|
2740
|
+
-.0521,
|
|
2741
|
+
-.0511,
|
|
2742
|
+
-.0499,
|
|
2743
|
+
-.0487,
|
|
2744
|
+
-.0473,
|
|
2745
|
+
-.0459,
|
|
2746
|
+
-.0442,
|
|
2747
|
+
-.0425,
|
|
2748
|
+
-.0405,
|
|
2749
|
+
-.0383,
|
|
2750
|
+
-.0359,
|
|
2751
|
+
-.0331,
|
|
2752
|
+
-.0298,
|
|
2753
|
+
-.0259
|
|
2754
|
+
],
|
|
2755
|
+
b_x: [
|
|
2756
|
+
-2.3509,
|
|
2757
|
+
-4.0466,
|
|
2758
|
+
-5.3978,
|
|
2759
|
+
-6.6213,
|
|
2760
|
+
-7.7862,
|
|
2761
|
+
-8.9196,
|
|
2762
|
+
-10.0363,
|
|
2763
|
+
-11.1469,
|
|
2764
|
+
-12.2854,
|
|
2765
|
+
-13.3981,
|
|
2766
|
+
-14.5092,
|
|
2767
|
+
-15.6231,
|
|
2768
|
+
-16.7524,
|
|
2769
|
+
-17.8862,
|
|
2770
|
+
-19.025,
|
|
2771
|
+
-20.1748
|
|
2772
|
+
],
|
|
2773
|
+
b_y: [
|
|
2774
|
+
-.0437,
|
|
2775
|
+
-.0438,
|
|
2776
|
+
-.0438,
|
|
2777
|
+
-.0439,
|
|
2778
|
+
-.0439,
|
|
2779
|
+
-.044,
|
|
2780
|
+
-.0441,
|
|
2781
|
+
-.0441,
|
|
2782
|
+
-.0442,
|
|
2783
|
+
-.0443,
|
|
2784
|
+
-.0444,
|
|
2785
|
+
-.0444,
|
|
2786
|
+
-.0445,
|
|
2787
|
+
-.0446,
|
|
2788
|
+
-.0447,
|
|
2789
|
+
-.0448
|
|
2790
|
+
]
|
|
2791
|
+
},
|
|
2792
|
+
{
|
|
2793
|
+
r_x: [
|
|
2794
|
+
-21.9278,
|
|
2795
|
+
-21.3484,
|
|
2796
|
+
-20.7628,
|
|
2797
|
+
-20.1344,
|
|
2798
|
+
-19.4757,
|
|
2799
|
+
-18.7856,
|
|
2800
|
+
-18.0477,
|
|
2801
|
+
-17.2595,
|
|
2802
|
+
-16.3843,
|
|
2803
|
+
-15.4484,
|
|
2804
|
+
-14.4257,
|
|
2805
|
+
-13.2751,
|
|
2806
|
+
-11.9456,
|
|
2807
|
+
-10.3735,
|
|
2808
|
+
-8.3553,
|
|
2809
|
+
-5.2147
|
|
2810
|
+
],
|
|
2811
|
+
r_y: [
|
|
2812
|
+
-.0407,
|
|
2813
|
+
-.0417,
|
|
2814
|
+
-.0426,
|
|
2815
|
+
-.0433,
|
|
2816
|
+
-.0439,
|
|
2817
|
+
-.0443,
|
|
2818
|
+
-.0447,
|
|
2819
|
+
-.045,
|
|
2820
|
+
-.0451,
|
|
2821
|
+
-.0452,
|
|
2822
|
+
-.0452,
|
|
2823
|
+
-.0451,
|
|
2824
|
+
-.045,
|
|
2825
|
+
-.0447,
|
|
2826
|
+
-.0444,
|
|
2827
|
+
-.044
|
|
2828
|
+
],
|
|
2829
|
+
g_x: [
|
|
2830
|
+
-13.0812,
|
|
2831
|
+
-13.0665,
|
|
2832
|
+
-13.0508,
|
|
2833
|
+
-13.0388,
|
|
2834
|
+
-13.0293,
|
|
2835
|
+
-13.0203,
|
|
2836
|
+
-13.0133,
|
|
2837
|
+
-13.0087,
|
|
2838
|
+
-13.0068,
|
|
2839
|
+
-13.0092,
|
|
2840
|
+
-13.0125,
|
|
2841
|
+
-13.0162,
|
|
2842
|
+
-13.0269,
|
|
2843
|
+
-13.0372,
|
|
2844
|
+
-13.0532,
|
|
2845
|
+
-13.0708
|
|
2846
|
+
],
|
|
2847
|
+
g_y: [
|
|
2848
|
+
-.0665,
|
|
2849
|
+
-.0634,
|
|
2850
|
+
-.0603,
|
|
2851
|
+
-.0572,
|
|
2852
|
+
-.054,
|
|
2853
|
+
-.0508,
|
|
2854
|
+
-.0476,
|
|
2855
|
+
-.0443,
|
|
2856
|
+
-.0408,
|
|
2857
|
+
-.0373,
|
|
2858
|
+
-.0337,
|
|
2859
|
+
-.0299,
|
|
2860
|
+
-.0258,
|
|
2861
|
+
-.0211,
|
|
2862
|
+
-.0155,
|
|
2863
|
+
-.006
|
|
2864
|
+
],
|
|
2865
|
+
b_x: [
|
|
2866
|
+
-7.2789,
|
|
2867
|
+
-8.4407,
|
|
2868
|
+
-9.4718,
|
|
2869
|
+
-10.4471,
|
|
2870
|
+
-11.3919,
|
|
2871
|
+
-12.3169,
|
|
2872
|
+
-13.2284,
|
|
2873
|
+
-14.1319,
|
|
2874
|
+
-15.0565,
|
|
2875
|
+
-15.9516,
|
|
2876
|
+
-16.8449,
|
|
2877
|
+
-17.7392,
|
|
2878
|
+
-18.6339,
|
|
2879
|
+
-19.5305,
|
|
2880
|
+
-20.4287,
|
|
2881
|
+
-21.3308
|
|
2882
|
+
],
|
|
2883
|
+
b_y: [
|
|
2884
|
+
-.0372,
|
|
2885
|
+
-.0384,
|
|
2886
|
+
-.0395,
|
|
2887
|
+
-.0405,
|
|
2888
|
+
-.0415,
|
|
2889
|
+
-.0424,
|
|
2890
|
+
-.0432,
|
|
2891
|
+
-.044,
|
|
2892
|
+
-.0448,
|
|
2893
|
+
-.0455,
|
|
2894
|
+
-.0462,
|
|
2895
|
+
-.0469,
|
|
2896
|
+
-.0476,
|
|
2897
|
+
-.0482,
|
|
2898
|
+
-.0488,
|
|
2899
|
+
-.0494
|
|
2900
|
+
]
|
|
2901
|
+
},
|
|
2902
|
+
{
|
|
2903
|
+
r_x: [
|
|
2904
|
+
-22.5873,
|
|
2905
|
+
-21.9563,
|
|
2906
|
+
-21.3711,
|
|
2907
|
+
-20.7867,
|
|
2908
|
+
-19.9754,
|
|
2909
|
+
-18.4599,
|
|
2910
|
+
-16.9442,
|
|
2911
|
+
-15.4282,
|
|
2912
|
+
-13.4591,
|
|
2913
|
+
-11.1479,
|
|
2914
|
+
-8.8297,
|
|
2915
|
+
-6.5275,
|
|
2916
|
+
-5.1161,
|
|
2917
|
+
-3.9946,
|
|
2918
|
+
-2.8733,
|
|
2919
|
+
-1.7523
|
|
2920
|
+
],
|
|
2921
|
+
r_y: [
|
|
2922
|
+
-.0419,
|
|
2923
|
+
-.0427,
|
|
2924
|
+
-.0435,
|
|
2925
|
+
-.0443,
|
|
2926
|
+
-.0452,
|
|
2927
|
+
-.0461,
|
|
2928
|
+
-.0471,
|
|
2929
|
+
-.0481,
|
|
2930
|
+
-.0478,
|
|
2931
|
+
-.0462,
|
|
2932
|
+
-.0446,
|
|
2933
|
+
-.0431,
|
|
2934
|
+
-.0419,
|
|
2935
|
+
-.0408,
|
|
2936
|
+
-.0397,
|
|
2937
|
+
-.0387
|
|
2938
|
+
],
|
|
2939
|
+
g_x: [
|
|
2940
|
+
-13.1499,
|
|
2941
|
+
-13.6389,
|
|
2942
|
+
-14.1283,
|
|
2943
|
+
-14.6177,
|
|
2944
|
+
-15.0304,
|
|
2945
|
+
-15.2028,
|
|
2946
|
+
-15.3755,
|
|
2947
|
+
-15.5483,
|
|
2948
|
+
-15.5483,
|
|
2949
|
+
-15.3755,
|
|
2950
|
+
-15.2028,
|
|
2951
|
+
-15.0304,
|
|
2952
|
+
-14.6177,
|
|
2953
|
+
-14.1283,
|
|
2954
|
+
-13.6389,
|
|
2955
|
+
-13.1499
|
|
2956
|
+
],
|
|
2957
|
+
g_y: [
|
|
2958
|
+
-.0679,
|
|
2959
|
+
-.0663,
|
|
2960
|
+
-.0649,
|
|
2961
|
+
-.0634,
|
|
2962
|
+
-.061,
|
|
2963
|
+
-.0553,
|
|
2964
|
+
-.0497,
|
|
2965
|
+
-.0441,
|
|
2966
|
+
-.0373,
|
|
2967
|
+
-.0299,
|
|
2968
|
+
-.0224,
|
|
2969
|
+
-.015,
|
|
2970
|
+
-.0104,
|
|
2971
|
+
-.0069,
|
|
2972
|
+
-.0035,
|
|
2973
|
+
0
|
|
2974
|
+
],
|
|
2975
|
+
b_x: [
|
|
2976
|
+
0,
|
|
2977
|
+
-1.1629,
|
|
2978
|
+
-2.4025,
|
|
2979
|
+
-3.6427,
|
|
2980
|
+
-5.0938,
|
|
2981
|
+
-7.0911,
|
|
2982
|
+
-9.0872,
|
|
2983
|
+
-11.0838,
|
|
2984
|
+
-12.4271,
|
|
2985
|
+
-13.0415,
|
|
2986
|
+
-13.651,
|
|
2987
|
+
-14.263,
|
|
2988
|
+
-13.9595,
|
|
2989
|
+
-13.3667,
|
|
2990
|
+
-12.7641,
|
|
2991
|
+
-12.1687
|
|
2992
|
+
],
|
|
2993
|
+
b_y: [
|
|
2994
|
+
0,
|
|
2995
|
+
-.0049,
|
|
2996
|
+
-.0102,
|
|
2997
|
+
-.0154,
|
|
2998
|
+
-.0216,
|
|
2999
|
+
-.0301,
|
|
3000
|
+
-.0385,
|
|
3001
|
+
-.047,
|
|
3002
|
+
-.0527,
|
|
3003
|
+
-.0553,
|
|
3004
|
+
-.0579,
|
|
3005
|
+
-.0605,
|
|
3006
|
+
-.0592,
|
|
3007
|
+
-.0567,
|
|
3008
|
+
-.0541,
|
|
3009
|
+
-.0516
|
|
3010
|
+
],
|
|
3011
|
+
b_x2: [
|
|
3012
|
+
0,
|
|
3013
|
+
.1737,
|
|
3014
|
+
.3579,
|
|
3015
|
+
.5429,
|
|
3016
|
+
.7486,
|
|
3017
|
+
1.01,
|
|
3018
|
+
1.2709,
|
|
3019
|
+
1.5314,
|
|
3020
|
+
1.3563,
|
|
3021
|
+
.758,
|
|
3022
|
+
.152,
|
|
3023
|
+
-.4504,
|
|
3024
|
+
-.9129,
|
|
3025
|
+
-1.327,
|
|
3026
|
+
-1.7466,
|
|
3027
|
+
-2.1664
|
|
3028
|
+
],
|
|
3029
|
+
b_y2: [
|
|
3030
|
+
0,
|
|
3031
|
+
.0073,
|
|
3032
|
+
.015,
|
|
3033
|
+
.0227,
|
|
3034
|
+
.0314,
|
|
3035
|
+
.0423,
|
|
3036
|
+
.0533,
|
|
3037
|
+
.0642,
|
|
3038
|
+
.0568,
|
|
3039
|
+
.0318,
|
|
3040
|
+
.0064,
|
|
3041
|
+
-.0189,
|
|
3042
|
+
-.0383,
|
|
3043
|
+
-.0556,
|
|
3044
|
+
-.0732,
|
|
3045
|
+
-.0908
|
|
3046
|
+
]
|
|
3047
|
+
},
|
|
3048
|
+
{
|
|
3049
|
+
r_x: [
|
|
3050
|
+
-9.3217,
|
|
3051
|
+
-9.7119,
|
|
3052
|
+
-10.1026,
|
|
3053
|
+
-10.4928,
|
|
3054
|
+
-10.8832,
|
|
3055
|
+
-11.2736,
|
|
3056
|
+
-11.6641,
|
|
3057
|
+
-12.0545,
|
|
3058
|
+
-12.4564,
|
|
3059
|
+
-12.8467,
|
|
3060
|
+
-13.2372,
|
|
3061
|
+
-13.6275,
|
|
3062
|
+
-14.0181,
|
|
3063
|
+
-14.4083,
|
|
3064
|
+
-14.7989,
|
|
3065
|
+
-15.1894
|
|
3066
|
+
],
|
|
3067
|
+
r_y: [
|
|
3068
|
+
-.0121,
|
|
3069
|
+
-.0159,
|
|
3070
|
+
-.0198,
|
|
3071
|
+
-.0236,
|
|
3072
|
+
-.0274,
|
|
3073
|
+
-.0313,
|
|
3074
|
+
-.0351,
|
|
3075
|
+
-.039,
|
|
3076
|
+
-.0429,
|
|
3077
|
+
-.0467,
|
|
3078
|
+
-.0506,
|
|
3079
|
+
-.0544,
|
|
3080
|
+
-.0582,
|
|
3081
|
+
-.0621,
|
|
3082
|
+
-.0659,
|
|
3083
|
+
-.0698
|
|
3084
|
+
],
|
|
3085
|
+
g_x: [
|
|
3086
|
+
-17.2405,
|
|
3087
|
+
-16.5128,
|
|
3088
|
+
-15.7853,
|
|
3089
|
+
-15.0578,
|
|
3090
|
+
-14.3304,
|
|
3091
|
+
-13.6031,
|
|
3092
|
+
-12.8759,
|
|
3093
|
+
-12.1487,
|
|
3094
|
+
-11.4004,
|
|
3095
|
+
-10.6733,
|
|
3096
|
+
-9.9465,
|
|
3097
|
+
-9.2196,
|
|
3098
|
+
-8.4931,
|
|
3099
|
+
-7.7664,
|
|
3100
|
+
-7.04,
|
|
3101
|
+
-6.3134
|
|
3102
|
+
],
|
|
3103
|
+
g_y: [
|
|
3104
|
+
-.0229,
|
|
3105
|
+
-.0255,
|
|
3106
|
+
-.0282,
|
|
3107
|
+
-.0308,
|
|
3108
|
+
-.0334,
|
|
3109
|
+
-.0361,
|
|
3110
|
+
-.0387,
|
|
3111
|
+
-.0413,
|
|
3112
|
+
-.044,
|
|
3113
|
+
-.0467,
|
|
3114
|
+
-.0493,
|
|
3115
|
+
-.0519,
|
|
3116
|
+
-.0546,
|
|
3117
|
+
-.0572,
|
|
3118
|
+
-.0599,
|
|
3119
|
+
-.0625
|
|
3120
|
+
],
|
|
3121
|
+
b_x: [
|
|
3122
|
+
-19.5271,
|
|
3123
|
+
-18.4535,
|
|
3124
|
+
-17.3793,
|
|
3125
|
+
-16.3057,
|
|
3126
|
+
-15.2322,
|
|
3127
|
+
-14.1586,
|
|
3128
|
+
-13.0846,
|
|
3129
|
+
-12.0108,
|
|
3130
|
+
-10.9055,
|
|
3131
|
+
-9.8317,
|
|
3132
|
+
-8.7578,
|
|
3133
|
+
-7.6841,
|
|
3134
|
+
-6.6107,
|
|
3135
|
+
-5.537,
|
|
3136
|
+
-4.4628,
|
|
3137
|
+
-3.3892
|
|
3138
|
+
],
|
|
3139
|
+
b_y: [
|
|
3140
|
+
-.0543,
|
|
3141
|
+
-.0529,
|
|
3142
|
+
-.0515,
|
|
3143
|
+
-.0501,
|
|
3144
|
+
-.0487,
|
|
3145
|
+
-.0473,
|
|
3146
|
+
-.0459,
|
|
3147
|
+
-.0445,
|
|
3148
|
+
-.0431,
|
|
3149
|
+
-.0417,
|
|
3150
|
+
-.0403,
|
|
3151
|
+
-.0389,
|
|
3152
|
+
-.0375,
|
|
3153
|
+
-.0361,
|
|
3154
|
+
-.0347,
|
|
3155
|
+
-.0333
|
|
3156
|
+
]
|
|
3157
|
+
},
|
|
3158
|
+
{
|
|
3159
|
+
r_x: [
|
|
3160
|
+
-13.0767,
|
|
3161
|
+
-13.0767,
|
|
3162
|
+
-13.0767,
|
|
3163
|
+
-13.0767,
|
|
3164
|
+
-13.0767,
|
|
3165
|
+
-13.0767,
|
|
3166
|
+
-13.0767,
|
|
3167
|
+
-13.0767,
|
|
3168
|
+
-13.0767,
|
|
3169
|
+
-13.0767,
|
|
3170
|
+
-13.0767,
|
|
3171
|
+
-13.0767,
|
|
3172
|
+
-13.0767,
|
|
3173
|
+
-13.0767,
|
|
3174
|
+
-13.0767,
|
|
3175
|
+
-13.0767
|
|
3176
|
+
],
|
|
3177
|
+
r_y: [
|
|
3178
|
+
-.0765,
|
|
3179
|
+
-.0714,
|
|
3180
|
+
-.0663,
|
|
3181
|
+
-.0612,
|
|
3182
|
+
-.0561,
|
|
3183
|
+
-.051,
|
|
3184
|
+
-.0459,
|
|
3185
|
+
-.0408,
|
|
3186
|
+
-.0357,
|
|
3187
|
+
-.0306,
|
|
3188
|
+
-.0255,
|
|
3189
|
+
-.0204,
|
|
3190
|
+
-.0153,
|
|
3191
|
+
-.0102,
|
|
3192
|
+
-.0051,
|
|
3193
|
+
0
|
|
3194
|
+
],
|
|
3195
|
+
g_x: [
|
|
3196
|
+
0,
|
|
3197
|
+
-1.5085,
|
|
3198
|
+
-3.017,
|
|
3199
|
+
-4.5255,
|
|
3200
|
+
-6.034,
|
|
3201
|
+
-7.5425,
|
|
3202
|
+
-9.051,
|
|
3203
|
+
-10.5595,
|
|
3204
|
+
-12.068,
|
|
3205
|
+
-13.5765,
|
|
3206
|
+
-15.0849,
|
|
3207
|
+
-16.5934,
|
|
3208
|
+
-18.1019,
|
|
3209
|
+
-19.6104,
|
|
3210
|
+
-21.1189,
|
|
3211
|
+
-22.6274
|
|
3212
|
+
],
|
|
3213
|
+
g_y: [
|
|
3214
|
+
-.0442,
|
|
3215
|
+
-.0442,
|
|
3216
|
+
-.0442,
|
|
3217
|
+
-.0442,
|
|
3218
|
+
-.0442,
|
|
3219
|
+
-.0442,
|
|
3220
|
+
-.0442,
|
|
3221
|
+
-.0442,
|
|
3222
|
+
-.0442,
|
|
3223
|
+
-.0442,
|
|
3224
|
+
-.0442,
|
|
3225
|
+
-.0442,
|
|
3226
|
+
-.0442,
|
|
3227
|
+
-.0442,
|
|
3228
|
+
-.0442,
|
|
3229
|
+
-.0442
|
|
3230
|
+
],
|
|
3231
|
+
b_x: [
|
|
3232
|
+
13.0767,
|
|
3233
|
+
13.0767,
|
|
3234
|
+
13.0767,
|
|
3235
|
+
13.0767,
|
|
3236
|
+
13.0767,
|
|
3237
|
+
13.0767,
|
|
3238
|
+
13.0767,
|
|
3239
|
+
13.0767,
|
|
3240
|
+
13.0767,
|
|
3241
|
+
13.0767,
|
|
3242
|
+
13.0767,
|
|
3243
|
+
13.0767,
|
|
3244
|
+
13.0767,
|
|
3245
|
+
13.0767,
|
|
3246
|
+
13.0767,
|
|
3247
|
+
13.0767
|
|
3248
|
+
],
|
|
3249
|
+
b_y: [
|
|
3250
|
+
0,
|
|
3251
|
+
.0051,
|
|
3252
|
+
.0102,
|
|
3253
|
+
.0153,
|
|
3254
|
+
.0204,
|
|
3255
|
+
.0255,
|
|
3256
|
+
.0306,
|
|
3257
|
+
.0357,
|
|
3258
|
+
.0408,
|
|
3259
|
+
.0459,
|
|
3260
|
+
.051,
|
|
3261
|
+
.0561,
|
|
3262
|
+
.0612,
|
|
3263
|
+
.0663,
|
|
3264
|
+
.0714,
|
|
3265
|
+
.0765
|
|
3266
|
+
]
|
|
3267
|
+
}
|
|
3268
|
+
], P = (e) => {
|
|
3269
|
+
if (e >= N.length) return null;
|
|
3270
|
+
let t = N[e], n = new Float32Array(128);
|
|
3271
|
+
return n.set(t.r_x, 0), n.set(t.r_y, 16), n.set(t.g_x, 32), n.set(t.g_y, 48), n.set(t.b_x, 64), n.set(t.b_y, 80), n.set(t.b_x2 ?? A, 96), n.set(t.b_y2 ?? A, 112), n;
|
|
3272
|
+
}, F = (e, t) => {
|
|
2501
3273
|
let n = new Uint32Array(Math.ceil(t / 32));
|
|
2502
3274
|
for (let r = 0; r < e.length; r++) {
|
|
2503
3275
|
let i = e[r];
|
|
@@ -2509,4 +3281,4 @@ var p = (e, t, n) => {
|
|
|
2509
3281
|
return n;
|
|
2510
3282
|
};
|
|
2511
3283
|
//#endregion
|
|
2512
|
-
export { E as GLASBEY_DARK, D as GLASBEY_LIGHT, k as MAGMA_25, T as OKABE_ITO, O as VIRIDIS_25,
|
|
3284
|
+
export { M as COLORMAP_2D_INDEX, j as COLORMAP_2D_NAMES, E as GLASBEY_DARK, D as GLASBEY_LIGHT, k as MAGMA_25, T as OKABE_ITO, O as VIRIDIS_25, F as bitPackIndices, S as computeArcLengths, l as createScatter, h as createScatterWebGL, w as interpolateAtPosition, P as packColormap2DLut };
|