@kymoscope/sdk 0.1.1 → 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/README.md +1 -1
- package/dist/assets/{importer.worker-D4is7BLf.js → importer.worker-Drm9u2Rc.js} +3 -3
- package/dist/importers-DHeUdZcP.js +5 -0
- package/dist/krc-BIfw0rX1.js +9 -0
- package/dist/kymoscope-embed.js +60 -60
- package/dist/kymoscope-sdk.js +81 -81
- package/dist/types/components/GaugeChart.d.ts +11 -1
- package/dist/types/engine/createEngine.d.ts +1 -1
- package/dist/types/engine/types.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/chartChannels.d.ts +3 -0
- package/dist/types/lib/data/liveDataSource.d.ts +1 -1
- package/dist/types/lib/live/blockWire.d.ts +33 -0
- package/dist/types/lib/live/buffer.d.ts +13 -2
- package/dist/types/lib/live/columnsWire.d.ts +1 -1
- package/dist/types/lib/live/wire.d.ts +4 -0
- package/dist/types/lib/panelChartSettings.d.ts +3 -0
- package/dist/types/lib/savedLayout.d.ts +3 -3
- package/package.json +1 -1
- package/dist/importers-DivmF3tx.js +0 -5
- package/dist/krc-CbE28CjD.js +0 -9
package/README.md
CHANGED
|
@@ -99,7 +99,7 @@ Failures throw `KymoscopeError` with a `code` (`limit_reached` carries `detail.r
|
|
|
99
99
|
|
|
100
100
|
## Encrypted live streams for your users
|
|
101
101
|
|
|
102
|
-
1. Publish with the Python `
|
|
102
|
+
1. Publish with the Python `kymoscope` package (`pip install kymoscope`, Python 3.9+), the native LMU plugin, or the raw protocol, using your Kymoscope API key and a stream password.
|
|
103
103
|
2. Your **backend** asks for a watch ticket. The API key must never reach the browser:
|
|
104
104
|
```http
|
|
105
105
|
POST {SUPABASE_URL}/functions/v1/stream-watch-ticket
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const e=1<<20,t=16<<20;var n=class{size;bytesRead=0;#e;#t=new Map;constructor(e){this.#e=e,this.size=e.size}async read(t,n){let r=Math.min(this.size,t+n);if(r<=t)return new Uint8Array;if(r-t>e)return this.slice(t,r-t);let i=Math.floor(t/e),a=Math.floor((r-1)/e),o=await this.#n(i);if(i===a)return o.subarray(t-i*e,r-i*e);let s=new Uint8Array(r-t),c=o.subarray(t-i*e);return s.set(c),s.set((await this.#n(a)).subarray(0,r-a*e),c.length),s}async slice(e,t){let n=Math.min(this.size,e+t);if(n<=e)return new Uint8Array;let r=new Uint8Array(await this.#e.slice(e,n).arrayBuffer());return this.bytesRead+=r.length,r}async*windows(e,n,r=t){let i=Math.min(this.size,e+n);for(let t=e;t<i;t+=r)yield{offset:t,bytes:await this.slice(t,Math.min(r,i-t))}}async#n(t){let n=this.#t.get(t);if(n)return this.#t.delete(t),this.#t.set(t,n),n;let r=await this.slice(t*e,e);return this.#t.size>=64&&this.#t.delete(this.#t.keys().next().value),this.#t.set(t,r),r}};const r=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);function i(e,t,n=!0){let r=e.getUint32(n?t:t+4,n);return e.getUint32(n?t+4:t,n)*4294967296+r}function a(e,t,n=!0){let r=e.getUint32(n?t:t+4,n);return e.getInt32(n?t+4:t,n)*4294967296+r}const o=new TextDecoder(`utf-8`),s=new TextDecoder(`latin1`);function c(e,t=!1){let n=e.indexOf(0);return(t?s:o).decode(n<0?e:e.subarray(0,n))}const l=e=>s.decode(e),u=e=>o.decode(e);function d(e,t,n=0){if(e.length<n+t.length)return!1;for(let r=0;r<t.length;r++)if(e[n+r]!==t.charCodeAt(r))return!1;return!0}function f(e,t){return e.selection.find(e=>e.group===t)?.channels??[]}const p={sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,sinh:Math.sinh,cosh:Math.cosh,tanh:Math.tanh,exp:Math.exp,ln:Math.log,log:Math.log,log10:Math.log10,sqrt:Math.sqrt,abs:Math.abs,pow:Math.pow,min:Math.min,max:Math.max};function m(e){if(e.length>4096)return null;let t=e.match(/\d+\.?\d*(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?|[A-Za-z_]\w*|\*\*|[-+*/^(),]|\S/g)??[],n=0,r=()=>t[n],i=()=>{throw Error(`formula`)},a=e=>{t[n++]!==e&&i()},o=()=>{let e=s();for(;r()===`+`||r()===`-`;){let r=t[n++],i=e,a=s();e=r===`+`?e=>i(e)+a(e):e=>i(e)-a(e)}return e},s=()=>{let e=c();for(;r()===`*`||r()===`/`;){let r=t[n++],i=e,a=c();e=r===`*`?e=>i(e)*a(e):e=>i(e)/a(e)}return e},c=()=>{if(r()===`-`){n++;let e=c();return t=>-e(t)}return r()===`+`?(n++,c()):l()},l=()=>{let e=u();if(r()===`^`||r()===`**`){n++;let t=c();return n=>e(n)**t(n)}return e},u=()=>{let e=t[n++];if(e===void 0&&i(),e===`(`){let e=o();return a(`)`),e}if(/^[\d.]/.test(e)){let t=Number(e);return Number.isFinite(t)||i(),()=>t}if(e===`X`||e===`x`||e===`X1`)return e=>e;if(Object.hasOwn(p,e)){let t=p[e];a(`(`);let i=[o()];for(;r()===`,`;)n++,i.push(o());return a(`)`),i.length===1?e=>t(i[0](e)):e=>t(...i.map(t=>t(e)))}return i()};try{let e=o();return n===t.length?e:null}catch{return null}}const h={k:`id`};function g(e,t){let{keys:n,vals:r}=e,i=n.length;if(i===0)return t;if(t<=n[0])return r[0];if(t>=n[i-1])return r[i-1];let a=0,o=i-1;for(;o-a>1;){let e=a+o>>1;n[e]<=t?a=e:o=e}return e.interp?r[a]+(r[o]-r[a])*(t-n[a])/(n[o]-n[a]):t-n[a]<=n[o]-t?r[a]:r[o]}function _(e,t){let n=t.length;switch(e.k){case`lin`:{let{a:r,b:i}=e;if(r===1&&i===0)return;for(let e=0;e<n;e++)t[e]=r*t[e]+i;return}case`rat`:{let[r,i,a,o,s,c]=e.p;for(let e=0;e<n;e++){let n=t[e];t[e]=(r*n*n+i*n+a)/(o*n*n+s*n+c)}return}case`poly`:{let[r,i,a,o,s,c]=e.p;for(let e=0;e<n;e++){let n=t[e]-s-c;t[e]=(i-o*n)/(a*n-r)}return}case`alg`:{let r=e.f;for(let e=0;e<n;e++)t[e]=r(t[e]);return}case`tab`:for(let r=0;r<n;r++)t[r]=g(e,t[r]);return;case`rtv`:for(let r=0;r<n;r++){let n=t[r],i=e.def;for(let t=0;t<e.lo.length;t++)if(n>=e.lo[t]&&n<=e.hi[t]){i=e.vals[t];break}t[r]=i}return;default:return}}function v(e,t){let n=Float64Array.of(t);return _(e,n),n[0]}const y=(e,t)=>e===null||typeof e==`string`?e:String(v(e,t));function b(e,t){let n=Array(t.length),r=e.ranges.every(e=>e.lo===e.hi)?new Map(e.ranges.map(e=>[e.lo,e.to])):null;for(let i=0;i<t.length;i++){let a=t[i];if(a!==a){n[i]=null;continue}let o=e.def;if(r){let e=r.get(a);e!==void 0&&(o=e)}else for(let t of e.ranges)if(a>=t.lo&&(e.int||t.lo===t.hi?a<=t.hi:a<t.hi)){o=t.to;break}n[i]=y(o,a)}return n}function x(e,t){let n=(e,t)=>({type:e,bigEndian:t,encoding:`latin1`});switch(e){case 0:return n(`uint`,!t);case 1:return n(`int`,!t);case 2:case 3:return n(`float`,!t);case 7:return n(`string`,!1);case 8:return n(`bytes`,!1);case 9:return n(`uint`,!0);case 10:return n(`int`,!0);case 11:case 12:return n(`float`,!0);case 13:return n(`uint`,!1);case 14:return n(`int`,!1);case 15:case 16:return n(`float`,!1);default:return null}}async function S(e,t,n){let i=r(t).getUint16(24,!0)===0,a=async t=>{let n=r(await e.read(t,4)).getUint16(2,i),a=await e.read(t,n);return{id:l(a.subarray(0,2)),v:r(a),b:a,size:n}},o=(e,t)=>e.getUint32(t,i),s=(e,t)=>e.getUint16(t,i),u=(e,t)=>e.getFloat64(t,i),d=async e=>e?c((await a(e)).b.subarray(4),!0):``,f=[],p=new Set,g=e=>{if(p.has(e))throw Error(`This MDF file is damaged (its blocks link in a loop).`);p.add(e)},_=async(e,t)=>{if(!e)return{conv:h,unit:``};let{v:n,b:r}=await a(e),i=c(r.subarray(22,42),!0),l=s(n,42),f=s(n,44),p=e=>u(n,46+8*e);switch(l){case 0:return{conv:{k:`lin`,a:p(1),b:p(0)},unit:i};case 1:case 2:{let e=new Float64Array(f),t=new Float64Array(f);for(let n=0;n<f;n++)e[n]=p(2*n),t[n]=p(2*n+1);return{conv:{k:`tab`,keys:e,vals:t,interp:l===1},unit:i}}case 6:return{conv:{k:`poly`,p:[0,1,2,3,4,5].map(p)},unit:i};case 9:return{conv:{k:`rat`,p:[0,1,2,3,4,5].map(p)},unit:i};case 10:{let e=c(r.subarray(46,302),!0),t=m(e);return{conv:t?{k:`alg`,f:t}:{k:`unsupported`,what:`the formula "${e}"`},unit:i}}case 11:return{conv:{k:`text`,ranges:Array.from({length:f},(e,t)=>{let i=46+40*t,a=u(n,i);return{lo:a,hi:a,to:c(r.subarray(i+8,i+40),!0)}}),def:null,int:t},unit:i};case 12:{let e=await Promise.all(Array.from({length:f},async(e,t)=>{let r=46+20*t;return{lo:u(n,r),hi:u(n,r+8),to:await d(o(n,r+16))}}));return{conv:{k:`text`,ranges:e.slice(1),def:e[0]?.to??null,int:t},unit:i}}case 65535:return{conv:h,unit:i};default:return{conv:{k:`unsupported`,what:`MDF3 conversion type ${l}`},unit:i}}},v=await a(64),y=null;if(v.size>=172&&(o(v.v,164)||o(v.v,168))){let e=o(v.v,168)*4294967296+o(v.v,164);y=new Date(e/1e6).toISOString()}else{let e=l(v.b.subarray(18,28)),t=l(v.b.subarray(28,36));/^\d\d:\d\d:\d{4}$/.test(e)&&(y=`${e.slice(6)}-${e.slice(3,5)}-${e.slice(0,2)}T${t}`)}let b=[],S=0;for(let e=o(v.v,4),t=0;e;t++){g(e);let n=await a(e),r=s(n.v,22),l=[];for(let e=o(n.v,8);e;){g(e);let n=await a(e),u=[],p=null;for(let e=o(n.v,8);e;){g(e);let t=await a(e),n=c(t.b.subarray(26,58),!0),r=(t.size>=222?await d(o(t.v,218)):``)||n,l=x(s(t.v,190),i),m=s(t.v,186)+(t.size>=228?8*s(t.v,226):0);if(!l)f.push(`${r}: MDF3 data type ${s(t.v,190)} is not supported; skipped.`);else{let{conv:e,unit:n}=await _(o(t.v,8),l.type!==`float`),i={name:r,unit:n,kind:s(t.v,24)===1?`master`:`value`,...l,conv:e,sd:null,sdRecordId:null,byteOffset:m>>3,bitOffset:m&7,bitCount:s(t.v,188),invalBit:null,allInvalid:!1};i.kind===`master`&&!p?p=i:i.kind===`value`&&u.push(i)}e=o(t.v,4)}S++,l.push({name:await d(o(n.v,12))||`Group ${S}`,dg:t,recordId:s(n.v,16),recordIdSize:+(r>0),idTrailer:+(r===2),dataBytes:s(n.v,20),invalBytes:0,cycles:o(n.v,22),vlsdCg:!1,sorted:!0,master:p,channels:u,stream:[],busType:0,busEvent:!1}),e=o(n.v,4)}let u=l.reduce((e,t)=>e+t.cycles*(t.recordIdSize+t.dataBytes+t.idTrailer),0),p=[{offset:o(n.v,16),length:u,zip:null}];for(let e of l)e.stream=p,e.sorted=l.length===1,b.push(e);e=o(n.v,4)}return{version:`MDF ${n}`,startTime:y,groups:b,notes:f,meta:{}}}const C=e=>e*1032+1024,w=1e3,T=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function ee(e){let t=e.notes;for(let n of e.groups){n.name=T(String(n.name),256);for(let e of n.channels)e.name=T(String(e.name),256),e.unit=T(String(e.unit??``),64);Number.isInteger(n.samples)&&n.samples>=-1||(n.samples=-1),n.rateHz===null||Number.isFinite(n.rateHz)&&n.rateHz>0||(n.rateHz=null),n.time.kind===`rate`&&!(Number.isFinite(n.time.rate)&&n.time.rate>0&&Number.isFinite(n.time.start))&&(t.push(`${n.name}: its sample rate in the file is not usable; samples are numbered instead.`),n.time={kind:`index`},n.rateHz=null)}t.length>100&&t.splice(100,t.length-100,`${t.length-100} more notes.`),e.notes=t.map(e=>T(String(e),w));let n={};for(let[t,r]of Object.entries(e.meta).slice(0,200))n[T(t,256)]=T(String(r),w);return e.meta=n,e.events=e.events.filter(e=>Number.isFinite(e.time)).map(e=>({time:e.time,text:T(String(e.text),w)})),e}function E(e){return e instanceof Error&&(e.constructor===Error||e.name===`KymoscopeError`||e.name===`AbortError`)?e:Error(`This file couldn't be read (it may be damaged).`)}function D(e,t){if(e.seen.has(t))throw Error(`This MF4 is damaged (its blocks link in a loop).`);e.seen.add(t)}async function O(e,t){let n=await e.read(t,24);if(n.length<24)throw Error(`This MF4 is damaged (bad block at byte ${t}).`);let a=r(n),o=l(n.subarray(0,4)),s=i(a,8),c=i(a,16);if(!o.startsWith(`##`)||s<24+8*c||s>1<<26)throw Error(`This MF4 is damaged (bad block at byte ${t}).`);let u=await e.read(t,s);if(u.length<s)throw Error(`This MF4 is damaged (the block at byte ${t} runs past the end of the file).`);let d=r(u),f=[];for(let e=0;e<c;e++)f.push(i(d,24+8*e));let p=u.subarray(24+8*c);return{id:o,links:f,data:r(p),bytes:p}}const te={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`};function ne(e){let t=e.indexOf(`<TX>`),n=t<0?-1:e.indexOf(`</TX>`,t+4);return(n>=0?e.slice(t+4,n):e.replace(/<[^<>]*>/g,``)).replace(/&(lt|gt|amp|quot|apos);/g,(e,t)=>te[t]).trim()}function k(e,t){if(!t)return Promise.resolve(``);let n=e.texts.get(t);return n||(n=O(e.io,t).then(e=>{let t=c(e.bytes);return e.id===`##MD`?ne(t):t}),e.texts.set(t,n)),n}async function A(e,t,n=0){if(!t)return[];let a=e.io,o=await a.read(t,24),s=l(o.subarray(0,4)),c=o.length<24?0:i(r(o),8);switch(s){case`##DT`:case`##SD`:case`##RD`:return[{offset:t+24,length:c-24,zip:null}];case`##DZ`:{let e=r(await a.read(t+24,24));if(e.byteLength<24)throw Error(`This MF4 is damaged (bad block at byte ${t}).`);let n=e.getUint8(2);if(n===2||n===3)throw Error(`This MF4 uses zstd compression, which isn't supported yet.`);if(n===4||n===5)throw Error(`This MF4 uses LZ4 compression, which isn't supported yet.`);if(n>5)throw Error(`This MF4 is damaged (unknown compression type ${n}).`);let o=e.getUint32(4,!0),s=i(e,8),c=i(e,16);if(s>C(c)||n===1&&o===0)throw Error(`This MF4 is damaged (bad compressed block at byte ${t}).`);if(n===1&&s>268435456)throw Error(`This MF4 has a compressed block over 256 MB, which Kymoscope cannot read.`);return[{offset:t+48,length:c,zip:{type:n,param:o,orgLength:s}}]}case`##DL`:{if(n>1)throw Error(`This MF4 is damaged (unexpected ${s} block in its data).`);let r=[];for(let n=t;n;){D(e,n);let t=await O(a,n);for(let n of t.links.slice(1))r.push(...await A(e,n,2));n=t.links[0]}return r}case`##HL`:if(n>0)throw Error(`This MF4 is damaged (unexpected ${s} block in its data).`);return D(e,t),A(e,(await O(a,t)).links[0],1);case`##DV`:case`##DI`:throw Error(`This MF4 uses column-oriented storage (MDF 4.2 DV/DI blocks), which Kymoscope cannot read yet.`);default:throw Error(`This MF4 is damaged (unexpected ${s} block in its data).`)}}async function re(e,t,n){return t?l(await e.io.read(t,4))===`##CC`?j(e,t,n+1):k(e,t):null}async function j(e,t,n=0){if(!t||n>4||e.busy.has(t))return h;let r=e.convs.get(t);if(r)return r;e.busy.add(t);try{let r=await ie(e,t,n);return e.convs.set(t,r),r}finally{e.busy.delete(t)}}async function ie(e,t,n){let r=await O(e.io,t),i=r.data,a=i.getUint8(0),o=i.getUint16(4,!0),s=i.getUint16(6,!0),c=new Float64Array(s);for(let e=0;e<s;e++)c[e]=i.getFloat64(24+8*e,!0);let l=r.links.slice(4,4+o),u=()=>Promise.all(l.map(t=>re(e,t,n)));switch(a){case 0:return h;case 1:return{k:`lin`,b:c[0],a:c[1]};case 2:return{k:`rat`,p:[...c]};case 3:{let t=await k(e,l[0]),n=m(t);return n?{k:`alg`,f:n}:{k:`unsupported`,what:`the formula "${t}"`}}case 4:case 5:{let e=s>>1,t=new Float64Array(e),n=new Float64Array(e);for(let r=0;r<e;r++)t[r]=c[2*r],n[r]=c[2*r+1];return{k:`tab`,keys:t,vals:n,interp:a===4}}case 6:{let e=Math.max(0,Math.floor((s-1)/3)),t=new Float64Array(e),n=new Float64Array(e),r=new Float64Array(e);for(let i=0;i<e;i++)t[i]=c[3*i],n[i]=c[3*i+1],r[i]=c[3*i+2];return{k:`rtv`,lo:t,hi:n,vals:r,def:c[s-1]}}case 7:{let e=await u();return{k:`text`,ranges:[...c].map((t,n)=>({lo:t,hi:t,to:e[n]??null})),def:e[s]??null,int:!0}}case 8:{let e=await u(),t=s>>1;return{k:`text`,ranges:Array.from({length:t},(t,n)=>({lo:c[2*n],hi:c[2*n+1],to:e[n]??null})),def:e[t]??null,int:!0}}default:return{k:`unsupported`,what:`conversion type ${a}`}}}const ae={0:{type:`uint`,bigEndian:!1,encoding:`latin1`},1:{type:`uint`,bigEndian:!0,encoding:`latin1`},2:{type:`int`,bigEndian:!1,encoding:`latin1`},3:{type:`int`,bigEndian:!0,encoding:`latin1`},4:{type:`float`,bigEndian:!1,encoding:`latin1`},5:{type:`float`,bigEndian:!0,encoding:`latin1`},6:{type:`string`,bigEndian:!1,encoding:`latin1`},7:{type:`string`,bigEndian:!1,encoding:`utf-8`},8:{type:`string`,bigEndian:!1,encoding:`utf-16le`},9:{type:`string`,bigEndian:!0,encoding:`utf-16be`},10:{type:`bytes`,bigEndian:!1,encoding:`latin1`}};async function oe(e,t){let{io:n,notes:r}=e,a=t.data,o=a.getUint8(0),s=a.getUint8(1),c=a.getUint8(2),u=await k(e,t.links[2]),d=ae[c];if(!d)return r.push(`${u}: data type ${c} is not supported; the channel was skipped.`),null;let f;if(o===2||o===3)if(s===1)f=o===2?`master`:`vmaster`;else{if(r.push(`The master channel ${u} is not time (sync type ${s}): samples are numbered instead.`),o===3)return null;f=`value`}else if(o===1)f=`vlsd`;else if(o===0||o===4)f=`value`;else return r.push(`${u}: channel type ${o} is not supported; skipped.`),null;let p=await j(e,t.links[4]),m=p.k===`text`?{...p,int:d.type!==`float`}:p,h=await k(e,t.links[6]);!h&&t.links[4]&&(h=await k(e,(await O(n,t.links[4])).links[1]));let g=null,_=null;f===`vlsd`&&t.links[5]&&(l(await n.read(t.links[5],4))===`##CG`?_=i((await O(n,t.links[5])).data,0):g=await A(e,t.links[5]));let v=a.getUint32(12,!0);return{name:u,unit:h,kind:f,...d,conv:m,sd:g,sdRecordId:_,byteOffset:a.getUint32(4,!0),bitOffset:a.getUint8(3),bitCount:a.getUint32(8,!0),invalBit:v&2?a.getUint32(16,!0):null,allInvalid:(v&1)!=0}}async function M(e,t,n,r=0){let{io:i,notes:a}=e;for(let o=t;o;){D(e,o);let t=await O(i,o),s=t.links[1];s&&r<4&&(l(await i.read(s,4))===`##CN`?await M(e,s,n,r+1):a.push(`${await k(e,t.links[2])}: array channels (CA) are not supported yet; skipped.`));let c=await oe(e,t);c&&n.push(c),o=t.links[0]}}async function se(e,t,n,r){let a=t.data,o=a.getUint16(16,!0),s=0;t.links[3]&&(s=(await O(e.io,t.links[3])).data.getUint8(1));let c={name:await k(e,t.links[2]),dg:n,recordId:i(a,0),recordIdSize:r,idTrailer:0,dataBytes:a.getUint32(24,!0),invalBytes:a.getUint32(28,!0),cycles:i(a,8),vlsdCg:(o&1)!=0,sorted:!0,master:null,channels:[],stream:[],busType:s,busEvent:(o&2)!=0};if(c.vlsdCg)return c;let l=[];await M(e,t.links[1],l);for(let e of l)e.kind===`master`||e.kind===`vmaster`?c.master||=e:c.channels.push(e);return c}async function N(e,t){let n=await O(e,64);if(n.id!==`##HD`)throw Error(`This MF4 is damaged (no header block).`);let r=i(n.data,0),a=(n.data.getUint8(12)&1)!=0,o=new Date(r/1e6).toISOString(),s=r>0?a?o.slice(0,-1):o:null,c={io:e,notes:[],seen:new Set,texts:new Map,convs:new Map,busy:new Set},l=[],u=0;for(let t=n.links[0],r=0;t;r++){D(c,t);let n=await O(e,t),i=n.data.getUint8(0),a=[];for(let t=n.links[1];t;){D(c,t);let n=await O(e,t),o=await se(c,n,r,i);o.vlsdCg||(u++,o.name||=`Group ${u}`),a.push(o),t=n.links[0]}let o=await A(c,n.links[2]),s=a.length===1;for(let e of a)e.stream=o,e.sorted=s,l.push(e);t=n.links[0]}return{version:`MF4 ${t}`,startTime:s,groups:l,notes:c.notes,meta:{}}}function ce(e){let t=e&32768?-1:1,n=e>>10&31,r=e&1023;return n===0?t*2**-14*(r/1024):n===31?r?NaN:t*(1/0):t*2**(n-15)*(1+r/1024)}function P(e,t,n,i,a,o,s=0){let c=r(t),l=!e.bigEndian,u=a+e.byteOffset,d=e.bitCount;if(e.bitOffset===0)if(e.type===`float`){if(d===64){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getFloat64(u,l);return}if(d===32){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getFloat32(u,l);return}if(d===16){for(let e=0;e<n;e++,u+=i)o[s+e]=ce(c.getUint16(u,l));return}}else if(e.type===`int`){if(d===8){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getInt8(u);return}if(d===16){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getInt16(u,l);return}if(d===32){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getInt32(u,l);return}if(d===64){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getInt32(u+(l?4:0),l)*4294967296+c.getUint32(u+(l?0:4),l);return}}else{if(d===8){for(let e=0;e<n;e++,u+=i)o[s+e]=t[u];return}if(d===16){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getUint16(u,l);return}if(d===32){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getUint32(u,l);return}if(d===64){for(let e=0;e<n;e++,u+=i)o[s+e]=c.getUint32(u+(l?4:0),l)*4294967296+c.getUint32(u+(l?0:4),l);return}}let f=e.bitOffset+d+7>>3,p=2**e.bitOffset,m=2**d,h=m/2,g=e.type===`int`;for(let e=0;e<n;e++,u+=i){let n=0;if(l)for(let e=f-1;e>=0;e--)n=n*256+t[u+e];else for(let e=0;e<f;e++)n=n*256+t[u+e];n=Math.floor(n/p)%m,o[s+e]=g&&n>=h?n-m:n}}const le=new Map,ue=e=>{let t=le.get(e);return t||le.set(e,t=new TextDecoder(e)),t};function de(e){let t=e.indexOf(`\0`);return t<0?e:e.slice(0,t)}function fe(e,t,n,r,i){let a=ue(e.encoding),o=e.bitCount>>3,s=Array(n);for(let c=0,l=i+e.byteOffset;c<n;c++,l+=r)s[c]=de(a.decode(t.subarray(l,l+o)));return s}function pe(e,t,n,r,i,a){let o=a instanceof Float64Array?NaN:null;if(e.allInvalid){for(let e=0;e<n;e++)a[e]=o;return}if(e.invalBit===null)return;let s=1<<(e.invalBit&7);for(let c=0,l=i+(e.invalBit>>3);c<n;c++,l+=r)t[l]&s&&(a[c]=o)}const me={id:`mdf`,label:`ASAM MDF (MF4, MDF 3)`,extensions:[`.mf4`,`.mdf`,`.mf3`,`.dat`],companions:[{ext:`.dbc`,anyName:!0}],sniff:e=>d(e,`MDF `)||d(e,`UnFinMF `)},F=e=>e.recordIdSize+e.dataBytes+e.invalBytes+e.idTrailer,he=(e,t)=>e.reduce((e,n)=>e+(n.zip?n.zip.orgLength:Math.max(0,Math.min(n.length,t-n.offset))),0),ge=e=>e.byteOffset+Math.ceil((e.bitOffset+e.bitCount)/8);function _e(e,t){return e.kind===`vmaster`?!0:(e.kind===`vlsd`||e.type===`uint`||e.type===`int`||e.type===`float`?!(e.bitCount>=1&&e.bitCount<=64):!(e.bitCount>=8))?!1:ge(e)<=t.dataBytes}function ve(e,t){let n=e.notes;for(let r of e.groups){if(![0,1,2,4,8].includes(r.recordIdSize))throw Error(`This MDF file is damaged (bad record id size).`);if(r.vlsdCg)continue;let e=F(r);if(e>67108864||e===0){r.cycles>0&&n.push(`${r.name||`A group`}: its records are ${e===0?`empty`:`too large`} (damaged); skipped.`),r.cycles=0;continue}r.cycles=Math.min(r.cycles,Math.floor(he(r.stream,t)/e));let i=r.channels.filter(e=>!_e(e,r));for(let e of i)n.push(`${e.name}: its bits lie outside its record (damaged); skipped.`);i.length&&(r.channels=r.channels.filter(e=>!i.includes(e))),r.master&&!_e(r.master,r)&&(n.push(`${r.master.name}: the time channel lies outside its record (damaged): samples are numbered instead.`),r.master=null);for(let e of r.master?[...r.channels,r.master]:r.channels)e.invalBit!==null&&e.invalBit>=8*r.invalBytes&&(e.invalBit=null)}}function ye(e,t){let n=0;for(let r of e.master?[...t,e.master]:t){if(r.invalBit!==null)return 1/0;r.kind!==`vmaster`&&(n=Math.max(n,r.byteOffset+(r.bitOffset+r.bitCount+7>>3)))}return e.recordIdSize+n}var I=Uint8Array,L=Uint16Array,be=Int32Array,xe=new I([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]),Se=new I([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]),Ce=new I([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),we=function(e,t){for(var n=new L(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];for(var i=new be(n[30]),r=1;r<30;++r)for(var a=n[r];a<n[r+1];++a)i[a]=a-n[r]<<5|r;return{b:n,r:i}},Te=we(xe,2),Ee=Te.b,De=Te.r;Ee[28]=258,De[258]=28;var Oe=we(Se,0),ke=Oe.b;Oe.r;for(var Ae=new L(32768),R=0;R<32768;++R){var z=(R&43690)>>1|(R&21845)<<1;z=(z&52428)>>2|(z&13107)<<2,z=(z&61680)>>4|(z&3855)<<4,Ae[R]=((z&65280)>>8|(z&255)<<8)>>1}for(var B=(function(e,t,n){for(var r=e.length,i=0,a=new L(t);i<r;++i)e[i]&&++a[e[i]-1];var o=new L(t);for(i=1;i<t;++i)o[i]=o[i-1]+a[i-1]<<1;var s;if(n){s=new L(1<<t);var c=15-t;for(i=0;i<r;++i)if(e[i])for(var l=i<<4|e[i],u=t-e[i],d=o[e[i]-1]++<<u,f=d|(1<<u)-1;d<=f;++d)s[Ae[d]>>c]=l}else for(s=new L(r),i=0;i<r;++i)e[i]&&(s[i]=Ae[o[e[i]-1]++]>>15-e[i]);return s}),V=new I(288),R=0;R<144;++R)V[R]=8;for(var R=144;R<256;++R)V[R]=9;for(var R=256;R<280;++R)V[R]=7;for(var R=280;R<288;++R)V[R]=8;for(var je=new I(32),R=0;R<32;++R)je[R]=5;var Me=B(V,9,1),Ne=B(je,5,1),Pe=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},H=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},Fe=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},Ie=function(e){return(e+7)/8|0},Le=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new I(e.subarray(t,n))},Re=[`unexpected EOF`,`invalid block type`,`invalid length/literal`,`invalid distance`,`stream finished`,`no stream handler`,,`no callback`,`invalid UTF-8 data`,`extra field too long`,`date not in range 1980-2099`,`filename too long`,`stream finishing`,`invalid zip data`],U=function(e,t,n){var r=Error(t||Re[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,U),!n)throw r;return r},ze=function(e,t,n,r){var i=e.length,a=r?r.length:0;if(!i||t.f&&!t.l)return n||new I(0);var o=!n,s=o||t.i!=2,c=t.i;o&&(n=new I(i*3));var l=function(e){var t=n.length;if(e>t){var r=new I(Math.max(t*2,e));r.set(n),n=r}},u=t.f||0,d=t.p||0,f=t.b||0,p=t.l,m=t.d,h=t.m,g=t.n,_=i*8;do{if(!p){u=H(e,d,1);var v=H(e,d+1,3);if(d+=3,!v){var y=Ie(d)+4,b=e[y-4]|e[y-3]<<8,x=y+b;if(x>i){c&&U(0);break}s&&l(f+b),n.set(e.subarray(y,x),f),t.b=f+=b,t.p=d=x*8,t.f=u;continue}else if(v==1)p=Me,m=Ne,h=9,g=5;else if(v==2){var S=H(e,d,31)+257,C=H(e,d+10,15)+4,w=S+H(e,d+5,31)+1;d+=14;for(var T=new I(w),ee=new I(19),E=0;E<C;++E)ee[Ce[E]]=H(e,d+E*3,7);d+=C*3;for(var D=Pe(ee),O=(1<<D)-1,te=B(ee,D,1),E=0;E<w;){var ne=te[H(e,d,O)];d+=ne&15;var y=ne>>4;if(y<16)T[E++]=y;else{var k=0,A=0;for(y==16?(A=3+H(e,d,3),d+=2,k=T[E-1]):y==17?(A=3+H(e,d,7),d+=3):y==18&&(A=11+H(e,d,127),d+=7);A--;)T[E++]=k}}var re=T.subarray(0,S),j=T.subarray(S);h=Pe(re),g=Pe(j),p=B(re,h,1),m=B(j,g,1)}else U(1);if(d>_){c&&U(0);break}}s&&l(f+131072);for(var ie=(1<<h)-1,ae=(1<<g)-1,oe=d;;oe=d){var k=p[Fe(e,d)&ie],M=k>>4;if(d+=k&15,d>_){c&&U(0);break}if(k||U(2),M<256)n[f++]=M;else if(M==256){oe=d,p=null;break}else{var se=M-254;if(M>264){var E=M-257,N=xe[E];se=H(e,d,(1<<N)-1)+Ee[E],d+=N}var ce=m[Fe(e,d)&ae],P=ce>>4;ce||U(3),d+=ce&15;var j=ke[P];if(P>3){var N=Se[P];j+=Fe(e,d)&(1<<N)-1,d+=N}if(d>_){c&&U(0);break}s&&l(f+131072);var le=f+se;if(f<j){var ue=a-j,de=Math.min(j,le);for(ue+f<0&&U(3);f<de;++f)n[f]=r[ue+f]}for(;f<le;++f)n[f]=n[f-j]}}t.l=p,t.p=oe,t.b=f,t.f=u,p&&(u=1,t.m=h,t.d=m,t.n=g)}while(!u);return f!=n.length&&o?Le(n,0,f):n.subarray(0,f)},Be=new I(0),Ve=function(e,t){return((e[0]&15)!=8||e[0]>>4>7||(e[0]<<8|e[1])%31)&&U(6,`invalid zlib data`),(e[1]>>5&1)==+!t&&U(6,`invalid zlib data: `+(e[1]&32?`need`:`unexpected`)+` dictionary`),(e[1]>>3&4)+2},He=function(){function e(e,t){typeof e==`function`&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new I(32768),this.p=new I(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||U(5),this.d&&U(4),!this.p.length)this.p=e;else if(e.length){var t=new I(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=ze(this.p,this.s,this.o);this.ondata(Le(n,t,this.s.b),this.d),this.o=Le(n,this.s.b-32768),this.s.b=this.o.length,this.p=Le(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),Ue=function(){function e(e,t){He.call(this,e,t),this.v=e&&e.dictionary?2:1}return e.prototype.push=function(e,t){if(He.prototype.e.call(this,e),this.v){if(this.p.length<6&&!t)return;this.p=this.p.subarray(Ve(this.p,this.v-1)),this.v=0}t&&(this.p.length<4&&U(6,`invalid zlib data`),this.p=this.p.subarray(0,-4)),He.prototype.c.call(this,t)},e}(),We=typeof TextDecoder<`u`&&new TextDecoder;try{We.decode(Be,{stream:!0})}catch{}const Ge=65536;async function*Ke(e){for(let t=0;t<e.length;t+=Ge)yield e.subarray(t,t+Ge)}async function*qe(e){if(typeof DecompressionStream!=`function`){let t=[],n=new Ue(e=>{t.push(e)});for await(let r of e)for(n.push(r,!1);t.length;)yield t.shift();for(n.push(new Uint8Array,!0);t.length;)yield t.shift();return}let t=new DecompressionStream(`deflate`),n=t.writable.getWriter();(async()=>{for await(let t of e)await n.write(t);await n.close()})().catch(e=>n.abort(e).catch(()=>{}));let r=t.readable.getReader();try{for(;;){let{done:e,value:t}=await r.read().catch(e=>{throw e instanceof TypeError?Error(`This file's compressed data is damaged.`):e});if(e)return;yield t}}finally{r.cancel().catch(()=>{})}}async function W(e,t=-1,n=1/0){let r=[],i=Math.min(t,n),a=t>=0?new Uint8Array(i):null,o=0;for await(let s of qe(Ke(e))){if(a){if(o+s.length>t&&n>t)throw Error(`Compressed data is longer than its header says.`);a.set(o+s.length>i?s.subarray(0,i-o):s,o)}else r.push(s);if(o+=s.length,o>=n)break}if(a)return o>=i?a:a.subarray(0,o);let s=r.length===1?r[0]:new Uint8Array(o);return r.length>1&&r.reduce((e,t)=>(s.set(t,e),e+t.length),0),o>n?s.subarray(0,n):s}const Je=new Uint8Array(Uint32Array.of(1).buffer)[0]===1;function Ye(e,t,n,r=t){let i=Math.floor(n/t),a=new Uint8Array(r<t?i*r:n),o=r%4==0&&Je?new Uint32Array(a.buffer,0,i*r>>2):null,s=r>>2;for(let t=0;t<i;t+=512){let n=Math.min(i,t+512);if(o)for(let a=0;a<r;a+=4){let r=a*i,c=r+i,l=c+i,u=l+i;for(let i=t,d=t*s+(a>>2);i<n;i++,d+=s)o[d]=e[r+i]|e[c+i]<<8|e[l+i]<<16|e[u+i]<<24}else for(let o=0;o<r;o++){let s=o*i;for(let i=t,c=t*r+o;i<n;i++,c+=r)a[c]=e[s+i]}}let c=i*t;return r===t&&a.set(e.subarray(c,n),c),a}function Xe(e,t,n){if(!(n<t)||e.length===0)return t;let r=Math.min(t,n+3&-4);return r===t?t:e.every(e=>e.zip?.type===1&&e.zip.param===t&&e.zip.orgLength%t===0)?r:t}async function Ze(e,t,n=1/0,r=1/0){let i=await e.slice(t.offset,t.length),{type:a,param:o,orgLength:s}=t.zip;if(a===0)return W(i,s,r);let c=Math.min(n,o);return Ye(await W(i,s,c<o?s/o*c:1/0),o,s,c)}async function*Qe(e,t,n,r=1/0){let i=e=>!!e?.zip&&!(e.zip.type===0&&(e.length>16777216||e.zip.orgLength>268435456)),a=null;for(let o=0;o<t.length;o++){let s=t[o];if(n?.throwIfAborted(),!s.zip)for await(let t of e.windows(s.offset,s.length))yield t.bytes;else if(i(s)){let n=a??Ze(e,s,r);a=i(t[o+1])?Ze(e,t[o+1],r):null,a?.catch(()=>{}),yield await n}else{let t=s.zip.orgLength;for await(let n of qe((async function*(){for await(let t of e.windows(s.offset,s.length))yield t.bytes})()))if(yield n.length>t?n.subarray(0,t):n,(t-=n.length)<=0)break}}}async function*$e(e,t,n,r){if(r<=0||t<=0)return;let i=Math.min(n,r),a=null,o=0,s=0;for await(let n of e){let e=0;for(;e<n.length&&s<r;){if(o===0){let a=Math.min(i,r-s,Math.floor((n.length-e)/t));if(a>0){yield{buf:n.subarray(e,e+a*t),n:a},s+=a,e+=a*t;continue}}a??=new Uint8Array(t*i);let c=Math.min(a.length,(r-s)*t),l=Math.min(n.length-e,c-o);if(a.set(n.subarray(e,e+l),o),o+=l,e+=l,o===c){let e=o/t;yield{buf:a,n:e},s+=e,o=0}}if(s>=r)return}a&&o>=t&&(yield{buf:a,n:Math.floor(o/t)})}async function et(e,t,n,r){let i=n*r,a=0;for(let n of t){let t=n.zip?n.zip.orgLength:n.length;if(i<a)return null;if(i+r<=a+t)return n.zip?null:e.read(n.offset+i-a,r);a+=t}return null}const tt=(e,t)=>(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0;var nt=class{#e;#t;#n;#r;#i=new Uint8Array;#a=0;#o;#s=0;constructor(e,t,n){this.#e=e,this.#t=t,this.#n=n,this.#r=Qe(e,t,n),this.#o=t.reduce((e,t)=>e+(t.zip?t.zip.orgLength:t.length),0)}peek(e){let t=e-this.#a;if(t<0||t+4>this.#i.length)return null;let n=tt(this.#i,t);return t+4+n>this.#i.length?null:this.#i.subarray(t+4,t+4+n)}async get(e){for(;;){let t=this.peek(e);if(t)return t;let n=e-this.#a;if(e+4>this.#o||n>=0&&n+4<=this.#i.length&&e+4+tt(this.#i,n)>this.#o)throw Error(`This MF4 is damaged (string data ends early).`);e<this.#a&&(this.#r=Qe(this.#e,this.#t,this.#n),this.#i=new Uint8Array,this.#a=0);let r=await this.#r.next();if(r.done)throw Error(`This MF4 is damaged (string data ends early).`);if((this.#s+=r.value.length)>4*this.#o+16777216)throw Error(`This MF4 is damaged (its string offsets jump back and forth).`);let i=Math.max(0,Math.min(e-this.#a,this.#i.length)),a=this.#i.subarray(i),o=new Uint8Array(a.length+r.value.length);o.set(a),o.set(r.value,a.length),this.#a+=i,this.#i=o}}};const rt=e=>Math.max(1,Math.min(65536,Math.floor((8<<20)/Math.max(1,e))));var it=class{#e;#t;#n=new Map;#r=new Map;constructor(e,t){this.#e=e,this.#t=t}want(e){this.#r.has(e)||this.#r.set(e,new Map)}wanted(e){return this.#r.has(e)}put(e,t,n){this.#r.get(e).set(t,n)}async bytes(e,t){let n=Array(t.length);if(e.sdRecordId!==null){let r=this.#r.get(e.sdRecordId);for(let e=0;e<t.length;e++)n[e]=r?.get(t[e])??null,r?.delete(t[e]);return n}if(!e.sd)return n.fill(null);let r=this.#n.get(e);r||this.#n.set(e,r=new nt(this.#e,e.sd,this.#t));for(let e=0;e<t.length;e++)n[e]=r.peek(t[e])??await r.get(t[e]);return n}async strings(e,t){let n=ue(e.encoding);return(await this.bytes(e,t)).map(e=>e?de(n.decode(e)):null)}};function at(e,t,n,r,i=F(e),a=new Float64Array(n)){let o=e.master;if(!o)return null;if(o.kind===`vmaster`)for(let e=0;e<n;e++)a[e]=r+e;else P(o,t,n,i,e.recordIdSize,a);return _(o.conv,a),a}function ot(e,t,n){return n===1?e[t]:n===2?e[t]|e[t+1]<<8:n===4?(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0:((e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0)+4294967296*((e[t+4]|e[t+5]<<8|e[t+6]<<16|e[t+7]<<24)>>>0)}function st(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}async function*ct(e,t,n,r,i,a=1/0){let o=t.groups[n[0]];if(o.sorted){let t=Xe(o.stream,F(o),a),r=0;for await(let{buf:a,n:s}of $e(Qe(e,o.stream,i,t),t,rt(t),o.cycles))yield{g:n[0],buf:a,n:s,start:r,size:t},r+=s;return}let s=t.groups.map((e,t)=>({g:e,k:t})).filter(({g:e})=>e.dg===o.dg),c=o.recordIdSize,l=new Map;for(let e of n){let n=t.groups[e],r=F(n);l.set(n.recordId,{k:e,size:r,buf:new Uint8Array(r*Math.min(rt(r),Math.max(1,n.cycles))),fill:0,start:0})}let u=new Map(s.map(({g:e})=>[e.recordId,e.vlsdCg?-1:F(e)])),d=new Map,f=new Uint8Array;for await(let t of Qe(e,o.stream,i)){let e=f.length?st(f,t):t,n=0;for(;!(n+c>e.length);){let t=ot(e,n,c),i=u.get(t);if(i===void 0)throw Error(`This MF4 is damaged (unknown record id ${t}).`);if(i<0){if(n+c+4>e.length)break;let i=(e[n+c]|e[n+c+1]<<8|e[n+c+2]<<16|e[n+c+3]<<24)>>>0;if(i>67108864)throw Error(`This MF4 is damaged (a string record of ${i} bytes).`);let a=n+c+4+i;if(a>e.length)break;let o=d.get(t)??0;r.wanted(t)&&r.put(t,o,e.slice(n+c+4,a)),d.set(t,o+4+i),n=a;continue}if(n+i>e.length)break;let a=l.get(t);if(a&&(a.buf.set(e.subarray(n,n+i),a.fill),a.fill+=i,a.fill===a.buf.length)){let e=a.fill/a.size;yield{g:a.k,buf:a.buf,n:e,start:a.start,size:a.size},a.start+=e,a.fill=0}n+=i}f=e.slice(n)}for(let e of l.values())e.fill&&(yield{g:e.k,buf:e.buf,n:e.fill/e.size,start:e.start,size:e.size})}const lt=(e,t)=>t?e+2147483648:e,ut=/^BO_\s+(\d+)\s+(\w+)\s*:\s*(\d+)/,dt=/^SG_\s+(\w+)\s*(?:(M|m\d+M?)\s*)?:\s*(\d+)\|(\d+)@([01])([+-])\s*\(([^,)]*),([^)]*)\)\s*\[[^\]]*\]\s*"([^"]*)"/,ft=/^VAL_\s+(\d+)\s+(\w+)\s+(.*);/,pt=/^SIG_VALTYPE_\s+(\d+)\s+(\w+)\s*:\s*([12])\s*;/,mt=/^-?\d+(?:\.\d+)?$/;function ht(e){let t=e.split(`"`),n=new Map;for(let e=0;e+1<t.length;e+=2){let r=t[e].trim();mt.test(r)&&n.set(Number(r),t[e+1])}return n}const gt=(e,t)=>e<=511&&t>=1&&t<=64;function _t(e){let t=new Map,n=new Map,r=new Map,i=(e,t)=>{let i=n.get(Number(e));return i?r.get(i)?.get(t):void 0},a=null;for(let o of e.split(/\r?\n/)){let e=o.trim(),s;if(s=ut.exec(e)){let e=Number(s[1]),r=e>=2147483648,i=r?e-2147483648:e;a={id:i,extended:r,name:s[2],size:Number(s[3]),signals:[]},t.set(lt(i,r),a),n.set(e,a)}else if((s=dt.exec(e))&&a){let e=s[2],t=Number(s[3]),n=Number(s[4]);if(!gt(t,n)||!s[7].trim()||!s[8].trim())continue;let i={name:s[1],start:t,length:n,littleEndian:s[5]===`1`,signed:s[6]===`-`,factor:Number(s[7]),offset:Number(s[8]),unit:s[9],mux:e?e===`M`?`switch`:parseInt(e.slice(1),10):null,float:0,values:null};a.signals.push(i);let o=r.get(a);o||r.set(a,o=new Map),o.has(i.name)||o.set(i.name,i)}else if(s=ft.exec(e)){let e=i(s[1],s[2]);e&&(e.values=ht(s[3]))}else if(s=pt.exec(e)){let e=i(s[1],s[2]);e&&(e.float=s[3]===`1`?32:64)}else (e.startsWith(`BO_`)||e===``)&&e===``&&(a=null)}return t}function vt(e){if(e.float){let t=e.float/8,n=e.start>>3,r=e.littleEndian,i=new DataView(new ArrayBuffer(8));return(e,a)=>{for(let r=0;r<t;r++)i.setUint8(r,e[a+n+r]??0);return t===4?i.getFloat32(0,r):i.getFloat64(0,r)}}let t=e.length,n=2**t,r=n/2,i=e.signed;if(e.littleEndian){let a=e.start>>3,o=e.start&7;if(o+t<=32){let e=t===32?-1:(1<<t)-1;return(t,s)=>{let c=s+a,l=((t[c]|t[c+1]<<8|t[c+2]<<16|t[c+3]<<24)>>>o&e)>>>0;return i&&l>=r?l-n:l}}let s=o+t+7>>3,c=2**(t-(32-o)),l=2**(32-o);return(e,t)=>{let u=t+a,d=(e[u]|e[u+1]<<8|e[u+2]<<16|e[u+3]<<24)>>>o,f=0;for(let t=s-1;t>=4;t--)f=f*256+(e[u+t]??0);let p=d+f%c*l;return i&&p>=r?p-n:p}}let a=e.start>>3,o=e.start&7;if(7-o+t<=32){let e=32-(7-o)-t,s=t===32?-1:(1<<t)-1;return(t,o)=>{let c=o+a,l=((t[c]<<24|t[c+1]<<16|t[c+2]<<8|t[c+3])>>>e&s)>>>0;return i&&l>=r?l-n:l}}let s=(1<<o+1)-1,c=t-(o+1)>>3,l=t-(o+1)&7,u=2**l;return(e,t)=>{let o=(e[t+a]??0)&s,d=t+a+1;for(let t=0;t<c;t++)o=o*256+(e[d++]??0);return l>0&&(o=o*u+((e[d]??0)>>8-l)),i&&o>=r?o-n:o}}function yt(e){let t=e.length,n=2**t,r=n/2,i=e.signed,a=t===32?-1:(1<<t)-1;if(!e.float&&e.littleEndian&&(e.start&7)+t<=32){let t=e.start>>3,o=e.start&7;return(e,s,c,l,u,d,f)=>{for(let p=0;p<l;p++){let l=s[c[p]]+t,m=((e[l]|e[l+1]<<8|e[l+2]<<16|e[l+3]<<24)>>>o&a)>>>0;u[p]=(i&&m>=r?m-n:m)*d+f}}}if(!e.float&&!e.littleEndian&&7-(e.start&7)+t<=32){let o=e.start>>3,s=32-(7-(e.start&7))-t;return(e,t,c,l,u,d,f)=>{for(let p=0;p<l;p++){let l=t[c[p]]+o,m=((e[l]<<24|e[l+1]<<16|e[l+2]<<8|e[l+3])>>>s&a)>>>0;u[p]=(i&&m>=r?m-n:m)*d+f}}}let o=vt(e);return(e,t,n,r,i,a,s)=>{for(let c=0;c<r;c++)i[c]=o(e,t[n[c]])*a+s}}function bt(e){if(!e.busEvent||e.busType!==2)return null;let t=t=>e.channels.find(e=>e.name.endsWith(t))??null,n=t(`DataFrame.ID`),r=t(`DataFrame.DataBytes`);return!n||!r?null:{id:n,ide:t(`DataFrame.IDE`),data:r}}const xt=()=>({n:0,time:new Float64Array,key:new Float64Array,id:new Float64Array,ide:new Float64Array,bytes:null,buf:new Uint8Array,dataAt:new Int32Array});async function St(e,t,n,r,i,a,o,s){s.key.length<r&&Object.assign(s,{time:new Float64Array(r),key:new Float64Array(r),id:new Float64Array(r),ide:new Float64Array(r),dataAt:new Int32Array(r)});let c=e.recordIdSize,{id:l,ide:u,key:d,dataAt:f}=s;P(t.id,n,r,a,c,l),t.ide&&P(t.ide,n,r,a,c,u);for(let e=0;e<r;e++){let n=l[e],r=n&536870911;d[e]=lt(r,t.ide?u[e]!==0:n>=2147483648||r>2047)}if(s.bytes=null,t.data.kind===`vlsd`){let e=new Float64Array(r);P({...t.data,type:`uint`},n,r,a,c,e),s.bytes=await o.bytes(t.data,e)}else for(let e=0,n=c+t.data.byteOffset;e<r;e++,n+=a)f[e]=n;if(!at(e,n,r,i,a,s.time.subarray(0,r)))for(let e=0;e<r;e++)s.time[e]=i+e;return s.n=r,s.buf=n,s}const Ct=new Uint8Array;function wt(e){return e.float?(e.start>>3)+e.float/8:e.littleEndian?(e.start>>3)+((e.start&7)+e.length+7>>3):(e.start>>3)+1+(Math.max(0,e.length-((e.start&7)+1))+7>>3)}function Tt(e,t,n){let r=0;for(let e of n.values())for(let t of e.signals)r=Math.max(r,wt(t));let i=t.data.kind===`vlsd`?t.data:{...t.data,bitCount:Math.min(t.data.bitCount,r*8)};return ye(e,t.ide?[t.id,t.ide,i]:[t.id,i])}function Et(e,t){let n=t.map(t=>e.signals[e.channels[t].s]);return{route:e,col:n.map(yt),read:n.map(vt),factor:n.map(e=>e.factor),offset:n.map(e=>e.offset),table:t.map((t,r)=>e.channels[t].text?n[r].values:null),idx:new Int32Array,cnt:0,n:0,t0:NaN,t1:NaN}}function Dt(e,t,n,r,i,a=1,o=0){let s=new Float64Array(i);if(n.bytes)for(let e=0;e<i;e++)s[e]=t(n.bytes[r[e]]??Ct,0)*a+o;else e(n.buf,n.dataAt,r,i,s,a,o);return s}function Ot(e,t){let{idx:n,cnt:r}=e,i=new Float64Array(r);for(let e=0;e<r;e++)i[e]=t.time[n[e]];return e.n===0&&(e.t0=i[0]),e.t1=i[r-1],e.n+=r,e.cnt=0,{time:i,cols:e.col.map((i,a)=>{let o=e.table[a];return o?Array.from(Dt(i,e.read[a],t,n,r),e=>o.get(e)??null):Dt(i,e.read[a],t,n,r,e.factor[a],e.offset[a])})}}const kt=e=>({key:e,skip:!0,frames:0,all:null,sw:null,byMux:new Map,idx:new Int32Array,cnt:0});function At(e,t){let n=e.signals.find(e=>e.mux===`switch`);return{key:lt(e.id,e.extended),skip:!1,frames:0,all:t,sw:n?{col:yt(n),read:vt(n)}:null,byMux:new Map,idx:new Int32Array,cnt:0}}var jt=class{#e=Array(2048);#t=new Map;#n;constructor(e){this.#n=e}get(e){let t=e<2048?this.#e[e]:this.#t.get(e);return t||(t=this.#n(e),e<2048?this.#e[e]=t:this.#t.set(e,t)),t}};function Mt(e,t,n){let r=[];for(let n=0;n<e.n;n++){let i=t.get(e.key[n]);if(i.skip){i.frames++;continue}i.cnt===0&&(r.push(i),i.idx.length<e.n&&(i.idx=new Int32Array(e.n))),i.idx[i.cnt++]=n}let i=[];for(let t of r){if(t.all&&(t.all.idx=t.idx,t.all.cnt=t.cnt,i.push(t.all)),t.sw){let r=Dt(t.sw.col,t.sw.read,e,t.idx,t.cnt);for(let e=0;e<t.cnt;e++){let a=t.byMux.get(r[e]);a===void 0&&((a=n(t,r[e]))||t.byMux.size<4096)&&t.byMux.set(r[e],a),a&&(a.cnt===0&&(i.push(a),a.idx.length<t.cnt&&(a.idx=new Int32Array(t.cnt))),a.idx[a.cnt++]=t.idx[e])}}t.cnt=0}return i}async function Nt(e,t,n,r){let i=new Map;if(t.groups.forEach((e,t)=>{let n=bt(e);n&&e.cycles>0&&i.set(t,n)}),i.size===0)return null;if(n.length===0)return{dbc:new Map,layouts:i,routes:[],notes:[],cache:new Map};let a=_t(u(new Uint8Array(await n[0].arrayBuffer()))),o=[],s=new Map,c=new Map,l=0,d=new it(e,r);for(let[n,u]of i){let i=t.groups[n],f=(e,t)=>{let n=e.signals.filter(e=>t===null?typeof e.mux!=`number`:e.mux===t),r=[];return n.forEach((e,t)=>{r.push({s:t,text:!1}),e.values&&r.push({s:t,text:!0})}),Et({key:lt(e.id,e.extended),mux:t,signals:n,channels:r},r.map((e,t)=>t))},p=new jt(e=>{let t=a.get(e);if(!t){let t=kt(e);return s.set(e,t),t}let r=At(t,f(t,null));return o.push({model:n,m:r}),r});u.data.sdRecordId!==null&&d.want(u.data.sdRecordId);let m=xt();for await(let o of ct(e,t,[n],d,r,Tt(i,u,a))){let e=await St(i,u,o.buf,o.n,o.start,o.size,d,m),t=(e,t)=>{let n=a.get(e.key);return n.signals.some(e=>e.mux===t)?f(n,t):null};for(let n of Mt(e,p,t)){let t=Ot(n,e);if(l<0)continue;if((l+=t.time.length*(1+t.cols.length))>48e6){l=-1,c.clear();continue}let r=c.get(n);r||c.set(n,r=[]),r.push(t)}}}let f=[],p=new Map;for(let{model:e,m:t}of o)for(let n of[t.all,...t.byMux.values()]){if(!n)continue;let{route:t,n:r,t0:i,t1:o}=n;if(t.signals.length===0)continue;let s=a.get(t.key);l>=0&&p.set(t,c.get(n)??[]),f.push({model:e,route:t,group:{name:t.mux===null?s.name:`${s.name} [m=${t.mux}]`,channels:t.channels.map(e=>({name:e.text?`${t.signals[e.s].name} (text)`:t.signals[e.s].name,unit:e.text?``:t.signals[e.s].unit,text:e.text})),samples:r,time:{kind:`timestamps`},rateHz:r>1&&o>i?Math.round((r-1)/(o-i)*1e6)/1e6:null}})}let m=[];if(s.size){let e=[...s.values()].reduce((e,t)=>e+t.frames,0),t=[...s.keys()].map(e=>`0x${(e%2147483648).toString(16).toUpperCase()}`).join(`, `);m.push(`${e} frame${e===1?``:`s`} with ${s.size} id${s.size===1?``:`s`} not in the DBC ${e===1?`was`:`were`} skipped (${t}).`)}return{dbc:a,layouts:i,routes:f,notes:m,cache:p}}async function*Pt(e,t,n,r,i,a){let o=[];for(let e of i){let t=r.cache.get(e.route);if(!t){o.push(e);continue}r.cache.delete(e.route);let n=0;for(let r of t)yield{group:e.group,start:n,length:r.time.length,time:r.time,columns:e.sel.map(e=>r.cols[e])},n+=r.time.length}if(!o.length)return;let s=r.layouts.get(n),c=t.groups[n],l=new Map,u=new Map;for(let e of o){let t=Et(e.route,e.sel);l.set(t,e.group);let n=u.get(e.route.key);n||u.set(e.route.key,n={all:null,byMux:new Map}),e.route.mux===null?n.all=t:n.byMux.set(e.route.mux,t)}let d=new jt(e=>{let t=u.get(e);if(!t)return kt(e);let n=At(r.dbc.get(e),t.all);return t.byMux.size||(n.sw=null),n}),f=new it(e,a);s.data.sdRecordId!==null&&f.want(s.data.sdRecordId);let p=xt();for await(let i of ct(e,t,[n],f,a,Tt(c,s,r.dbc))){let e=await St(c,s,i.buf,i.n,i.start,i.size,f,p);for(let t of Mt(e,d,(e,t)=>u.get(e.key).byMux.get(t)??null)){let n=t.n,r=Ot(t,e);yield{group:l.get(t),start:n,length:r.time.length,time:r.time,columns:r.cols}}}}const Ft=e=>Math.round(e*1e6)/1e6,It=e=>e.kind===`value`?e.type!==`bytes`:e.kind===`vlsd`&&e.type===`string`,Lt=e=>({name:e.name,unit:e.unit,text:e.type===`string`||e.kind===`vlsd`||e.conv.k===`text`});async function Rt(e,t){let n=t.master;if(!n||t.cycles<2)return null;if(n.kind===`vmaster`)return n.conv.k===`lin`&&n.conv.a>0?Ft(1/n.conv.a):null;if(!t.sorted)return null;let r=F(t),i=t.cycles,a,o;if(t.stream[0]?.zip){let n=Xe(t.stream.slice(0,1),r,ye(t,[])),s=await Ze(e,t.stream[0],n,4096*r);if(i=Math.min(t.cycles,Math.floor(s.length/n)),i<2)return null;a=s.subarray(0,n),o=s.subarray((i-1)*n,i*n)}else a=await et(e,t.stream,0,r),o=await et(e,t.stream,t.cycles-1,r);if(!a||!o)return null;let s=new Float64Array(2);return P(n,a,1,r,t.recordIdSize,s,0),P(n,o,1,r,t.recordIdSize,s,1),_(n.conv,s),s[1]>s[0]?Ft((i-1)/(s[1]-s[0])):null}async function zt(e,t,n,r,i,a,o){let s;if(e.kind===`vlsd`){let a=new Float64Array(n);P({...e,type:`uint`},t,n,r,i,a),s=await o.strings(e,a)}else if(e.type===`string`)s=fe(e,t,n,r,i);else{let a=new Float64Array(n);P(e,t,n,r,i,a),e.conv.k===`text`?s=b(e.conv,a):(_(e.conv,a),s=a)}return pe(e,t,n,r,a,s),s}async function Bt(e,t,n,r,i,a,o,s){let c=e.recordIdSize,l=[];for(let i of t)l.push(await zt(e.channels[i],n,r,a,c,c+e.dataBytes,s));return{group:o,time:at(e,n,r,i,a),start:i,length:r,columns:l}}async function*Vt(e,t){let n=e.plan.state,r=t.filter(e=>n.groups[e].route),i=t.filter(e=>!n.groups[e].route);if(r.length){let t=r.map(t=>({group:t,route:n.groups[t].route,sel:f(e,t)}));yield*Pt(e.io,n.model,n.groups[r[0]].model,n.bus,t,e.signal)}if(!i.length)return;let a=new it(e.io,e.signal),o=new Map;for(let t of i){let r=n.groups[t],i=f(e,t).map(e=>r.channels[e]);for(let e of i){let t=n.model.groups[r.model].channels[e].sdRecordId;t!==null&&a.want(t)}o.set(r.model,{pg:t,cols:i})}let[s,{cols:c}]=o.entries().next().value,l=n.model.groups[s],u=o.size===1?ye(l,c.map(e=>l.channels[e])):1/0;for await(let t of ct(e.io,n.model,[...o.keys()],a,e.signal,u)){let{pg:e,cols:r}=o.get(t.g);yield await Bt(n.model.groups[t.g],r,t.buf,t.n,t.start,t.size,e,a)}}function Ht(e){let t=e.plan.state,n=new Map;for(let r of e.selection){let e=t.model.groups[t.groups[r.group].model].dg;n.set(e,[...n.get(e)??[],r.group])}return[...n].sort((e,t)=>e[0]-t[0]).map(([,e])=>e)}const Ut={...me,async plan(e,t){let n=await t.read(0,64);if(d(n,`UnFinMF`))throw Error(`This MF4 was not finalized by its logger (it starts with UnFinMF). Finalize it with the logger software or asammdf, then open it again.`);let r=l(n.subarray(8,16)).replace(/\0/g,``).trim(),i=Number(r.replace(`.`,``).slice(0,3))>=400?await N(t,r):await S(t,n,r);ve(i,t.size);let a=await Nt(t,i,e.companions.filter(e=>e.name.toLowerCase().endsWith(`.dbc`))),o=new Set(a?.layouts.keys()??[]),s=[],c=[],u=[...i.notes],f=0;for(let e=0;e<i.groups.length;e++){let n=i.groups[e];if(n.vlsdCg||n.cycles===0||o.has(e))continue;let r=[];if(n.channels.forEach((e,t)=>{It(e)?r.push(t):f++}),r.length!==0){for(let e of r){let t=n.channels[e].conv;t.k===`unsupported`&&u.push(`${n.channels[e].name}: ${t.what} is not supported; raw values are shown.`)}c.push({model:e,channels:r}),s.push({name:n.name,channels:r.map(e=>Lt(n.channels[e])),samples:n.cycles,time:n.master?{kind:`timestamps`}:{kind:`index`},rateHz:await Rt(t,n)})}}if(f&&u.push(`${f} byte-array channel${f===1?` was`:`s were`} skipped.`),a){if(a.routes.length===0&&a.dbc.size===0){if(s.length===0)throw Error(`This MF4 has raw CAN frames. Drop its .dbc file together with it to decode signals.`);u.push(`This MF4 also has raw CAN frames. Drop its .dbc file together with it to decode signals.`)}for(let e of a.routes)c.push({model:e.model,route:e.route}),s.push(e.group);u.push(...a.notes)}if(s.length===0)throw Error(`This MDF file has no channels with samples.`);let p={model:i,groups:c,bus:a};return{format:i.version,startTime:i.startTime,groups:s,meta:i.meta,events:[],notes:u,interleaved:!!a?.routes.length||i.groups.some(e=>!e.sorted&&!e.vlsdCg),state:p}},async*stream(e){for(let t of Ht(e))yield*Vt(e,t)},streamGroup(e,t){return Vt(e,[t])}},Wt={id:`edf`,label:`EDF / BDF (+)`,extensions:[`.edf`,`.bdf`,`.rec`],sniff:e=>d(e,`0 `)||e[0]===255&&d(e,`BIOSEMI`,1)};function Gt(e){let t=[];for(let n of u(e).split(`\0`)){if(!n)continue;let e=n.split(``),r=parseFloat(e[0].split(``)[0]);Number.isFinite(r)&&t.push({onset:r,texts:e.slice(1).filter(e=>e.length>0)})}return t}function Kt(e,t){let n=/^(\d\d)\.(\d\d)\.(\d\d)$/.exec(e),r=/^(\d\d)\.(\d\d)\.(\d\d)$/.exec(t);if(!n||!r)return null;let i=Number(n[3]);return`${i>=85?1900+i:2e3+i}-${n[2]}-${n[1]}T${r[1]}:${r[2]}:${r[3]}`}const qt=e=>`${+e.toFixed(6)} Hz`;function Jt(e,t,n,r,i,a,o,s){let{bit:c,off:l}=e;if(a===2)for(let e=0;e<i;e++)o[s+e]=c*(l+t.getInt16(r+2*e,!0));else for(let e=0,t=r;e<i;e++,t+=3)o[s+e]=c*(l+((n[t]|n[t+1]<<8|n[t+2]<<16)<<8>>8))}const Yt={...Wt,async plan(e,t){let n=await t.read(0,256),r=(e,t)=>l(n.subarray(e,e+t)).trim(),i=n[0]===255,a=parseInt(r(252,4),10),o=parseInt(r(184,8),10),s=r(192,44),c=/^(EDF|BDF)\+/.test(s),u=/^(EDF|BDF)\+D/.test(s),d=parseFloat(r(244,8));if(!(a>0)||o!==256*(a+1)||!(d>0))throw Error(`This EDF/BDF header is damaged.`);let f=await t.read(256,a*256),p=(e,t,n)=>l(f.subarray(e*a+t*n,e*a+t*(n+1))).trim(),m=i?3:2,h=[],g=0;for(let e=0;e<a;e++){let t=parseFloat(p(104,8,e)),n=parseFloat(p(112,8,e)),r=parseFloat(p(120,8,e)),i=parseFloat(p(128,8,e)),a=Number(p(216,8,e));if(!(Number.isInteger(a)&&a>=0))throw Error(`This EDF/BDF header is damaged (samples per record).`);let o=(n-t)/(i-r);h.push({label:p(0,16,e),unit:p(96,8,e),spr:a,offset:g,bit:o,off:n/o-i}),g+=a*m}let _=g;if(!(_>0&&o+_<=t.size))throw Error(`This EDF/BDF file is damaged (its data records do not fit in it).`);let v=Math.floor((t.size-o)/_),y=parseInt(r(236,8),10),b=[];y>=0?y>v&&(b.push(`The file is shorter than its header says: ${v} of ${y} data records were read.`),y=v):y=v;let x=c?h.flatMap((e,t)=>/^(EDF|BDF) Annotations$/.test(e.label)?[t]:[]):[],S=new Map;h.forEach((e,t)=>{!x.includes(t)&&e.spr>0&&S.set(e.spr,[...S.get(e.spr)??[],t])});let C=[...S.values()],w=C.map(e=>{let t=h[e[0]].spr/d;return{name:qt(t),channels:e.map(e=>({name:h[e].label,unit:h[e].unit})),samples:y*h[e[0]].spr,rateHz:t,time:u?{kind:`timestamps`}:{kind:`rate`,rate:t,start:0}}}),T={headerBytes:o,records:y,duration:d,recordBytes:_,bps:m,signals:h,groups:C,annotations:x,discontinuous:u};return{format:`${i?`BDF`:`EDF`}${c?u?`+D`:`+`:``}`,startTime:Kt(r(168,8),r(176,8)),groups:w,meta:{patient:r(8,80),recording:r(88,80)},events:[],notes:u?[`Discontinuous recording: each gap shows as a break in the traces.`,...b]:b,state:T}},async*stream(e){let n=e.plan.state,i=Math.max(1,Math.floor(t/n.recordBytes)),a=e.selection.map(e=>({g:e.group,chans:e.channels.map(t=>n.signals[n.groups[e.group][t]]),spr:n.signals[n.groups[e.group][0]].spr})),o=a.map(()=>0),s=0,c=NaN;for await(let t of e.io.windows(n.headerBytes,n.records*n.recordBytes,i*n.recordBytes)){e.signal?.throwIfAborted();let i=Math.floor(t.bytes.length/n.recordBytes);if(i===0)break;let l=r(t.bytes),u=new Float64Array(i),d=[];for(let e=0;e<i;e++)u[e]=(s+e)*n.duration,n.annotations.forEach((r,i)=>{let a=n.signals[r],o=e*n.recordBytes+a.offset,s=Gt(t.bytes.subarray(o,o+a.spr*n.bps));i===0&&s.length&&(u[e]=s[0].onset);for(let e of s)for(let t of e.texts)d.push({time:e.onset,text:t})});let f=new Uint8Array(i),p=0;if(n.discontinuous)for(let e=0;e<i;e++){let t=e?u[e-1]+n.duration:c;t===t&&u[e]>t+1e-9&&(f[e]=1,p++)}for(let e=0;e<a.length;e++){let r=a[e],s=r.spr/n.duration,m=i*r.spr+p,h=n.discontinuous?new Float64Array(m):null,g=r.chans.map(()=>new Float64Array(m)),_=0;for(let e=0;e<i;e++){if(f[e]){h[_]=e?u[e-1]+n.duration:c;for(let e of g)e[_]=NaN;_++}if(h)for(let t=0;t<r.spr;t++)h[_+t]=u[e]+t/s;let i=e*n.recordBytes;r.chans.forEach((e,a)=>Jt(e,l,t.bytes,i+e.offset,r.spr,n.bps,g[a],_)),_+=r.spr}let v={group:r.g,time:h,start:o[e],length:m,columns:g};e===0&&d.length&&(v.events=d),o[e]+=m,yield v}c=u[i-1]+n.duration,s+=i}}};function Xt(e,t=[`Time`]){let n=new Set(t.map(e=>e.toLowerCase())),r=new Map;return e.map(e=>{let t=e.trim()||`Channel`,i=t.toLowerCase(),a=t,o=r.get(i)??2;if(n.has(i)){for(;n.has(`${i} (${o})`);)o++;a=`${t} (${o++})`}return r.set(i,o),n.add(a.toLowerCase()),a})}const Zt={id:`xdf`,label:`XDF (Lab Streaming Layer)`,extensions:[`.xdf`],sniff:e=>d(e,`XDF:`)},G={float32:4,double64:8,int8:1,int16:2,int32:4,int64:8};function K(e,t,n=0){let r=e.indexOf(`<${t}>`,n);if(r<0)return``;let i=e.indexOf(`</${t}>`,r);return i<0?``:e.slice(r+t.length+2,i).trim()}function Qt(e,t){let n=[];for(let r=e.indexOf(`<${t}>`);r>=0;){let i=e.indexOf(`</${t}>`,r);if(i<0)break;n.push(e.slice(r,i+t.length+3)),r=e.indexOf(`<${t}>`,i)}return n}const $t=e=>e.fmt===`string`||G[e.fmt]!==void 0;function q(e,t,n){let r=e[n];if((r===1||r===4||r===8)&&n+1+r<=e.length)return r===1?[e[n+1],2]:r===4?[t.getUint32(n+1,!0),5]:[i(t,n+1),9];throw Error(`This XDF file is damaged (bad length field).`)}function en(e,t,n,r){if(n>=e.length)return-1;if(e[n++]===8&&(n+=8),r.fmt!==`string`)return n+G[r.fmt]*r.nch<=e.length?n+G[r.fmt]*r.nch:-1;for(let i=0;i<r.nch;i++){if(n>=e.length)return-1;let[r,i]=q(e,t,n);n+=i+r}return n<=e.length?n:-1}async function*tn(e,t){let n=new Uint8Array;for await(let i of e.windows(4,e.size-4)){t?.throwIfAborted();let a=i.bytes,o=i.offset-n.length;if(n.length){let e=new Uint8Array(n.length+a.length);e.set(n),e.set(a,n.length),a=e}let s=r(a),c=0;for(;!(c+1>a.length);){let t=a[c];if(c+1+t>a.length)break;let[n,r]=q(a,s,c),i=c+r+n;if(o+i>e.size)return;if(i>a.length)break;yield{tag:a[c+r]|a[c+r+1]<<8,body:a.subarray(c+r+2,i)},c=i}n=a.slice(c)}}function nn(e,t,n){let r=t-e.i0,i=n-e.t0;e.n++,e.si+=r,e.st+=i,e.sii+=r*r,e.sit+=r*i}function rn(e){let t=e.n*e.sii-e.si*e.si;e.b=t>0?(e.n*e.sit-e.si*e.st)/t:0,e.a=(e.st-e.b*e.si)/Math.max(1,e.n)}function an(e){if(e.length===0)return[0,0];if(e.length===1)return[e[0][1],0];let t={i0:e[0][0],t0:0,n:0,si:0,st:0,sii:0,sit:0,a:0,b:0};for(let[n,r]of e)nn(t,n,r);return rn(t),[t.a-t.b*t.i0,t.b]}function on(e,t,n){let r=t.t0+t.a+t.b*(n-t.i0);return r+e.c0+e.c1*r}const sn={...Zt,async plan(e,t){let n=new Map,i=``;for await(let e of tn(t)){let t=r(e.body);if(e.tag===1)i=u(e.body);else if(e.tag===2){let r=t.getUint32(0,!0),i=u(e.body.subarray(4)),a=parseInt(K(i,`channel_count`),10)||1;if(!(a>=1&&a<=1e5))throw Error(`This XDF file is damaged (a stream with ${a} channels).`);let o=Qt(i,`channel`);n.set(r,{id:r,name:K(i,`name`)||`Stream ${r}`,nch:a,srate:parseFloat(K(i,`nominal_srate`))||0,fmt:K(i,`channel_format`)||`float32`,labels:Array.from({length:a},(e,t)=>K(o[t]??``,`label`)||`Ch${t+1}`),units:Array.from({length:a},(e,t)=>K(o[t]??``,`unit`)),count:0,segs:[],clock:[],c0:0,c1:0,lastTs:NaN})}else if(e.tag===3){let r=n.get(t.getUint32(0,!0));if(!r||!$t(r))continue;let[i,a]=q(e.body,t,4),o=4+a,s=G[r.fmt],c=r.srate>0?Math.max(1,500/r.srate):1/0;for(let n=0;n<i&&!(en(e.body,t,o,r)<0);n++){let n;if(e.body[o++]===8?(n=t.getFloat64(o,!0),o+=8):n=r.lastTs+(r.srate>0?1/r.srate:0),r.fmt===`string`)for(let n=0;n<r.nch;n++){let[n,r]=q(e.body,t,o);o+=r+n}else o+=s*r.nch;if(r.srate>0){let e=r.segs[r.segs.length-1];(!e||n-r.lastTs>c)&&r.segs.push(e={i0:r.count,t0:n,n:0,si:0,st:0,sii:0,sit:0,a:0,b:0}),nn(e,r.count,n)}else r.count===0&&r.segs.push({i0:0,t0:n,n:1,si:0,st:0,sii:0,sit:0,a:0,b:0});r.lastTs=n,r.count++}}else if(e.tag===4){let e=n.get(t.getUint32(0,!0));e&&e.clock.push([t.getFloat64(4,!0),t.getFloat64(12,!0)])}}let a=[],o=[...n.values()].sort((e,t)=>e.id-t.id).filter(e=>($t(e)||a.push(`${e.name}: channel format ${e.fmt} is not supported; skipped.`),$t(e))),s=1/0;for(let e of o){[e.c0,e.c1]=an(e.clock);for(let t of e.segs)rn(t);if(e.count===0)continue;let t=e.srate>0?on(e,e.segs[0],0):e.segs[0].t0+e.c0+e.c1*e.segs[0].t0;s=Math.min(s,t)}let c=Xt(o.map(e=>e.name),[]),l=o.map((e,t)=>({name:c[t],channels:e.labels.map((t,n)=>({name:t,unit:e.units[n],...e.fmt===`string`?{text:!0,sparse:!0}:{}})),samples:e.count,time:{kind:`timestamps`},rateHz:e.srate>0?e.srate:null,irregular:e.srate===0})),d=K(i,`version`);return{format:`XDF ${d||`1.0`}`,startTime:null,groups:l,meta:{header:d},events:[],notes:a,state:{streams:o,origin:Number.isFinite(s)?s:0}}},async*stream(e){let t=e.plan.state,n=8192,i=new Map,a=e=>e.sel.map(()=>e.s.fmt===`string`?Array(n):new Float64Array(n));for(let r of e.selection){let o=t.streams[r.group],s={g:r.group,s:o,sel:f(e,r.group),time:new Float64Array(n),cols:[],n:0,start:0,seg:0,i:0,raw:NaN};s.cols=a(s),i.set(o.id,s)}let o=e=>{let t={group:e.g,time:e.time.slice(0,e.n),start:e.start,length:e.n,columns:e.cols.map(t=>t.slice(0,e.n))};return e.start+=e.n,e.n=0,e.time=new Float64Array(n),e.cols=a(e),t};for await(let a of tn(e.io,e.signal)){if(a.tag!==3)continue;let e=r(a.body),s=i.get(e.getUint32(0,!0));if(!s)continue;let c=s.s,[l,d]=q(a.body,e,4),f=4+d,p=G[c.fmt],m=[];for(let r=0;r<l&&!(en(a.body,e,f,c)<0);r++){let r;a.body[f++]===8?(r=e.getFloat64(f,!0),f+=8):r=s.raw+(c.srate>0?1/c.srate:0),s.raw=r;let i;if(c.srate>0){for(;s.seg+1<c.segs.length&&c.segs[s.seg+1].i0<=s.i;)s.seg++;i=on(c,c.segs[s.seg],s.i)}else i=r+c.c0+c.c1*r;if(s.time[s.n]=i-t.origin,c.fmt===`string`){let n=[];for(let t=0;t<c.nch;t++){let[t,r]=q(a.body,e,f);n.push(u(a.body.subarray(f+r,f+r+t))),f+=r+t}s.sel.forEach((e,t)=>{s.cols[t][s.n]=n[e]}),m.push({time:i-t.origin,text:n.join(` `)})}else s.sel.forEach((t,n)=>{let r=f+t*p,i=s.cols[n];switch(c.fmt){case`float32`:i[s.n]=e.getFloat32(r,!0);break;case`double64`:i[s.n]=e.getFloat64(r,!0);break;case`int8`:i[s.n]=e.getInt8(r);break;case`int16`:i[s.n]=e.getInt16(r,!0);break;case`int32`:i[s.n]=e.getInt32(r,!0);break;default:i[s.n]=e.getInt32(r+4,!0)*4294967296+e.getUint32(r,!0)}}),f+=p*c.nch;s.i++,++s.n===n&&(yield o(s))}m.length&&(yield{group:s.g,time:new Float64Array,start:s.start,length:0,columns:s.sel.map(()=>new Float64Array),events:m})}for(let e of i.values())e.n&&(yield o(e))}},cn={id:`tdms`,label:`NI TDMS`,extensions:[`.tdms`],companions:[{ext:`.tdms_index`}],sniff:e=>d(e,`TDSm`)},ln=4713,un=4714,J={1:1,2:2,3:4,4:8,5:1,6:2,7:4,8:8,9:4,10:8,25:4,26:8,33:1,68:16},dn={0:5,1:1,2:6,3:2,4:7,5:3,6:8,7:4,8:9,9:10,4294967295:68},fn=(e,t,n)=>n?a(e,t+8,n)+i(e,t,n)/2**64:a(e,t,n)+i(e,t+8,n)/2**64;function pn(e,t,n,r,o){switch(r){case 32:{let r=e.getUint32(n,o);return[u(t.subarray(n+4,n+4+r)),4+r]}case 1:return[e.getInt8(n),1];case 2:return[e.getInt16(n,o),2];case 3:return[e.getInt32(n,o),4];case 4:return[a(e,n,o),8];case 5:return[e.getUint8(n),1];case 6:return[e.getUint16(n,o),2];case 7:return[e.getUint32(n,o),4];case 8:return[i(e,n,o),8];case 9:case 25:return[e.getFloat32(n,o),4];case 10:case 26:return[e.getFloat64(n,o),8];case 33:return[e.getUint8(n)!==0,1];case 68:return[fn(e,n,o),16];default:throw Error(`This TDMS file has a property of type ${r}, which Kymoscope cannot read.`)}}function mn(e){let t=/^\/'((?:[^']|'')*)'(?:\/'((?:[^']|'')*)')?$/.exec(e);return t?[t[1].replace(/''/g,`'`),(t[2]??``).replace(/''/g,`'`)]:null}const hn=4294967295;function gn(e){if(e.has(`NI_Number_Of_Scales`))return Number(e.get(`NI_Number_Of_Scales`));let t=0;for(let n of e.keys()){let e=/^NI_Scale\[(\d+)\]_Scale_Type$/.exec(n);e&&(t=Math.max(t,Number(e[1])+1))}return t}function _n(e,t,n){let r=e.find(e=>gn(e)>0);if(!r||r.get(`NI_Scaling_Status`)===`scaled`)return null;let i=(e,a)=>{if(e===hn||e<0||a>8)return e=>e;let o=r.get(`NI_Scale[${e}]_Scale_Type`);if(o===void 0)return e=>e;if(o===`Linear`){let t=Number(r.get(`NI_Scale[${e}]_Linear_Slope`)),n=Number(r.get(`NI_Scale[${e}]_Linear_Y_Intercept`)??0),o=i(Number(r.get(`NI_Scale[${e}]_Linear_Input_Source`)??hn),a+1);return o&&(e=>t*o(e)+n)}if(o===`Polynomial`){let o=Number(r.get(`NI_Scale[${e}]_Polynomial_Coefficients_Size`)??4);if(!(Number.isInteger(o)&&o>=0&&o<=64))return t.push(`${n}: an NI polynomial scale with ${o} coefficients is not supported; raw values are shown.`),null;let s=Array.from({length:o},(t,n)=>Number(r.get(`NI_Scale[${e}]_Polynomial_Coefficients[${n}]`))),c=i(Number(r.get(`NI_Scale[${e}]_Polynomial_Input_Source`)??hn),a+1);return c&&(e=>{let t=c(e),n=0;for(let e=o-1;e>=0;e--)n=n*t+s[e];return n})}return t.push(`${n}: NI scale type ${String(o)} is not supported; raw values are shown.`),null};return i(gn(r)-1,0)}const vn={1:Int8Array,2:Int16Array,3:Int32Array,5:Uint8Array,6:Uint16Array,7:Uint32Array,9:Float32Array,10:Float64Array,25:Float32Array,26:Float64Array,33:Uint8Array};function yn(e,t,n,r,o,s,c,l){let u=vn[e];if(u&&s&&r===J[e]&&(t.byteOffset+n)%r===0){c.set(new u(t.buffer,t.byteOffset+n,o),l);return}switch(e){case 1:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getInt8(n);return;case 2:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getInt16(n,s);return;case 3:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getInt32(n,s);return;case 4:for(let e=0;e<o;e++,n+=r)c[l+e]=a(t,n,s);return;case 5:case 33:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getUint8(n);return;case 6:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getUint16(n,s);return;case 7:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getUint32(n,s);return;case 8:for(let e=0;e<o;e++,n+=r)c[l+e]=i(t,n,s);return;case 9:case 25:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getFloat32(n,s);return;case 10:case 26:for(let e=0;e<o;e++,n+=r)c[l+e]=t.getFloat64(n,s);return;case 68:for(let e=0;e<o;e++,n+=r)c[l+e]=fn(t,n,s);return;default:c.fill(NaN,l,l+o)}}async function bn(e,t,n){let a=new Map,o=[],s=[],c=new Map,l=new Map,d=t??e,f=0,p=0;for(;f+28<=e.size&&p+28<=d.size;){let m=t?p:f,h=await d.read(m,28),g=r(h);if(!(h[0]===84&&h[1]===68&&h[2]===83&&(h[3]===109||h[3]===104)))throw Error(`This TDMS file is damaged (no segment lead-in where one should be).`);let _=g.getUint32(4,!0),v=!(_&64),y=i(g,12,v),b=i(g,20,v),x=y>=2**53?e.size:Math.min(e.size,f+28+y);if(b>x-f-28)throw Error(`This TDMS file is damaged (segment metadata longer than its segment).`);if(_&2){let e=await d.read(m+28,b),t=r(e);_&4&&(s=[],c=new Map);let o=0,f=t.getUint32(o,v);o+=4;for(let r=0;r<f;r++){let r=t.getUint32(o,v),d=u(e.subarray(o+4,o+4+r));o+=4+r;let f=mn(d),p=a.get(d);p||a.set(d,p={path:d,group:f?.[0]??``,name:f?.[1]??``,type:0,props:new Map,pieces:[],total:0});let m=t.getUint32(o,v);o+=4;let h=null;if(m===4294967295)h=null;else if(m===0)h=l.get(p)??null;else if(m===ln||m===un){let e=i(t,o+8,v),r=t.getUint32(o+16,v),a=m===ln?20:17,s=o+20,c=dn[t.getUint32(s,v)]??0,l=t.getUint32(s+8,v);o=s+r*a;let u=t.getUint32(o,v);o+=4;let d=0;for(let e=0;e<u;e++)d+=t.getUint32(o+4*e,v);o+=4*u,m===un?n.push(`${p.name}: DAQmx digital line data is not supported; skipped.`):(r>1&&n.push(`${p.name}: only the first of its ${r} DAQmx scalers is read.`),h={type:c,count:e,bytes:0,daqmx:{byteOffset:l,stride:d}})}else{let e=t.getUint32(o,v),n=i(t,o+8,v),r=e===32?i(t,o+16,v):n*(J[e]??0);o+=m-4,h={type:e,count:n,bytes:r,daqmx:null}}h&&(p.type=h.type,l.set(p,h));let g=t.getUint32(o,v);o+=4;for(let n=0;n<g;n++){let n=t.getUint32(o,v),r=u(e.subarray(o+4,o+4+n));o+=4+n;let i=t.getUint32(o,v);o+=4;let[a,s]=pn(t,e,o,i,v);p.props.set(r,a),o+=s}let _=c.get(p);_===void 0?c.set(p,s.push({obj:p,idx:h})-1):s[_].idx=h}}if(_&8){let e=f+28+b,t=s.filter(e=>e.idx&&e.idx.count>0),n=t.filter(e=>e.idx.daqmx),r=(_&32)!=0,i=0,a=0;n.length?(a=n[0].idx.daqmx.stride,i=n[0].idx.count*a):r?(a=t.reduce((e,t)=>e+(J[t.idx.type]??0),0),i=(t[0]?.idx.count??0)*a):i=t.reduce((e,t)=>e+t.idx.bytes,0);let c=i>0?Math.floor((x-e)/i):0,l=o.push({rawStart:e,chunkSize:i,chunks:c,le:v})-1,u=0;for(let e of t){let t=e.idx,n=J[t.type]??0,o=t.daqmx?{seg:l,count:t.count,offset:t.daqmx.byteOffset,bytes:0,stride:a,type:t.type}:{seg:l,count:t.count,offset:u,bytes:t.bytes,stride:r?a:n,type:t.type};t.daqmx||(u+=r?n:t.bytes),o.type===32?o.count=Math.min(o.count,Math.floor(o.bytes/4)):n>0&&(o.count=Math.min(o.count,o.stride>0?Math.max(0,Math.floor((i-o.offset-n)/o.stride)+1):0)),e.obj.pieces.push(o),c&&(e.obj.total+=o.count*c)}}if(f=x,p+=28+b,x>=e.size)break}return{objs:[...a.values()],segments:o}}const xn={...cn,async plan(e,t){let i=e.companions.find(e=>e.name.toLowerCase().endsWith(`.tdms_index`)),a=[],{objs:o,segments:s}=await bn(t,i?new n(i):null,a),c=o.find(e=>e.path===`/`)?.props,l=o.filter(e=>e.name&&e.total>0&&(e.type===32||J[e.type])),u=new Set(l);for(let e of o)e.name&&e.total>0&&!u.has(e)&&a.push(`${e.name}: TDMS data type ${e.type} is not supported; skipped.`);let d=l.map(e=>e.props.get(`wf_start_time`)).filter(e=>typeof e==`number`),f=d.reduce((e,t)=>Math.min(e,t),d.length?1/0:0),p=new Map;for(let e of l){let t=`${e.total}|${e.props.get(`wf_increment`)??``}`,n=p.get(e.group)??new Map,r=n.get(t);r?r.push(e):n.set(t,[e]),p.set(e.group,n)}let m=[],h=[];for(let[e,t]of p)for(let n of t.values()){let r=n[0].props.get(`wf_increment`),i=typeof r==`number`&&r>0?1/r:null,a=i?null:n.find(e=>e.type===68)??n.find(e=>e.type!==32&&/^(time|timestamp|t)$/i.test(e.name))??null,o=n.filter(e=>e!==a),s=n[0].props.get(`wf_start_time`),c=i?Number(n[0].props.get(`wf_start_offset`)??0)+(typeof s==`number`?s-f:0):0;m.push({name:t.size===1?e:`${e} (${i?+i.toFixed(6):n[0].total} ${i?`Hz`:`samples`})`,channels:o.map(e=>({name:e.name,unit:String(e.props.get(`unit_string`)??``),text:e.type===32})),samples:n[0].total,time:i?{kind:`rate`,rate:i,start:c}:a?{kind:`timestamps`}:{kind:`index`},rateHz:i}),h.push({channels:o,time:a,origin:0})}if(m.length===0)throw Error(`This TDMS file has no channels with data.`);let g=[];for(let e of h){if(!e.time)continue;let n=e.time.pieces[0],i=s[n.seg],a=await t.read(i.rawStart+n.offset,J[n.type]??8),o=new Float64Array(1);yn(n.type,r(a),0,0,1,i.le,o,0),g.push(o[0])}let _=g.reduce((e,t)=>Math.min(e,t),g.length?1/0:0);for(let e of h)e.origin=_;let v=new Date(Date.UTC(1904,0,1)+f*1e3),y=f&&Number.isFinite(v.getTime())?v.toISOString():null,b={objs:o,segments:s,groups:h},x={};for(let[e,t]of c??[])typeof t==`string`&&(x[e]=t);return{format:`TDMS`,startTime:y,groups:m,meta:x,events:[],notes:a,state:b}},async*stream(e){for(let t of e.selection)yield*Cn(e,t.group)},streamGroup:(e,t)=>Cn(e,t)};function Sn(e,t,n,r,i,a){let o=0;for(;o<i&&r.pi<t.pieces.length;){let s=t.pieces[r.pi],c=e.segments[s.seg];if(r.chunk>=c.chunks){r.pi++,r.chunk=0,r.row=0;continue}let l=Math.min(i-o,s.count-r.row),u=c.rawStart+r.chunk*c.chunkSize+s.offset;if(s.type===32)a.push({ch:n,at:u,end:u+s.bytes,rows:l,first:r.row,out:o,piece:s,le:c.le,range:0});else{let e=u+r.row*s.stride;a.push({ch:n,at:e,end:e+(l-1)*s.stride+J[s.type],rows:l,first:r.row,out:o,piece:s,le:c.le,range:0})}o+=l,r.row+=l,r.row>=s.count&&(r.chunk++,r.row=0)}}async function*Cn(e,t){let n=e.plan.state,i=n.groups[t],a=f(e,t).map(e=>i.channels[e]),o=i.time?[i.time,...a]:a;if(!o.length)return;let s=new Map(n.objs.map(e=>[e.path,e.props])),c=e=>s.get(e)??new Map,l=c(`/`),d=o.map(e=>_n([e.props,c(`/'${e.group.replace(/'/g,`''`)}'`),l],[],e.name)),p=o.map(()=>({pi:0,chunk:0,row:0})),m=o.reduce((e,t)=>Math.min(e,t.total),1/0);for(let a=0;a<m;){e.signal?.throwIfAborted();let s=Math.min(65536,m-a),c=[];o.forEach((e,t)=>Sn(n,e,t,p[t],s,c));let l=c.slice().sort((e,t)=>e.at-t.at),f=[];for(let e of l){let t=f[f.length-1];t&&e.at<=t.end+65536&&Math.max(t.end,e.end)-t.at<=16777216?t.end=Math.max(t.end,e.end):f.push({at:e.at,end:e.end}),e.range=f.length-1}let h=[];for(let t of f)h.push(await e.io.slice(t.at,t.end-t.at));let g=h.map(r),_=o.map(e=>e.type===32?Array(s).fill(null):new Float64Array(s).fill(NaN));for(let e of c){let t=e.at-f[e.range].at,n=e.piece;if(n.type===32){let r=h[e.range],i=g[e.range],a=t+4*n.count,o=_[e.ch];for(let n=0;n<e.rows;n++){let s=e.first+n,c=s===0?0:i.getUint32(t+4*(s-1),e.le),l=i.getUint32(t+4*s,e.le);o[e.out+n]=u(r.subarray(a+c,a+l))}}else yn(n.type,g[e.range],t,n.stride,e.rows,e.le,_[e.ch],e.out)}for(let e=0;e<o.length;e++){let t=d[e],n=_[e];if(t&&n instanceof Float64Array)for(let e=0;e<s;e++)n[e]=t(n[e])}let v=null;if(i.time){v=_.shift();for(let e=0;e<s;e++)v[e]-=i.origin}yield{group:t,time:v,start:a,length:s,columns:_},a+=s}}const wn={id:`hdf5`,label:`HDF5`,extensions:[`.h5`,`.hdf5`,`.hdf`,`.he5`,`.nc`],sniff:e=>[0,512,1024,2048].some(t=>d(e,`HDF\r
|
|
2
2
|
|
|
3
|
-
`,t))},Tn=e=>!!e&&typeof e.keys==`function`,En=1e5;function Dn(){let e=new Set,t=0,n=!1;return{enter(t){let r=null;try{r=t.create_reference?Array.prototype.join.call(t.create_reference().ref_data,`,`):null}catch{r=null}return r===null?!0:e.has(r)?(n=!0,!1):(e.add(r),!0)},count:()=>++t<=En,note:()=>t>1e5?`This file has more than ${En.toLocaleString(`en-US`)} objects (or links that repeat its groups); only the first were read.`:n?`Some groups of this file link back to a group already read; each was read once.`:null}}function On(e,t,n,r){return t.reduce((e,t)=>e*t,1)*Math.max(1,e.metadata.size||1)>(r?n*1032+1024:n)}const kn=e=>!!e&&typeof e.slice==`function`;let An=null,Y=null;function jn(e){An=e,Y=null}const Mn=new WeakMap;function Nn(){!An||Y||(Y=An(),Y.catch(()=>{Y=null}))}function Pn(e){if(!An)return Promise.reject(Error(`HDF5 and MAT 7.3 files are read in the import worker, and this environment has no workers.`));Nn();let t=Mn.get(e);return t||(t=Y.then(t=>t(e)).then(e=>({root:e.root,close:()=>{}})),Mn.set(e,t),t.catch(()=>Mn.delete(e))),t}const Fn=new WeakMap;function In(e,t,n){let r=Fn.get(e);r||Fn.set(e,r=new Map);let i=r.get(t);return i||r.set(t,i=n??e.get(t)),i}function X(e){return e instanceof Float64Array?e:e instanceof BigInt64Array||e instanceof BigUint64Array?Float64Array.from(e,e=>Number(e)):ArrayBuffer.isView(e)?new Float64Array(e):Float64Array.from(e)}const Ln={s:1,sec:1,second:1,seconds:1,ms:.001,msec:.001,us:1e-6,µs:1e-6,ns:1e-9};function Rn(e,...t){for(let n of t){let t=e[n]?.value;if(typeof t==`string`)return t;if(Array.isArray(t)&&typeof t[0]==`string`)return t[0]}return``}function zn(e,...t){for(let n of t){let t=e[n]?.value,r=typeof t==`number`?t:ArrayBuffer.isView(t)?Number(t[0]):NaN;if(Number.isFinite(r))return r}return null}const Bn=new Set([1,2,3,4,5,6]),Vn=/^(time|t|timestamps?|.*[_ ]time|time[_ ].*)$/i,Hn=[`sampling_rate`,`sample_rate`,`samplerate`,`sampleRate`,`fs`,`Fs`,`rate`];function Un(e,t,n,r,i,a,o=0){i.set(n,t.attrs);for(let s of t.keys()){if(!a.count())return;let c=n===`/`?`/${s}`:`${n}/${s}`,l=t.get(s);if(Tn(l))o<16&&a.enter(l)&&Un(e,l,c,r,i,a,o+1);else if(kn(l)){let t=In(e,c,l);r.push({path:c,parent:n,name:s,ds:t,attrs:t.attrs})}}}const Wn=e=>e===`/`?`root`:e.slice(1),Gn=e=>Math.max(4096,Math.min(1<<20,Math.floor((8<<20)/(8*Math.max(1,e)))));async function Kn(e,t){let n=In(e,t.path);if(t.col===null)return X(n.slice([[0,1]]))[0]*t.factor;let r=n.slice([[0,1]]);return Number(r[0][t.col])*t.factor}const qn={...wn,async plan(e){let t=await Pn(e.main);try{let n=[],r=new Map,i=Dn();i.enter(t.root),Un(t.root,t.root,`/`,n,r,i);let a=[],o=i.note();o&&a.push(o);let s=new Map,c=[],l=0;for(let t of n){let n=t.ds.metadata.shape??[],r=t.ds.metadata.type,i=t.ds.metadata.chunks?t.ds.filters??[]:[],o=i.find(e=>!Bn.has(e.id)),u=!o;if(u&&i.length>0&&n.length>0&&n.every(e=>e>0))try{t.ds.slice(n.map(()=>[0,1]))}catch{u=!1}if(!u){a.push(`${t.path}: compressed with a filter Kymoscope cannot read${o?` (${o.name||o.id})`:``}; skipped.`);continue}if(On(t.ds,n,e.main.size,i.length>0)){a.push(`${t.path}: larger than the file can hold (never written, or damaged); skipped.`);continue}if(n.length===1&&n[0]>1&&(r===0||r===1||r===3)){let e=`${t.parent}|${n[0]}`,r=s.get(e)??{parent:t.parent,n:n[0],leaves:[]};r.leaves.push(t),s.set(e,r)}else if(n.length===2&&n[0]>1&&n[1]<=4096&&(r===0||r===1)){let e=zn(t.attrs,...Hn);c.push({name:Wn(t.path),kind:`matrix`,rows:n[0],rate:e,time:null,origin:0,cols:Array.from({length:n[1]},(e,n)=>({path:t.path,col:n,text:!1,factor:1}))})}else if(n.length===1&&r===6){let e=(t.ds.metadata.compound_type?.members??[]).flatMap((e,n)=>e.type===0||e.type===1?[{path:t.path,col:n,text:!1,factor:1,name:e.name}]:[]),r=e.find(e=>Vn.test(e.name));c.push({name:Wn(t.path),kind:`compound`,rows:n[0],rate:null,origin:0,time:r??null,cols:e.filter(e=>e!==r)})}else l++}for(let e of s.values()){let t=[...s.values()].filter(t=>t.parent===e.parent).length>1,n=e.leaves.find(e=>Rn(e.attrs,`CLASS`)===`DIMENSION_SCALE`)??e.leaves.find(e=>Vn.test(e.name)&&e.ds.metadata.type!==3),i=n?Ln[Rn(n.attrs,`units`,`unit`,`Units`)]??1:1,a=n?null:zn(r.get(e.parent)??{},...Hn);c.push({name:t?`${Wn(e.parent)} (${e.n} rows)`:Wn(e.parent),kind:`vectors`,rows:e.n,rate:a,origin:0,time:n?{path:n.path,col:null,text:!1,factor:i}:null,cols:e.leaves.filter(e=>e!==n).map(e=>({path:e.path,col:null,text:e.ds.metadata.type===3,factor:1}))})}l&&a.push(`${l} dataset${l===1?``:`s`} with other shapes or types (images, references, 3-D) skipped.`),c.sort((e,t)=>e.name.localeCompare(t.name));let u=c.map((e,t)=>e.time||e.rate?t:-1).filter(e=>e>=0),d=1/0;for(let e of c)e.time&&(d=Math.min(d,await Kn(t.root,e.time)));for(let e of c)e.origin=Number.isFinite(d)?d:0;let f=new Map(n.map(e=>[e.path,e]));for(let e of c)e.chunk=[...e.cols,...e.time?[e.time]:[]].reduce((e,t)=>Math.max(e,f.get(t.path).ds.metadata.chunks?.[0]??0),0);let p=e=>Rn(f.get(e.path).attrs,`units`,`unit`,`Units`,`UNITS`),m=(e,t)=>e.kind===`matrix`?`${e.name.split(`/`).pop()}[${t.col+1}]`:e.kind===`compound`?f.get(t.path).ds.metadata.compound_type.members[t.col].name:t.path.split(`/`).pop(),h=c.map(e=>({name:e.name,channels:e.cols.map(t=>({name:m(e,t),unit:e.kind===`vectors`?p(t):``,text:t.text})),samples:e.rows,time:e.time?{kind:`timestamps`}:e.rate?{kind:`rate`,rate:e.rate,start:0}:{kind:`index`},rateHz:e.rate}));if(h.length===0)throw Error(`This HDF5 file has no datasets Kymoscope can plot.`);let g=h.length>20||h.length>1&&u.length<h.length,_=g?u.length?u:[c.reduce((e,t,n)=>t.rows*t.cols.length>c[e].rows*c[e].cols.length?n:e,0)]:void 0;return g&&a.push(`Only the groups with a time base are read unless you choose others in the channel picker.`),{format:`HDF5`,startTime:null,groups:h,meta:{},events:[],notes:a,pick:g,defaultGroups:_,state:{groups:c}}}finally{t.close()}},async*stream(e){for(let t of e.selection)yield*Jn(e,t.group)},streamGroup:(e,t)=>Jn(e,t)};async function*Jn(e,t){let n=e.plan.state.groups[t],r=f(e,t).map(e=>n.cols[e]),i=await Pn(e.files.main);try{let a=n.chunk??0,o=a>0?Math.max(1,Math.min(Math.floor((1<<20)/a),Math.ceil(Gn(r.length+1)/a)))*a:Gn(r.length+1);for(let a=0;a<n.rows;a+=o){e.signal?.throwIfAborted();let s=Math.min(n.rows,a+o),c=s-a,l=null,u=e=>{let t=In(i.root,e.path);if(n.kind===`vectors`){let n=t.slice([[a,s]]);if(e.text)return Array.from(n,e=>e==null?null:String(e));let r=X(n);if(e.factor!==1)for(let t=0;t<c;t++)r[t]*=e.factor;return r}let r=new Float64Array(c);if(n.kind===`matrix`){let n=(t.shape??[0,1])[1],i=l??=t.slice([[a,s],[0,n]]);for(let t=0;t<c;t++)r[t]=Number(i[t*n+e.col])}else{let n=l??=t.slice([[a,s]]);for(let t=0;t<c;t++)r[t]=Number(n[t][e.col])*e.factor}return r},d=null;if(n.time){d=u(n.time);for(let e=0;e<c;e++)d[e]-=n.origin}yield{group:t,time:d,start:a,length:c,columns:r.map(u)}}}finally{i.close()}}const Yn={id:`mat`,label:`MATLAB MAT (v5, v7.3)`,extensions:[`.mat`],sniff:e=>d(e,`MATLAB 5.0 MAT-file`)||d(e,`MATLAB 7.3 MAT-file`)},Xn=/^(time|t|tout|timestamps?)$/i,Zn=/^(fs|sample_?rate|sampling_?rate|rate|samplerate)$/i,Qn=e=>e.slice(e.lastIndexOf(`.`)+1),$n=e=>e.includes(`.`)?e.slice(0,e.lastIndexOf(`.`)):``;function er(e,t){let n=/^(.*)\.values(\[\d+\])?$/.exec(e.name),r=n&&(t.get(`${n[1]}.label`)||t.get(`${n[1]}.blockName`));return r?{...e,name:`${r}${n[2]??``}`}:e}function tr(e,t,n){let r=new Map;for(let t of e){if(!(t.length>1))continue;let e=r.get(t.length);e?e.push(t):r.set(t.length,[t])}let i=[...n].filter(([e])=>Zn.test(Qn(e))),a=i.length===1?i[0][1]:null,o=[];for(let[e,n]of r){let r=n.find(e=>Xn.test(Qn(e.name))||/(_time|\.Time)$/.test(e.name))??null;o.push({name:r?$n(r.name)||r.name:`${e} samples`,channels:n.filter(e=>e!==r).map(e=>er(e,t)),time:r,rate:r?null:a,origin:0})}return o}function nr(e){return e.map(e=>({name:e.name,channels:e.channels.map(e=>({name:e.name,unit:``})),samples:e.channels[0]?.length??e.time?.length??0,time:e.time?{kind:`timestamps`}:e.rate?{kind:`rate`,rate:e.rate,start:0}:{kind:`index`},rateHz:e.rate}))}async function rr(e){let t=1/0;for(let n of e)n.time&&(t=Math.min(t,(await n.time.read(0,1))[0]));for(let n of e)n.origin=Number.isFinite(t)?t:0}var ir=class{#e;size;constructor(e){this.#e=e,this.size=e.size}read(e,t){return t>=65536?this.#e.slice(e,t):this.#e.read(e,t)}release(){}},ar=class{#e;#t;#n;#r=null;keep=!0;size;constructor(e,t,n,r){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.size=r.length}async read(e,t){return this.#r??=await W(await this.#e.slice(this.#t,this.#n),this.size,this.size),this.#r.subarray(e,e+t)}release(){this.keep||(this.#r=null)}};const Z={1:1,2:1,3:2,4:2,5:4,6:4,7:4,9:8,12:8,13:8};function or(e,t,n,i,a=1){let o=r(t),s=i.length,c=Z[e]*a;if(e===9&&a===1&&n){i.set(t.byteOffset%8==0?new Float64Array(t.buffer,t.byteOffset,s):new Float64Array(t.slice(0,s*8).buffer));return}switch(e){case 1:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt8(t);return;case 2:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint8(t);return;case 3:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt16(t,n);return;case 4:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint16(t,n);return;case 5:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt32(t,n);return;case 6:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint32(t,n);return;case 7:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getFloat32(t,n);return;case 9:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getFloat64(t,n);return;case 12:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt32(t+(n?4:0),n)*4294967296+o.getUint32(t+(n?0:4),n);return;case 13:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint32(t+(n?4:0),n)*4294967296+o.getUint32(t+(n?0:4),n);return;default:i.fill(NaN)}}async function Q(e,t,n){let i=r(await e.read(t,8)),a=i.getUint32(0,n);if(a>>>16)return{type:a&65535,bytes:a>>>16,data:t+4,next:t+8};let o=i.getUint32(4,n);return{type:a,bytes:o,data:t+8,next:a===15?t+8+o:t+8+o+(8-o%8)%8}}function sr(e,t,n,r,i){let[a,o]=t,s=Z[r.type];if(!s)return[];let c=(e,t)=>async(a,o)=>{let c=new Float64Array(o-a);return t===1?or(r.type,await n.read(r.data+(e+a)*s,(o-a)*s),i,c):or(r.type,await n.read(r.data+(e+a*t)*s,((o-a-1)*t+1)*s),i,c,t),c};return a===1||o===1?[{name:e,length:a*o,read:c(0,1)}]:a>=o?Array.from({length:o},(t,n)=>({name:`${e}[${n+1}]`,length:a,read:c(n*a,1)})):Array.from({length:a},(t,n)=>({name:`${e}[${n+1}]`,length:o,read:c(n,a)}))}async function cr(e,t,n,i,a,o,s){let d=t,f=await Q(e,d,n),p=r(await e.read(f.data,8)).getUint32(0,n),m=p&255;d=f.next;let h=await Q(e,d,n);if(h.bytes>128){o.notes.push(`A MAT variable with more than 32 dimensions was skipped (damaged).`);return}let g=r(await e.read(h.data,h.bytes)),_=Array.from({length:h.bytes/4},(e,t)=>g.getInt32(4*t,n));d=h.next;let v=await Q(e,d,n),y=l(await e.read(v.data,v.bytes));d=v.next;let b=a??y,x=i?`${i}.${b}`:b,S=_.reduce((e,t)=>e*t,1);if(m>=6&&m<=15){if(S===0)return;let t=await Q(e,d,n);if(p&2048&&o.notes.push(`${x}: the imaginary part was skipped.`),_.length>2){o.notes.push(`${x}: arrays with more than two dimensions are skipped.`);return}if(!Z[t.type])return;if(!(S>0)||S*Z[t.type]>t.bytes||t.data+t.bytes>e.size){o.notes.push(`${x}: its data is shorter than its dimensions (damaged); skipped.`);return}if(S===1){let r=new Float64Array(1);or(t.type,await e.read(t.data,Z[t.type]??8),n,r),o.scalars.set(x,r[0]);return}o.channels.push(...sr(x,_,e,t,n));return}if(m===4){let t=await Q(e,d,n);if(t.bytes>lr)return;let r=await e.read(t.data,t.bytes),i=t.type===3||t.type===4||t.type===17?new TextDecoder(n?`utf-16le`:`utf-16be`).decode(r.subarray(0,r.length&-2)):u(r);_[0]<=1&&o.strings.set(x,i);return}if(m===2){let t=await Q(e,d,n),i=r(await e.read(t.data,4)).getInt32(0,n);d=t.next;let a=await Q(e,d,n);if(!(i>0))return;let l=await e.read(a.data,a.bytes),u=Array.from({length:Math.floor(l.length/i)},(e,t)=>c(l.subarray(t*i,(t+1)*i)));if(d=a.next,u.length===0||S*u.length*8>e.size-d){S>0&&u.length>0&&o.notes.push(`${x}: its fields are longer than the file (damaged); skipped.`);return}for(let t=0;t<S;t++){let r=S>1?`${x}(${t+1})`:x;for(let t of u){let i=await Q(e,d,n);i.type===14&&i.bytes>0&&s<16&&await cr(e,i.data,n,r,t,o,s+1),d=i.next}}return}m===1?o.notes.push(`${x}: cell arrays are skipped.`):m===5?o.notes.push(`${x}: sparse arrays are skipped.`):o.notes.includes(ur)||o.notes.push(ur)}const lr=1<<17,ur=`MATLAB objects (timeseries, SimulationOutput) were skipped: save them as 'Structure with time' or as structs.`;async function dr(e){let t=l((await e.read(0,128)).subarray(126,128))===`IM`,n={channels:[],strings:new Map,scalars:new Map,notes:[],sources:[]},i=new ir(e),a=0;for(let o=128;o+8<=e.size;){let s=await Q(i,o,t);if(s.type===15){if(s.bytes>1<<30)throw Error(`A compressed variable in this MAT file is over 1 GB; save it with -v7.3 to open it here.`);let i=await e.slice(s.data,s.bytes),o=await W(i,-1,8),c=o.length<8?0:8+r(o).getUint32(4,t);if(c>C(s.bytes))throw Error(`A compressed variable in this MAT file is damaged.`);if(c>1<<30)throw Error(`A compressed variable in this MAT file is over 1 GB; save it with -v7.3 to open it here.`);let l=await W(i,c,c),u=new ar(e,s.data,s.bytes,l);n.sources.push(u),a+=l.length;let d=await Q(u,0,t);if(d.type===14&&await cr(u,d.data,t,``,null,n,0),a>536870912)for(let e of n.sources)e.keep=!1,e.release()}else s.type===14&&await cr(i,s.data,t,``,null,n,0);o=s.next}return n}const fr=new Set([`double`,`single`,`int8`,`uint8`,`int16`,`uint16`,`int32`,`uint32`,`int64`,`uint64`,`logical`]);function pr(e,t){let n={channels:[],strings:new Map,scalars:new Map,notes:[]},r=Dn();r.enter(e);let i=t=>In(e,t),a=(e,t,n)=>{let r=null;return(a,o)=>((r?.s!==a||r.e!==o)&&(r={s:a,e:o,v:X(t?i(e).slice([[0,n],[a,o]]):i(e).slice([[a,o],[0,n]]))}),r.v)},o=(e,s,c,l)=>{for(let u of e.keys()){if(!r.count())return;if(u.startsWith(`#`))continue;let d=e.get(u);if(!d)continue;let f=`${s}/${u}`,p=c?`${c}.${u}`:u,m=d.attrs,h=Rn(m,`MATLAB_class`);if(m.MATLAB_empty)continue;if(Tn(d)){h===`struct`&&l<16&&r.enter(d)&&o(d,f,p,l+1);continue}if(!kn(d))continue;let g=d.shape??[];if(h===`char`){if(g.reduce((e,t)=>e*t,1)>65536)continue;let e=X(d.slice(g.map(e=>[0,e])));n.strings.set(p,new TextDecoder(`utf-16le`).decode(Uint16Array.from(e)))}else if(fr.has(h)&&g.length===2&&On(d,g,t,!!d.metadata.chunks))n.notes.push(`${p}: larger than the file can hold (never written, or damaged); skipped.`);else if(fr.has(h)&&g.length===2){let[e,t]=g;if(e*t===1){n.scalars.set(p,X(i(f).slice([[0,1],[0,1]]))[0]);continue}if(e===1||t===1){let r=e*t;n.channels.push({name:p,length:r,read:async(t,n)=>X(e===1?i(f).slice([[0,1],[t,n]]):i(f).slice([[t,n],[0,1]]))})}else if(t>=e){let r=a(f,!0,e);for(let i=0;i<e;i++)n.channels.push({name:`${p}[${i+1}]`,length:t,read:async(e,t)=>r(e,t).slice(i*(t-e),(i+1)*(t-e))})}else{let r=a(f,!1,t);for(let i=0;i<t;i++)n.channels.push({name:`${p}[${i+1}]`,length:e,read:async(e,n)=>{let a=r(e,n),o=new Float64Array(n-e);for(let e=0;e<o.length;e++)o[e]=a[e*t+i];return o}})}}else h===`cell`?n.notes.push(`${p}: cell arrays are skipped.`):h&&n.notes.push(`${p}: MATLAB class ${h} is skipped.`)}};o(e,``,``,0);let s=r.note();return s&&n.notes.push(s),n}const mr=e=>Math.max(4096,Math.min(1<<18,Math.floor((16<<20)/(8*Math.max(1,e))))),hr={...Yn,async plan(e,t){let n=d(await t.read(0,20),`MATLAB 7.3`),r,i=[];if(n)r=pr((await Pn(e.main)).root,e.main.size);else{let e=await dr(t);i=e.sources,r=e}let a=tr(r.channels,r.strings,r.scalars).filter(e=>e.channels.length>0);await rr(a);let o=nr(a);if(o.length===0)throw Error(`This MAT file has no numeric vectors or matrices to plot.`);let s=o.flatMap((e,t)=>e.time.kind===`index`?[]:[t]),c=o.length>1&&s.length<o.length,l=Object.fromEntries(r.strings);for(let[e,t]of r.scalars)l[e]=String(t);return{format:n?`MAT 7.3`:`MAT 5`,startTime:null,groups:o,meta:l,events:[],notes:r.notes,pick:c,defaultGroups:c&&s.length?s:void 0,state:{groups:a,sources:i}}},async*stream(e){for(let t of e.selection)yield*gr(e,t.group)},streamGroup:(e,t)=>gr(e,t)};async function*gr(e,t){let n=e.plan.state,r=n.groups[t],i=f(e,t).map(e=>r.channels[e]),a=r.channels[0].length,o=mr(i.length+1);try{for(let n=0;n<a;n+=o){e.signal?.throwIfAborted();let s=Math.min(a,n+o),c=null;if(r.time){c=await r.time.read(n,s);for(let e=0;e<c.length;e++)c[e]-=r.origin}let l=[];for(let e of i)l.push(await e.read(n,s));yield{group:t,time:c,start:n,length:s-n,columns:l}}}finally{for(let e of n.sources)e.release()}}const _r={id:`comtrade`,label:`COMTRADE (IEEE C37.111)`,extensions:[`.cfg`,`.cff`],companions:[{ext:`.dat`}],sniff:e=>{let t=l(e.subarray(0,512));if(/^---\s*file type:\s*CFG/i.test(t))return!0;let n=t.split(/\r?\n/);return n.length>2&&/^\s*\d+\s*,\s*\d+A\s*,\s*\d+D\s*$/i.test(n[1])}};function vr(e,t){let n=/^\s*(\d{1,2})\/(\d{1,2})\/(\d{2,4})\s*,\s*(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))?/.exec(e??``);if(!n)return[null,0,!1];let[r,i]=t===1991?[n[2],n[1]]:[n[1],n[2]],a=n[3].length===2?2e3+Number(n[3]):Number(n[3]),o=Number(`${n[6]}.${n[7]??`0`}`);return[`${a}-${i.padStart(2,`0`)}-${r.padStart(2,`0`)}T${n[4].padStart(2,`0`)}:${n[5]}:${o.toFixed(3).padStart(6,`0`)}`,Date.UTC(a,Number(i)-1,Number(r),Number(n[4]),Number(n[5]))/1e3+o,(n[7]??``).length>6]}function yr(e){let t=e.split(/\r?\n/).map(e=>e.trim()),[n,,r]=t[0].split(`,`),i=Number(r)||1991,a=/(\d+)A\s*,\s*(\d+)D/i.exec(t[1]??``);if(!a)throw Error(`This COMTRADE .cfg is damaged (second line).`);let o=Number(a[1]),s=Number(a[2]);if(o+s>t.length)throw Error(`This COMTRADE .cfg is damaged (more channels than lines).`);let c=2,l=[];for(let e=0;e<o;e++,c++){let e=(t[c]??``).split(`,`);l.push({name:(e[1]??``).trim(),unit:(e[4]??``).trim(),a:Number(e[5]),b:Number(e[6]??0)||0})}let u=[];for(let e=0;e<s;e++,c++)u.push(((t[c]??``).split(`,`)[1]??``).trim());c++;let d=Number(t[c++]);if(!(Number.isInteger(d)&&d>=0&&d<=t.length-c))throw Error(`This COMTRADE .cfg is damaged (sample rates).`);let f=[];for(let e=0;e<Math.max(1,d);e++,c++){let[e,n]=(t[c]??``).split(`,`).map(Number);f.push([d===0?0:e,n])}let[p,m,h]=vr(t[c++],i),[g,_,v]=vr(t[c++],i),y=(t[c++]||`ASCII`).toUpperCase(),b=Number(t[c++])||1;return{station:n.trim(),rev:i,analog:l,digital:u,rates:f,start:p,trigger:g,startSec:m,triggerSec:_,ft:y,timemult:b,timebase:h||v?1e-9:1e-6}}const br={BINARY:2,BINARY32:4,FLOAT32:4};async function xr(e){let t=l(await e.read(0,Math.min(e.size,1<<20))),n=t.search(/---\s*file type:\s*CFG\s*---\r?\n/i),r=/---\s*file type:\s*DAT\s+(ASCII|BINARY32|BINARY|FLOAT32)(?:\s*:\s*(\d+))?\s*---\r?\n/i.exec(t);if(n<0||!r)throw Error(`This COMTRADE .cff is damaged (no CFG or DAT section in its first megabyte).`);let i=t.indexOf(`
|
|
4
|
-
`,n)+1,a=t.slice(i).search(/---\s*file type:\s*(INF|HDR|DAT)/i),o=t.slice(i,a<0?void 0:i+a),s=r.index+r[0].length;return{cfg:o,offset:s,length:r[2]?Number(r[2]):e.size-s}}function
|
|
3
|
+
`,t))},Tn=e=>!!e&&typeof e.keys==`function`,En=1e5;function Dn(){let e=new Set,t=0,n=!1;return{enter(t){let r=null;try{r=t.create_reference?Array.prototype.join.call(t.create_reference().ref_data,`,`):null}catch{r=null}return r===null?!0:e.has(r)?(n=!0,!1):(e.add(r),!0)},count:()=>++t<=En,note:()=>t>1e5?`This file has more than ${En.toLocaleString(`en-US`)} objects (or links that repeat its groups); only the first were read.`:n?`Some groups of this file link back to a group already read; each was read once.`:null}}function On(e,t,n,r){return t.reduce((e,t)=>e*t,1)*Math.max(1,e.metadata.size||1)>(r?n*1032+1024:n)}const kn=e=>!!e&&typeof e.slice==`function`;let An=null,Y=null;function jn(e){An=e,Y=null}const Mn=new WeakMap;function Nn(){!An||Y||(Y=An(),Y.catch(()=>{Y=null}))}function Pn(e){if(!An)return Promise.reject(Error(`HDF5 and MAT 7.3 files are read in the import worker, and this environment has no workers.`));Nn();let t=Mn.get(e);return t||(t=Y.then(t=>t(e)).then(e=>({root:e.root,close:()=>{}})),Mn.set(e,t),t.catch(()=>Mn.delete(e))),t}const Fn=new WeakMap;function In(e,t,n){let r=Fn.get(e);r||Fn.set(e,r=new Map);let i=r.get(t);return i||r.set(t,i=n??e.get(t)),i}function X(e){return e instanceof Float64Array?e:e instanceof BigInt64Array||e instanceof BigUint64Array?Float64Array.from(e,e=>Number(e)):ArrayBuffer.isView(e)?new Float64Array(e):Float64Array.from(e)}const Ln={s:1,sec:1,second:1,seconds:1,ms:.001,msec:.001,us:1e-6,µs:1e-6,ns:1e-9};function Rn(e,...t){for(let n of t){let t=e[n]?.value;if(typeof t==`string`)return t;if(Array.isArray(t)&&typeof t[0]==`string`)return t[0]}return``}function zn(e,...t){for(let n of t){let t=e[n]?.value,r=typeof t==`number`?t:ArrayBuffer.isView(t)?Number(t[0]):NaN;if(Number.isFinite(r))return r}return null}const Bn=new Set([1,2,3,4,5,6]),Vn=/^(time|t|timestamps?|.*[_ ]time|time[_ ].*)$/i,Hn=[`sampling_rate`,`sample_rate`,`samplerate`,`sampleRate`,`fs`,`Fs`,`rate`];function Un(e,t,n,r,i,a,o=0){i.set(n,t.attrs);for(let s of t.keys()){if(!a.count())return;let c=n===`/`?`/${s}`:`${n}/${s}`,l=t.get(s);if(Tn(l))o<16&&a.enter(l)&&Un(e,l,c,r,i,a,o+1);else if(kn(l)){let t=In(e,c,l);r.push({path:c,parent:n,name:s,ds:t,attrs:t.attrs})}}}const Wn=e=>e===`/`?`root`:e.slice(1),Gn=e=>Math.max(4096,Math.min(1<<20,Math.floor((8<<20)/(8*Math.max(1,e)))));async function Kn(e,t){let n=In(e,t.path);if(t.col===null)return X(n.slice([[0,1]]))[0]*t.factor;let r=n.slice([[0,1]]);return Number(r[0][t.col])*t.factor}const qn={...wn,async plan(e){let t=await Pn(e.main);try{let n=[],r=new Map,i=Dn();i.enter(t.root),Un(t.root,t.root,`/`,n,r,i);let a=[],o=i.note();o&&a.push(o);let s=new Map,c=[],l=0;for(let t of n){let n=t.ds.metadata.shape??[],r=t.ds.metadata.type,i=t.ds.metadata.chunks?t.ds.filters??[]:[],o=i.find(e=>!Bn.has(e.id)),u=!o;if(u&&i.length>0&&n.length>0&&n.every(e=>e>0))try{t.ds.slice(n.map(()=>[0,1]))}catch{u=!1}if(!u){a.push(`${t.path}: compressed with a filter Kymoscope cannot read${o?` (${o.name||o.id})`:``}; skipped.`);continue}if(On(t.ds,n,e.main.size,i.length>0)){a.push(`${t.path}: larger than the file can hold (never written, or damaged); skipped.`);continue}if(n.length===1&&n[0]>1&&(r===0||r===1||r===3)){let e=`${t.parent}|${n[0]}`,r=s.get(e)??{parent:t.parent,n:n[0],leaves:[]};r.leaves.push(t),s.set(e,r)}else if(n.length===2&&n[0]>1&&n[1]<=4096&&(r===0||r===1)){let e=zn(t.attrs,...Hn);c.push({name:Wn(t.path),kind:`matrix`,rows:n[0],rate:e,time:null,origin:0,cols:Array.from({length:n[1]},(e,n)=>({path:t.path,col:n,text:!1,factor:1}))})}else if(n.length===1&&r===6){let e=(t.ds.metadata.compound_type?.members??[]).flatMap((e,n)=>e.type===0||e.type===1?[{path:t.path,col:n,text:!1,factor:1,name:e.name}]:[]),r=e.find(e=>Vn.test(e.name));c.push({name:Wn(t.path),kind:`compound`,rows:n[0],rate:null,origin:0,time:r??null,cols:e.filter(e=>e!==r)})}else l++}for(let e of s.values()){let t=[...s.values()].filter(t=>t.parent===e.parent).length>1,n=e.leaves.find(e=>Rn(e.attrs,`CLASS`)===`DIMENSION_SCALE`)??e.leaves.find(e=>Vn.test(e.name)&&e.ds.metadata.type!==3),i=n?Ln[Rn(n.attrs,`units`,`unit`,`Units`)]??1:1,a=n?null:zn(r.get(e.parent)??{},...Hn);c.push({name:t?`${Wn(e.parent)} (${e.n} rows)`:Wn(e.parent),kind:`vectors`,rows:e.n,rate:a,origin:0,time:n?{path:n.path,col:null,text:!1,factor:i}:null,cols:e.leaves.filter(e=>e!==n).map(e=>({path:e.path,col:null,text:e.ds.metadata.type===3,factor:1}))})}l&&a.push(`${l} dataset${l===1?``:`s`} with other shapes or types (images, references, 3-D) skipped.`),c.sort((e,t)=>e.name.localeCompare(t.name));let u=c.map((e,t)=>e.time||e.rate?t:-1).filter(e=>e>=0),d=1/0;for(let e of c)e.time&&(d=Math.min(d,await Kn(t.root,e.time)));for(let e of c)e.origin=Number.isFinite(d)?d:0;let f=new Map(n.map(e=>[e.path,e]));for(let e of c)e.chunk=[...e.cols,...e.time?[e.time]:[]].reduce((e,t)=>Math.max(e,f.get(t.path).ds.metadata.chunks?.[0]??0),0);let p=e=>Rn(f.get(e.path).attrs,`units`,`unit`,`Units`,`UNITS`),m=(e,t)=>e.kind===`matrix`?`${e.name.split(`/`).pop()}[${t.col+1}]`:e.kind===`compound`?f.get(t.path).ds.metadata.compound_type.members[t.col].name:t.path.split(`/`).pop(),h=c.map(e=>({name:e.name,channels:e.cols.map(t=>({name:m(e,t),unit:e.kind===`vectors`?p(t):``,text:t.text})),samples:e.rows,time:e.time?{kind:`timestamps`}:e.rate?{kind:`rate`,rate:e.rate,start:0}:{kind:`index`},rateHz:e.rate}));if(h.length===0)throw Error(`This HDF5 file has no datasets Kymoscope can plot.`);let g=h.length>20||h.length>1&&u.length<h.length,_=g?u.length?u:[c.reduce((e,t,n)=>t.rows*t.cols.length>c[e].rows*c[e].cols.length?n:e,0)]:void 0;return g&&a.push(`Only the groups with a time base are read unless you choose others in the channel picker.`),{format:`HDF5`,startTime:null,groups:h,meta:{},events:[],notes:a,pick:g,defaultGroups:_,state:{groups:c}}}finally{t.close()}},async*stream(e){for(let t of e.selection)yield*Jn(e,t.group)},streamGroup:(e,t)=>Jn(e,t)};async function*Jn(e,t){let n=e.plan.state.groups[t],r=f(e,t).map(e=>n.cols[e]),i=await Pn(e.files.main);try{let a=n.chunk??0,o=a>0?Math.max(1,Math.min(Math.floor((1<<20)/a),Math.ceil(Gn(r.length+1)/a)))*a:Gn(r.length+1);for(let a=0;a<n.rows;a+=o){e.signal?.throwIfAborted();let s=Math.min(n.rows,a+o),c=s-a,l=null,u=e=>{let t=In(i.root,e.path);if(n.kind===`vectors`){let n=t.slice([[a,s]]);if(e.text)return Array.from(n,e=>e==null?null:String(e));let r=X(n);if(e.factor!==1)for(let t=0;t<c;t++)r[t]*=e.factor;return r}let r=new Float64Array(c);if(n.kind===`matrix`){let n=(t.shape??[0,1])[1],i=l??=t.slice([[a,s],[0,n]]);for(let t=0;t<c;t++)r[t]=Number(i[t*n+e.col])}else{let n=l??=t.slice([[a,s]]);for(let t=0;t<c;t++)r[t]=Number(n[t][e.col])*e.factor}return r},d=null;if(n.time){d=u(n.time);for(let e=0;e<c;e++)d[e]-=n.origin}yield{group:t,time:d,start:a,length:c,columns:r.map(u)}}}finally{i.close()}}const Yn={id:`mat`,label:`MATLAB MAT (v5, v7.3)`,extensions:[`.mat`],sniff:e=>d(e,`MATLAB 5.0 MAT-file`)||d(e,`MATLAB 7.3 MAT-file`)},Xn=/^(time|t|tout|timestamps?)$/i,Zn=/^(fs|sample_?rate|sampling_?rate|rate|samplerate)$/i,Qn=e=>e.slice(e.lastIndexOf(`.`)+1),$n=e=>e.includes(`.`)?e.slice(0,e.lastIndexOf(`.`)):``;function er(e,t){let n=/^(.*)\.values(\[\d+\])?$/.exec(e.name),r=n&&(t.get(`${n[1]}.label`)||t.get(`${n[1]}.blockName`));return r?{...e,name:`${r}${n[2]??``}`}:e}function tr(e,t,n){let r=new Map;for(let t of e){if(!(t.length>1))continue;let e=r.get(t.length);e?e.push(t):r.set(t.length,[t])}let i=[...n].filter(([e])=>Zn.test(Qn(e))),a=i.length===1?i[0][1]:null,o=[];for(let[e,n]of r){let r=n.find(e=>Xn.test(Qn(e.name))||/(_time|\.Time)$/.test(e.name))??null;o.push({name:r?$n(r.name)||r.name:`${e} samples`,channels:n.filter(e=>e!==r).map(e=>er(e,t)),time:r,rate:r?null:a,origin:0})}return o}function nr(e){return e.map(e=>({name:e.name,channels:e.channels.map(e=>({name:e.name,unit:``})),samples:e.channels[0]?.length??e.time?.length??0,time:e.time?{kind:`timestamps`}:e.rate?{kind:`rate`,rate:e.rate,start:0}:{kind:`index`},rateHz:e.rate}))}async function rr(e){let t=1/0;for(let n of e)n.time&&(t=Math.min(t,(await n.time.read(0,1))[0]));for(let n of e)n.origin=Number.isFinite(t)?t:0}var ir=class{#e;size;constructor(e){this.#e=e,this.size=e.size}read(e,t){return t>=65536?this.#e.slice(e,t):this.#e.read(e,t)}release(){}},ar=class{#e;#t;#n;#r=null;keep=!0;size;constructor(e,t,n,r){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.size=r.length}async read(e,t){return this.#r??=await W(await this.#e.slice(this.#t,this.#n),this.size,this.size),this.#r.subarray(e,e+t)}release(){this.keep||(this.#r=null)}};const or={1:1,2:1,3:2,4:2,5:4,6:4,7:4,9:8,12:8,13:8};function sr(e,t,n,i,a=1){let o=r(t),s=i.length,c=or[e]*a;if(e===9&&a===1&&n){i.set(t.byteOffset%8==0?new Float64Array(t.buffer,t.byteOffset,s):new Float64Array(t.slice(0,s*8).buffer));return}switch(e){case 1:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt8(t);return;case 2:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint8(t);return;case 3:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt16(t,n);return;case 4:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint16(t,n);return;case 5:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt32(t,n);return;case 6:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint32(t,n);return;case 7:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getFloat32(t,n);return;case 9:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getFloat64(t,n);return;case 12:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getInt32(t+(n?4:0),n)*4294967296+o.getUint32(t+(n?0:4),n);return;case 13:for(let e=0,t=0;e<s;e++,t+=c)i[e]=o.getUint32(t+(n?4:0),n)*4294967296+o.getUint32(t+(n?0:4),n);return;default:i.fill(NaN)}}async function Z(e,t,n){let i=r(await e.read(t,8)),a=i.getUint32(0,n);if(a>>>16)return{type:a&65535,bytes:a>>>16,data:t+4,next:t+8};let o=i.getUint32(4,n);return{type:a,bytes:o,data:t+8,next:a===15?t+8+o:t+8+o+(8-o%8)%8}}function cr(e,t,n,r,i){let[a,o]=t,s=or[r.type];if(!s)return[];let c=(e,t)=>async(a,o)=>{let c=new Float64Array(o-a);return t===1?sr(r.type,await n.read(r.data+(e+a)*s,(o-a)*s),i,c):sr(r.type,await n.read(r.data+(e+a*t)*s,((o-a-1)*t+1)*s),i,c,t),c};return a===1||o===1?[{name:e,length:a*o,read:c(0,1)}]:a>=o?Array.from({length:o},(t,n)=>({name:`${e}[${n+1}]`,length:a,read:c(n*a,1)})):Array.from({length:a},(t,n)=>({name:`${e}[${n+1}]`,length:o,read:c(n,a)}))}async function lr(e,t,n,i,a,o,s){let d=t,f=await Z(e,d,n),p=r(await e.read(f.data,8)).getUint32(0,n),m=p&255;d=f.next;let h=await Z(e,d,n);if(h.bytes>128){o.notes.push(`A MAT variable with more than 32 dimensions was skipped (damaged).`);return}let g=r(await e.read(h.data,h.bytes)),_=Array.from({length:h.bytes/4},(e,t)=>g.getInt32(4*t,n));d=h.next;let v=await Z(e,d,n),y=l(await e.read(v.data,v.bytes));d=v.next;let b=a??y,x=i?`${i}.${b}`:b,S=_.reduce((e,t)=>e*t,1);if(m>=6&&m<=15){if(S===0)return;let t=await Z(e,d,n);if(p&2048&&o.notes.push(`${x}: the imaginary part was skipped.`),_.length>2){o.notes.push(`${x}: arrays with more than two dimensions are skipped.`);return}if(!or[t.type])return;if(!(S>0)||S*or[t.type]>t.bytes||t.data+t.bytes>e.size){o.notes.push(`${x}: its data is shorter than its dimensions (damaged); skipped.`);return}if(S===1){let r=new Float64Array(1);sr(t.type,await e.read(t.data,or[t.type]??8),n,r),o.scalars.set(x,r[0]);return}o.channels.push(...cr(x,_,e,t,n));return}if(m===4){let t=await Z(e,d,n);if(t.bytes>ur)return;let r=await e.read(t.data,t.bytes),i=t.type===3||t.type===4||t.type===17?new TextDecoder(n?`utf-16le`:`utf-16be`).decode(r.subarray(0,r.length&-2)):u(r);_[0]<=1&&o.strings.set(x,i);return}if(m===2){let t=await Z(e,d,n),i=r(await e.read(t.data,4)).getInt32(0,n);d=t.next;let a=await Z(e,d,n);if(!(i>0))return;let l=await e.read(a.data,a.bytes),u=Array.from({length:Math.floor(l.length/i)},(e,t)=>c(l.subarray(t*i,(t+1)*i)));if(d=a.next,u.length===0||S*u.length*8>e.size-d){S>0&&u.length>0&&o.notes.push(`${x}: its fields are longer than the file (damaged); skipped.`);return}for(let t=0;t<S;t++){let r=S>1?`${x}(${t+1})`:x;for(let t of u){let i=await Z(e,d,n);i.type===14&&i.bytes>0&&s<16&&await lr(e,i.data,n,r,t,o,s+1),d=i.next}}return}m===1?o.notes.push(`${x}: cell arrays are skipped.`):m===5?o.notes.push(`${x}: sparse arrays are skipped.`):o.notes.includes(dr)||o.notes.push(dr)}const ur=1<<17,dr=`MATLAB objects (timeseries, SimulationOutput) were skipped: save them as 'Structure with time' or as structs.`;async function fr(e){let t=l((await e.read(0,128)).subarray(126,128))===`IM`,n={channels:[],strings:new Map,scalars:new Map,notes:[],sources:[]},i=new ir(e),a=0;for(let o=128;o+8<=e.size;){let s=await Z(i,o,t);if(s.type===15){if(s.bytes>1<<30)throw Error(`A compressed variable in this MAT file is over 1 GB; save it with -v7.3 to open it here.`);let i=await e.slice(s.data,s.bytes),o=await W(i,-1,8),c=o.length<8?0:8+r(o).getUint32(4,t);if(c>C(s.bytes))throw Error(`A compressed variable in this MAT file is damaged.`);if(c>1<<30)throw Error(`A compressed variable in this MAT file is over 1 GB; save it with -v7.3 to open it here.`);let l=await W(i,c,c),u=new ar(e,s.data,s.bytes,l);n.sources.push(u),a+=l.length;let d=await Z(u,0,t);if(d.type===14&&await lr(u,d.data,t,``,null,n,0),a>536870912)for(let e of n.sources)e.keep=!1,e.release()}else s.type===14&&await lr(i,s.data,t,``,null,n,0);o=s.next}return n}const pr=new Set([`double`,`single`,`int8`,`uint8`,`int16`,`uint16`,`int32`,`uint32`,`int64`,`uint64`,`logical`]);function mr(e,t){let n={channels:[],strings:new Map,scalars:new Map,notes:[]},r=Dn();r.enter(e);let i=t=>In(e,t),a=(e,t,n)=>{let r=null;return(a,o)=>((r?.s!==a||r.e!==o)&&(r={s:a,e:o,v:X(t?i(e).slice([[0,n],[a,o]]):i(e).slice([[a,o],[0,n]]))}),r.v)},o=(e,s,c,l)=>{for(let u of e.keys()){if(!r.count())return;if(u.startsWith(`#`))continue;let d=e.get(u);if(!d)continue;let f=`${s}/${u}`,p=c?`${c}.${u}`:u,m=d.attrs,h=Rn(m,`MATLAB_class`);if(m.MATLAB_empty)continue;if(Tn(d)){h===`struct`&&l<16&&r.enter(d)&&o(d,f,p,l+1);continue}if(!kn(d))continue;let g=d.shape??[];if(h===`char`){if(g.reduce((e,t)=>e*t,1)>65536)continue;let e=X(d.slice(g.map(e=>[0,e])));n.strings.set(p,new TextDecoder(`utf-16le`).decode(Uint16Array.from(e)))}else if(pr.has(h)&&g.length===2&&On(d,g,t,!!d.metadata.chunks))n.notes.push(`${p}: larger than the file can hold (never written, or damaged); skipped.`);else if(pr.has(h)&&g.length===2){let[e,t]=g;if(e*t===1){n.scalars.set(p,X(i(f).slice([[0,1],[0,1]]))[0]);continue}if(e===1||t===1){let r=e*t;n.channels.push({name:p,length:r,read:async(t,n)=>X(e===1?i(f).slice([[0,1],[t,n]]):i(f).slice([[t,n],[0,1]]))})}else if(t>=e){let r=a(f,!0,e);for(let i=0;i<e;i++)n.channels.push({name:`${p}[${i+1}]`,length:t,read:async(e,t)=>r(e,t).slice(i*(t-e),(i+1)*(t-e))})}else{let r=a(f,!1,t);for(let i=0;i<t;i++)n.channels.push({name:`${p}[${i+1}]`,length:e,read:async(e,n)=>{let a=r(e,n),o=new Float64Array(n-e);for(let e=0;e<o.length;e++)o[e]=a[e*t+i];return o}})}}else h===`cell`?n.notes.push(`${p}: cell arrays are skipped.`):h&&n.notes.push(`${p}: MATLAB class ${h} is skipped.`)}};o(e,``,``,0);let s=r.note();return s&&n.notes.push(s),n}const hr=e=>Math.max(4096,Math.min(1<<18,Math.floor((16<<20)/(8*Math.max(1,e))))),gr={...Yn,async plan(e,t){let n=d(await t.read(0,20),`MATLAB 7.3`),r,i=[];if(n)r=mr((await Pn(e.main)).root,e.main.size);else{let e=await fr(t);i=e.sources,r=e}let a=tr(r.channels,r.strings,r.scalars).filter(e=>e.channels.length>0);await rr(a);let o=nr(a);if(o.length===0)throw Error(`This MAT file has no numeric vectors or matrices to plot.`);let s=o.flatMap((e,t)=>e.time.kind===`index`?[]:[t]),c=o.length>1&&s.length<o.length,l=Object.fromEntries(r.strings);for(let[e,t]of r.scalars)l[e]=String(t);return{format:n?`MAT 7.3`:`MAT 5`,startTime:null,groups:o,meta:l,events:[],notes:r.notes,pick:c,defaultGroups:c&&s.length?s:void 0,state:{groups:a,sources:i}}},async*stream(e){for(let t of e.selection)yield*_r(e,t.group)},streamGroup:(e,t)=>_r(e,t)};async function*_r(e,t){let n=e.plan.state,r=n.groups[t],i=f(e,t).map(e=>r.channels[e]),a=r.channels[0].length,o=hr(i.length+1);try{for(let n=0;n<a;n+=o){e.signal?.throwIfAborted();let s=Math.min(a,n+o),c=null;if(r.time){c=await r.time.read(n,s);for(let e=0;e<c.length;e++)c[e]-=r.origin}let l=[];for(let e of i)l.push(await e.read(n,s));yield{group:t,time:c,start:n,length:s-n,columns:l}}}finally{for(let e of n.sources)e.release()}}const vr={id:`comtrade`,label:`COMTRADE (IEEE C37.111)`,extensions:[`.cfg`,`.cff`],companions:[{ext:`.dat`}],sniff:e=>{let t=l(e.subarray(0,512));if(/^---\s*file type:\s*CFG/i.test(t))return!0;let n=t.split(/\r?\n/);return n.length>2&&/^\s*\d+\s*,\s*\d+A\s*,\s*\d+D\s*$/i.test(n[1])}};function yr(e,t){let n=/^\s*(\d{1,2})\/(\d{1,2})\/(\d{2,4})\s*,\s*(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))?/.exec(e??``);if(!n)return[null,0,!1];let[r,i]=t===1991?[n[2],n[1]]:[n[1],n[2]],a=n[3].length===2?2e3+Number(n[3]):Number(n[3]),o=Number(`${n[6]}.${n[7]??`0`}`);return[`${a}-${i.padStart(2,`0`)}-${r.padStart(2,`0`)}T${n[4].padStart(2,`0`)}:${n[5]}:${o.toFixed(3).padStart(6,`0`)}`,Date.UTC(a,Number(i)-1,Number(r),Number(n[4]),Number(n[5]))/1e3+o,(n[7]??``).length>6]}function br(e){let t=e.split(/\r?\n/).map(e=>e.trim()),[n,,r]=t[0].split(`,`),i=Number(r)||1991,a=/(\d+)A\s*,\s*(\d+)D/i.exec(t[1]??``);if(!a)throw Error(`This COMTRADE .cfg is damaged (second line).`);let o=Number(a[1]),s=Number(a[2]);if(o+s>t.length)throw Error(`This COMTRADE .cfg is damaged (more channels than lines).`);let c=2,l=[];for(let e=0;e<o;e++,c++){let e=(t[c]??``).split(`,`);l.push({name:(e[1]??``).trim(),unit:(e[4]??``).trim(),a:Number(e[5]),b:Number(e[6]??0)||0})}let u=[];for(let e=0;e<s;e++,c++)u.push(((t[c]??``).split(`,`)[1]??``).trim());c++;let d=Number(t[c++]);if(!(Number.isInteger(d)&&d>=0&&d<=t.length-c))throw Error(`This COMTRADE .cfg is damaged (sample rates).`);let f=[];for(let e=0;e<Math.max(1,d);e++,c++){let[e,n]=(t[c]??``).split(`,`).map(Number);f.push([d===0?0:e,n])}let[p,m,h]=yr(t[c++],i),[g,_,v]=yr(t[c++],i),y=(t[c++]||`ASCII`).toUpperCase(),b=Number(t[c++])||1;return{station:n.trim(),rev:i,analog:l,digital:u,rates:f,start:p,trigger:g,startSec:m,triggerSec:_,ft:y,timemult:b,timebase:h||v?1e-9:1e-6}}const xr={BINARY:2,BINARY32:4,FLOAT32:4};async function Sr(e){let t=l(await e.read(0,Math.min(e.size,1<<20))),n=t.search(/---\s*file type:\s*CFG\s*---\r?\n/i),r=/---\s*file type:\s*DAT\s+(ASCII|BINARY32|BINARY|FLOAT32)(?:\s*:\s*(\d+))?\s*---\r?\n/i.exec(t);if(n<0||!r)throw Error(`This COMTRADE .cff is damaged (no CFG or DAT section in its first megabyte).`);let i=t.indexOf(`
|
|
4
|
+
`,n)+1,a=t.slice(i).search(/---\s*file type:\s*(INF|HDR|DAT)/i),o=t.slice(i,a<0?void 0:i+a),s=r.index+r[0].length;return{cfg:o,offset:s,length:r[2]?Number(r[2]):e.size-s}}function Cr(e,t,n,r){let i=0,a=0,o=t,s=0;for(let[t,c]of e){for(;o<c&&s<n;)r[s++]=a+(o-i)/t,o++;if(a+=(c-i)/t,i=c,s>=n)return}let c=e[e.length-1];for(;s<n;s++,o++)r[s]=a+(o-i)/c[0]}const wr=e=>e.companions.find(e=>e.name.toLowerCase().endsWith(`.dat`)),Tr={...vr,async plan(e,t){let n=e.main.name.toLowerCase().endsWith(`.cff`),r,i;if(n){let e=await Sr(t);r=e.cfg,i={data:`self`,offset:e.offset,length:e.length}}else{let n=wr(e);if(!n)throw Error(`This COMTRADE .cfg needs its .dat file: drop both together.`);if(t.size>16777216)throw Error(`This .cfg is too large to be a COMTRADE configuration file.`);r=l(await t.read(0,t.size)),i={data:`companion`,offset:0,length:n.size}}let a=br(r);if(a.ft!==`ASCII`&&!xr[a.ft])throw Error(`This COMTRADE file has data file type ${a.ft}, which Kymoscope cannot read.`);let o=Math.ceil(a.digital.length/16),s=a.ft===`ASCII`?0:8+a.analog.length*xr[a.ft]+2*o,c=s?Math.floor(i.length/s):i.length,u=Math.min(a.rates[a.rates.length-1][1]||(s?c:-1),c),d=a.rates.length===1&&a.rates[0][0]>0?a.rates[0][0]:null,f=[`Analog values are shown as recorded (primary or secondary, per the CFG).`];return{format:`COMTRADE ${a.rev} (${a.ft})`,startTime:a.start,meta:{station:a.station,trigger:a.trigger??``},groups:[{name:a.station||`COMTRADE`,channels:[...a.analog.map(e=>({name:e.name,unit:e.unit})),...a.digital.map(e=>({name:e,unit:``}))],samples:u,time:{kind:`timestamps`},rateHz:d}],events:a.start&&a.trigger?[{time:Math.round((a.triggerSec-a.startSec)*1e6)/1e6,text:`Trigger`}]:[],notes:f,state:{...i,cfg:a,samples:u,recordSize:s}}},stream:e=>Er(e)};async function*Er(e){let i=e.plan.state,{cfg:a}=i,o=i.data===`self`?e.io:new n(wr(e.files)),s=f(e,0),c=a.analog.length,l=a.rates[0][0]>0,u=a.timemult*a.timebase,d=65536,p=0,m=(e,t,n)=>{let r=new Float64Array(e);if(l)Cr(a.rates,p,e,r);else for(let n=0;n<e;n++)r[n]=t[n]*u;let i={group:0,time:r,start:p,length:e,columns:n};return p+=e,i};if(a.ft===`ASCII`){let t=a.rev>=1999?`99999`:``,n=s.map(e=>e<c?a.analog[e]:null),r=new Float64Array(d),l=s.map(()=>new Float64Array(d)),u=0,f=(e,i,a)=>{let o=e.slice(i,a).split(`,`);if(!(o.length<2)){r[u]=Number(o[1]);for(let e=0;e<s.length;e++){let r=(o[2+s[e]]??``).trim(),i=n[e];l[e][u]=r===``||i&&r===t?NaN:i?i.a*Number(r)+i.b:Number(r)}u++}},p=``,h=new TextDecoder(`latin1`);for await(let t of o.windows(i.offset,i.length)){e.signal?.throwIfAborted();let n=p+h.decode(t.bytes),i=0;for(let e=n.indexOf(`
|
|
5
5
|
`,i);e>=0;e=n.indexOf(`
|
|
6
|
-
`,i))f(n,i,e),i=e+1,u===d&&(yield m(u,r,l),r=new Float64Array(d),l=s.map(()=>new Float64Array(d)),u=0);p=n.slice(i)}p.trim()&&f(p,0,p.length),u&&(yield m(u,r.slice(0,u),l.map(e=>e.slice(0,u))));return}let h=i.recordSize,g=br[a.ft],_=Math.max(1,Math.floor(Math.min(t,d*h)/h)),v=i.samples;for await(let t of o.windows(i.offset,Math.min(i.length,i.samples*h),_*h)){e.signal?.throwIfAborted();let n=Math.min(v,Math.floor(t.bytes.length/h));if(n<=0)break;let i=r(t.bytes),o=new Float64Array(n);if(!l)for(let e=0;e<n;e++)o[e]=i.getUint32(e*h+4,!0);yield m(n,o,s.map(e=>{let t=new Float64Array(n);if(e<c){let{a:r,b:o}=a.analog[e],s=8+e*g;if(a.ft===`BINARY`)for(let e=0,a=s;e<n;e++,a+=h){let n=i.getInt16(a,!0);t[e]=n===-32768?NaN:r*n+o}else if(a.ft===`BINARY32`)for(let e=0,a=s;e<n;e++,a+=h){let n=i.getInt32(a,!0);t[e]=n===-2147483648?NaN:r*n+o}else for(let e=0,a=s;e<n;e++,a+=h)t[e]=r*i.getFloat32(a,!0)+o}else{let r=e-c,a=8+c*g+2*(r>>4),o=1<<(r&15);for(let e=0,r=a;e<n;e++,r+=h)t[e]=i.getUint16(r,!0)&o?1:0}return t})),v-=n}}new TextEncoder;function Er(e,t,n){let r=t,i=r+n,a=[],o=``;for(;r<i;){let t=e[r++];if(!(t&128))a.push(t);else if((t&224)==192){let n=e[r++]&63;a.push((t&31)<<6|n)}else if((t&240)==224){let n=e[r++]&63,i=e[r++]&63;a.push((t&31)<<12|n<<6|i)}else if((t&248)==240){let n=e[r++]&63,i=e[r++]&63,o=e[r++]&63,s=(t&7)<<18|n<<12|i<<6|o;s>65535&&(s-=65536,a.push(s>>>10&1023|55296),s=56320|s&1023),a.push(s)}else a.push(t);a.length>=4096&&(o+=String.fromCharCode(...a),a.length=0)}return a.length>0&&(o+=String.fromCharCode(...a)),o}const Dr=new TextDecoder;function Or(e,t,n){let r=e.subarray(t,t+n);return Dr.decode(r)}function kr(e,t,n){return n>200?Or(e,t,n):Er(e,t,n)}var Ar=class{type;data;constructor(e,t){this.type=e,this.data=t}},$=class e extends Error{constructor(t){super(t);let n=Object.create(e.prototype);Object.setPrototypeOf(this,n),Object.defineProperty(this,`name`,{configurable:!0,enumerable:!1,value:e.name})}};function jr(e,t,n){let r=Math.floor(n/4294967296),i=n;e.setUint32(t,r),e.setUint32(t+4,i)}function Mr(e,t){let n=e.getInt32(t),r=e.getUint32(t+4);return n*4294967296+r}function Nr(e,t){let n=e.getUint32(t),r=e.getUint32(t+4);return n*4294967296+r}function Pr({sec:e,nsec:t}){if(e>=0&&t>=0&&e<=17179869183)if(t===0&&e<=4294967295){let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e),t}else{let n=e/4294967296,r=e&4294967295,i=new Uint8Array(8),a=new DataView(i.buffer);return a.setUint32(0,t<<2|n&3),a.setUint32(4,r),i}else{let n=new Uint8Array(12),r=new DataView(n.buffer);return r.setUint32(0,t),jr(r,4,e),n}}function Fr(e){let t=e.getTime(),n=Math.floor(t/1e3),r=(t-n*1e3)*1e6,i=Math.floor(r/1e9);return{sec:n+i,nsec:r-i*1e9}}function Ir(e){return e instanceof Date?Pr(Fr(e)):null}function Lr(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:{let e=t.getUint32(0),n=t.getUint32(4);return{sec:(e&3)*4294967296+n,nsec:e>>>2}}case 12:return{sec:Mr(t,4),nsec:t.getUint32(0)};default:throw new $(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${e.length}`)}}function Rr(e){let t=Lr(e);return new Date(t.sec*1e3+t.nsec/1e6)}const zr={type:-1,encode:Ir,decode:Rr};var Br=class e{static defaultCodec=new e;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(zr)}register({type:e,encode:t,decode:n}){if(e>=0)this.encoders[e]=t,this.decoders[e]=n;else{let r=-1-e;this.builtInEncoders[r]=t,this.builtInDecoders[r]=n}}tryToEncode(e,t){for(let n=0;n<this.builtInEncoders.length;n++){let r=this.builtInEncoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new Ar(-1-n,i)}}for(let n=0;n<this.encoders.length;n++){let r=this.encoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new Ar(n,i)}}return e instanceof Ar?e:null}decode(e,t,n){let r=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return r?r(e,t,n):new Ar(t,e)}};function Vr(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function Hr(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):Vr(e)?new Uint8Array(e):Uint8Array.from(e)}function Ur(e){return`${e<0?`-`:``}0x${Math.abs(e).toString(16).padStart(2,`0`)}`}var Wr=class{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(e=16,t=16){this.maxKeyLength=e,this.maxLengthPerKey=t,this.caches=[];for(let e=0;e<this.maxKeyLength;e++)this.caches.push([])}canBeCached(e){return e>0&&e<=this.maxKeyLength}find(e,t,n){let r=this.caches[n-1];FIND_CHUNK:for(let i of r){let r=i.bytes;for(let i=0;i<n;i++)if(r[i]!==e[t+i])continue FIND_CHUNK;return i.str}return null}store(e,t){let n=this.caches[e.length-1],r={bytes:e,str:t};n.length>=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)}decode(e,t,n){let r=this.find(e,t,n);if(r!=null)return this.hit++,r;this.miss++;let i=Er(e,t,n),a=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(a,i),i}};const Gr=`array`,Kr=`map_key`,qr=`map_value`,Jr=e=>{if(typeof e==`string`||typeof e==`number`)return e;throw new $(`The type of key must be string or number but `+typeof e)};var Yr=class{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(e){let t=this.getUninitializedStateFromPool();t.type=Gr,t.position=0,t.size=e,t.array=Array(e)}pushMapState(e){let t=this.getUninitializedStateFromPool();t.type=Kr,t.readCount=0,t.size=e,t.map={}}getUninitializedStateFromPool(){return this.stackHeadPosition++,this.stackHeadPosition===this.stack.length&&this.stack.push({type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null}),this.stack[this.stackHeadPosition]}release(e){if(this.stack[this.stackHeadPosition]!==e)throw Error(`Invalid stack state. Released state is not on top of the stack.`);if(e.type===Gr){let t=e;t.size=0,t.array=void 0,t.position=0,t.type=void 0}if(e.type===Kr||e.type===qr){let t=e;t.size=0,t.map=void 0,t.readCount=0,t.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}};const Xr=new DataView(new ArrayBuffer(0)),Zr=new Uint8Array(Xr.buffer);try{Xr.getInt8(0)}catch(e){if(!(e instanceof RangeError))throw Error(`This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access`)}const Qr=RangeError(`Insufficient data`),$r=new Wr;var ei=class e{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=Xr;bytes=Zr;headByte=-1;stack=new Yr;entered=!1;constructor(e){this.extensionCodec=e?.extensionCodec??Br.defaultCodec,this.context=e?.context,this.useBigInt64=e?.useBigInt64??!1,this.rawStrings=e?.rawStrings??!1,this.maxStrLength=e?.maxStrLength??4294967295,this.maxBinLength=e?.maxBinLength??4294967295,this.maxArrayLength=e?.maxArrayLength??4294967295,this.maxMapLength=e?.maxMapLength??4294967295,this.maxExtLength=e?.maxExtLength??4294967295,this.keyDecoder=e?.keyDecoder===void 0?$r:e.keyDecoder,this.mapKeyConverter=e?.mapKeyConverter??Jr}clone(){return new e({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=-1,this.stack.reset()}setBuffer(e){let t=Hr(e);this.bytes=t,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength),this.pos=0}appendBuffer(e){if(this.headByte===-1&&!this.hasRemaining(1))this.setBuffer(e);else{let t=this.bytes.subarray(this.pos),n=Hr(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}}hasRemaining(e){return this.view.byteLength-this.pos>=e}createExtraByteError(e){let{view:t,pos:n}=this;return RangeError(`Extra ${t.byteLength-n} of ${t.byteLength} byte(s) found at buffer[${e}]`)}decode(e){if(this.entered)return this.clone().decode(e);try{this.entered=!0,this.reinitializeState(),this.setBuffer(e);let t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t}finally{this.entered=!1}}*decodeMulti(e){if(this.entered){yield*this.clone().decodeMulti(e);return}try{for(this.entered=!0,this.reinitializeState(),this.setBuffer(e);this.hasRemaining(1);)yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(e){if(this.entered)return this.clone().decodeAsync(e);try{this.entered=!0;let t=!1,n;for await(let r of e){if(t)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);try{n=this.doDecodeSync(),t=!0}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}if(t){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:r,pos:i,totalPos:a}=this;throw RangeError(`Insufficient data in parsing ${Ur(r)} at ${a} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(e){return this.decodeMultiAsync(e,!0)}decodeStream(e){return this.decodeMultiAsync(e,!1)}async*decodeMultiAsync(e,t){if(this.entered){yield*this.clone().decodeMultiAsync(e,t);return}try{this.entered=!0;let n=t,r=-1;for await(let i of e){if(t&&r===0)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete());try{for(;yield this.doDecodeSync(),--r!==0;);}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){DECODE:for(;;){let e=this.readHeadByte(),t;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){let n=e-128;if(n!==0){this.pushMapState(n),this.complete();continue DECODE}else t={}}else if(e<160){let n=e-144;if(n!==0){this.pushArrayState(n),this.complete();continue DECODE}else t=[]}else{let n=e-160;t=this.decodeString(n,0)}else if(e===192)t=null;else if(e===194)t=!1;else if(e===195)t=!0;else if(e===202)t=this.readF32();else if(e===203)t=this.readF64();else if(e===204)t=this.readU8();else if(e===205)t=this.readU16();else if(e===206)t=this.readU32();else if(e===207)t=this.useBigInt64?this.readU64AsBigInt():this.readU64();else if(e===208)t=this.readI8();else if(e===209)t=this.readI16();else if(e===210)t=this.readI32();else if(e===211)t=this.useBigInt64?this.readI64AsBigInt():this.readI64();else if(e===217){let e=this.lookU8();t=this.decodeString(e,1)}else if(e===218){let e=this.lookU16();t=this.decodeString(e,2)}else if(e===219){let e=this.lookU32();t=this.decodeString(e,4)}else if(e===220){let e=this.readU16();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===221){let e=this.readU32();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===222){let e=this.readU16();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===223){let e=this.readU32();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===196){let e=this.lookU8();t=this.decodeBinary(e,1)}else if(e===197){let e=this.lookU16();t=this.decodeBinary(e,2)}else if(e===198){let e=this.lookU32();t=this.decodeBinary(e,4)}else if(e===212)t=this.decodeExtension(1,0);else if(e===213)t=this.decodeExtension(2,0);else if(e===214)t=this.decodeExtension(4,0);else if(e===215)t=this.decodeExtension(8,0);else if(e===216)t=this.decodeExtension(16,0);else if(e===199){let e=this.lookU8();t=this.decodeExtension(e,1)}else if(e===200){let e=this.lookU16();t=this.decodeExtension(e,2)}else if(e===201){let e=this.lookU32();t=this.decodeExtension(e,4)}else throw new $(`Unrecognized type byte: ${Ur(e)}`);this.complete();let n=this.stack;for(;n.length>0;){let e=n.top();if(e.type===Gr)if(e.array[e.position]=t,e.position++,e.position===e.size)t=e.array,n.release(e);else continue DECODE;else if(e.type===Kr){if(t===`__proto__`)throw new $(`The key __proto__ is not allowed`);e.key=this.mapKeyConverter(t),e.type=qr;continue DECODE}else if(e.map[e.key]=t,e.readCount++,e.readCount===e.size)t=e.map,n.release(e);else{e.key=null,e.type=Kr;continue DECODE}}return t}}readHeadByte(){return this.headByte===-1&&(this.headByte=this.readU8()),this.headByte}complete(){this.headByte=-1}readArraySize(){let e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new $(`Unrecognized array type byte: ${Ur(e)}`)}}pushMapState(e){if(e>this.maxMapLength)throw new $(`Max length exceeded: map length (${e}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(e)}pushArrayState(e){if(e>this.maxArrayLength)throw new $(`Max length exceeded: array length (${e}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(e)}decodeString(e,t){return!this.rawStrings||this.stateIsMapKey()?this.decodeUtf8String(e,t):this.decodeBinary(e,t)}decodeUtf8String(e,t){if(e>this.maxStrLength)throw new $(`Max length exceeded: UTF-8 byte length (${e}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+t+e)throw Qr;let n=this.pos+t,r;return r=this.stateIsMapKey()&&this.keyDecoder?.canBeCached(e)?this.keyDecoder.decode(this.bytes,n,e):kr(this.bytes,n,e),this.pos+=t+e,r}stateIsMapKey(){return this.stack.length>0?this.stack.top().type===Kr:!1}decodeBinary(e,t){if(e>this.maxBinLength)throw new $(`Max length exceeded: bin length (${e}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(e+t))throw Qr;let n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r}decodeExtension(e,t){if(e>this.maxExtLength)throw new $(`Max length exceeded: ext length (${e}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let e=this.view.getUint8(this.pos);return this.pos++,e}readI8(){let e=this.view.getInt8(this.pos);return this.pos++,e}readU16(){let e=this.view.getUint16(this.pos);return this.pos+=2,e}readI16(){let e=this.view.getInt16(this.pos);return this.pos+=2,e}readU32(){let e=this.view.getUint32(this.pos);return this.pos+=4,e}readI32(){let e=this.view.getInt32(this.pos);return this.pos+=4,e}readU64(){let e=Nr(this.view,this.pos);return this.pos+=8,e}readI64(){let e=Mr(this.view,this.pos);return this.pos+=8,e}readU64AsBigInt(){let e=this.view.getBigUint64(this.pos);return this.pos+=8,e}readI64AsBigInt(){let e=this.view.getBigInt64(this.pos);return this.pos+=8,e}readF32(){let e=this.view.getFloat32(this.pos);return this.pos+=4,e}readF64(){let e=this.view.getFloat64(this.pos);return this.pos+=8,e}};function ti(e,t){return new ei(t).decode(e)}const ni=e=>e+7&-8;function ri(e){let t=e=>RangeError(`columns message: ${e}`);e.byteOffset%8!=0&&(e=e.slice());let n=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.byteLength<8)throw t(`short`);if(n.getUint8(0)!==1)throw t(`version ${n.getUint8(0)}`);let r=n.getUint16(2,!0),i=n.getUint32(4,!0),a=new TextDecoder,o=[],s=8;for(let i=0;i<r;i++){if(s+3>e.byteLength)throw t(`short channel table`);let r=n.getUint8(s),i=n.getUint8(s+1),c=n.getUint8(s+2);if(s+=3,r!==4&&r!==8)throw t(`value size ${r}`);if(s+i+c>e.byteLength)throw t(`short channel table`);o.push({name:a.decode(e.subarray(s,s+i)),unit:a.decode(e.subarray(s+i,s+i+c)),size:r}),s+=i+c}if(s=ni(s),s+ni(i*8)+o.reduce((e,t)=>e+ni(i*t.size),0)>e.byteLength)throw t(`short data`);let c=e.byteOffset,l=new Float64Array(e.buffer,c+s,i);s+=ni(i*8);let u={},d={};for(let t of o)u[t.name]=t.size===4?new Float32Array(e.buffer,c+s,i):new Float64Array(e.buffer,c+s,i),t.unit&&(d[t.name]=t.unit),s+=ni(i*t.size);return{t:l,columns:u,units:d}}function ii(e){return e.values.map(e=>e.buffer)}const ai=`ElapsedTime`;function oi(){let e=globalThis.crypto;if(!e?.subtle)throw Error(`WebCrypto SubtleCrypto is not available`);return e.subtle}async function si(e,t,n,r){let i=await oi().decrypt({name:`AES-GCM`,iv:t,additionalData:r},e,n);return new Uint8Array(i)}new TextEncoder().encode(`kymoscope-device-wrap-v1`),new TextEncoder().encode(`kymoscope-sender-bind-v1`);const ci=[75,82,67,49];function li(e){let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function ui(e){if(e.length<56||ci.some((t,n)=>e[n]!==t))throw RangeError(`not a KRC1 chunk`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint16(4,!0);if(n!==1)throw RangeError(`KRC version ${n}`);let r=t.getUint16(6,!0);if(r<56)throw RangeError(`KRC header too short`);return{recordingId:li(e.subarray(8,24)),seq:t.getUint32(24,!0),count:t.getUint32(28,!0),bytes:t.getUint32(32,!0),headerBytes:r,t0:t.getFloat64(40,!0),t1:t.getFloat64(48,!0)}}function di(e){let t=ui(e),n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=Math.min(e.length,t.bytes),i=[],a=t.headerBytes;for(;i.length<t.count&&a+12<=r;){let t=n.getUint32(a+8,!0);if(a+12+t>r)break;i.push({at:n.getFloat64(a,!0),bytes:e.subarray(a+12,a+12+t)}),a+=12+t}return{header:t,messages:i,truncated:i.length<t.count}}function fi(e){let t=new Map;return async n=>{if(n.length===0)return null;let r=n[0]&128?2:1;if(n.length<r+12+16)return null;let i=r===2?n[1]:null,a=t.get(i),o=[...a?[a]:[],...e.filter(e=>e.keyId===i&&e.key!==a).map(e=>e.key)];for(let e of o)try{let a=await si(e,n.subarray(r,r+12),n.subarray(r+12),n.subarray(0,r));return t.set(i,e),{kind:n[0]&-129,plaintext:a}}catch{}return null}}const pi=8192;async function*mi(e){let t=0;for(;t+56<=e.size;){let n=ui(await e.read(t,56));if(yield await e.slice(t,n.bytes),n.bytes<=56)return;t+=n.bytes}}function hi(e){let t=e.filter(e=>e&&typeof e.t==`number`&&Array.isArray(e.signals)),n={},r={};return t.forEach((e,i)=>{for(let a of e.signals){if(!a||typeof a.name!=`string`)continue;let e=n[a.name]??=new Float64Array(t.length).fill(NaN);e[i]=typeof a.value==`number`?a.value:NaN,a.unit&&!r[a.name]&&(r[a.name]=a.unit)}}),{t:t.map(e=>e.t),columns:n,units:r}}async function*gi(e,t,n){let r=fi(e.keys??[]);for await(let e of mi(t)){let{header:t,messages:i}=di(e);n.t0??=t.t0;for(let e of i){let t=await r(e.bytes);if(!t){n.lost++;continue}try{if(t.kind===3){let n=ri(t.plaintext);yield{at:e.at,t:n.t,columns:n.columns,units:n.units??{}}}else if(t.kind===2){let n=ti(t.plaintext);yield{at:e.at,...hi(Array.isArray(n?.frames)?n.frames:[])}}}catch{n.lost++}}}}const _i={mdf:Ut,edf:Yt,xdf:sn,tdms:xn,hdf5:qn,mat:hr,comtrade:wr,krc:{id:`krc`,label:`Kymoscope recording`,extensions:[],sniff:()=>!1,async plan(e,t){let n=[ai],r=new Map([[ai,`s`]]),i={lost:0,t0:null},a=0;for await(let o of gi(e,t,i)){a+=o.t.length;for(let e of Object.keys(o.columns))e!==`ElapsedTime`&&(r.has(e)?!r.get(e)&&o.units[e]&&r.set(e,o.units[e]):(n.push(e),r.set(e,o.units[e]??``)))}let o=n.map(e=>({name:e,unit:r.get(e)??``})),s=i.lost?[`${i.lost} ${i.lost===1?`message`:`messages`} couldn't be opened with the keys this browser has.`]:[];return{format:`Kymoscope recording`,startTime:i.t0===null?null:new Date(i.t0).toISOString(),groups:[{name:`Recording`,channels:o,samples:a,time:{kind:`timestamps`},rateHz:null}],meta:{},events:[],notes:s,state:{names:n}}},async*stream(e){let{names:t}=e.plan.state,n=e.selection.find(e=>e.group===0)?.channels??[],r=new Map(n.map((e,n)=>[t[e],n])),i=r.get(ai),a=()=>n.map(()=>new Float64Array(pi).fill(NaN)),o=new Float64Array(pi),s=a(),c=0,l=0,u=0,d=-1/0,f=0,p=null,m=()=>{let e={group:0,time:o.slice(0,c),start:l,length:c,columns:s.map(e=>e.slice(0,c))};return l+=c,c=0,o=new Float64Array(pi),s=a(),e};for await(let t of gi(e.files,e.io,{lost:0,t0:null})){if(e.signal?.aborted)return;let n=t.t.length;if(n!==0){+t.t[0]+u<d&&(u=d+Math.max(0,(t.at-f)/1e3)-+t.t[0]),f=t.at;for(let e=0;e<n;){let a=Math.min(n-e,pi-c);for(let n=0;n<a;n++){let r=+t.t[e+n]+u;p??=r,o[c+n]=r-p,d=r}if(i!==void 0)for(let n=0;n<a;n++)s[i][c+n]=+t.t[e+n];for(let[n,i]of Object.entries(t.columns)){let t=n===`ElapsedTime`?void 0:r.get(n);if(t===void 0)continue;let o=s[t];if(i instanceof Float64Array||i instanceof Float32Array)o.set(i.subarray(e,e+a),c);else for(let t=0;t<a;t++)o[c+t]=+i[e+t]}c+=a,e+=a,c===pi&&(yield m())}}}c>0&&(yield m())}}};function vi(e){let t=_i[e];if(!t)throw Error(`No importer for format ${e}.`);return t}const yi=`This file's groups do not interleave in time: reading them together would hold too much in memory. Choose fewer groups, or split them.`,bi=e=>e.length*(1+e.columns.length);function xi(e){let t=e[Symbol.asyncIterator]();return{pull:async()=>{let e=await t.next();return e.done?null:e.value}}}function Si(e,t){let n=Array.from({length:t.size},()=>[]),r=!1,i=0,a=async a=>{for(;;){if(n[a].length){let e=n[a].shift();return i-=bi(e),e}if(r)return null;let o=await e.next();if(o.done){r=!0;continue}let s=t.get(o.value.group);if(s!==void 0&&(n[s].push(o.value),(i+=bi(o.value))>128e6))throw Error(yi)}};return n.map((e,t)=>({pull:()=>a(t)}))}function Ci(e,t){if(e.time)return e.time;let n=new Float64Array(e.length);if(t.time.kind===`rate`){let{rate:r,start:i}=t.time;for(let t=0;t<e.length;t++)n[t]=i+(e.start+t)/r}else for(let t=0;t<e.length;t++)n[t]=e.start+t;return n}const wi=new Int32Array,Ti={t:new Float64Array,cols:[],from:0};function Ei(e,t,n,r){let i=n,a=r;for(;i<a;){let n=i+a>>>1;e[n]<=t?i=n+1:a=n}return i}var Di=class{group;channels;feed;pending=[];done=!1;last;scratch=[];#e=-1/0;constructor(e,t,n){this.group=e,this.channels=t,this.feed=n,this.last=t.map(e=>e.text?null:NaN)}rows(){let e=0;for(let t of this.pending)e+=t.t.length-t.from;return e}lastTime(){let e=this.pending[this.pending.length-1];return e&&e.t.length>e.from?e.t[e.t.length-1]:-1/0}async fill(){let e=await this.feed.pull();if(!e){this.done=!0;return}if(e.length===0)return;let t=Oi(Ci(e,this.group),this.#e);if(t.length&&(this.#e=t[t.length-1]),this.pending.push({t,cols:e.columns,from:0}),this.rows()*(1+this.channels.length)>128e6)throw Error(yi)}};function Oi(e,t){let n=t,r=0;for(;r<e.length;r++){let t=e[r];if(!(t>=n&&t>-1/0&&t<1/0))break;n=t}if(r===e.length)return e;for(n===-1/0&&(n=0);r<e.length;r++){let t=e[r];t>=n&&t<1/0?n=t:e[r]=n}return e}function ki(e,t){let n=e.length,r=e.map(e=>e.t),i=Int32Array.from(e,e=>e.from),a=Int32Array.from(e,e=>Ei(e.t,t,e.from,e.t.length));if(n===1)return r[0].subarray(i[0],a[0]);let o=0;for(let e=0;e<n;e++)o+=a[e]-i[e];let s=new Float64Array(o),c=0;for(;;){let e=1/0;for(let t=0;t<n;t++)i[t]<a[t]&&r[t][i[t]]<e&&(e=r[t][i[t]]);if(e===1/0)break;s[c++]=e;for(let t=0;t<n;t++){let n=r[t],o=a[t],s=i[t];for(;s<o&&n[s]===e;)s++;i[t]=s}}return s.subarray(0,c)}function Ai(e,t,n,r,i,a){if(i-r>8)e.set(t.subarray(n+r,n+i),a);else for(let o=r;o<i;o++)e[a+o-r]=t[n+o]}function ji(e,t,n,r,i,a){let o=0;for(let s=0;s<n.length;s++){let c=n[s],l=c.length;if(l===0)continue;let u=i[s].from,d=i[s].cols[a];e.fill(t,o,c[0]);let f=r[s],p=0;for(let t=0;t<f.length;t++){let n=f[t];Ai(e,d,u,p,n,c[p]);let r=c[n],i=c[n+1],a=d[u+n];if(i-r>16)e.fill(a,r,i);else for(let t=r;t<i;t++)e[t]=a;p=n+1}Ai(e,d,u,p,l-1,c[p]),o=c[l-1],t=d[u+l-1]}e.fill(t,o,e.length)}function Mi(e,t,n,r,i){let a=0;for(let o=0;o<n.length;o++){let s=n[o],c=s.length;if(c===0)continue;let l=r[o].from,u=r[o].cols[i];e.fill(t,a,s[0]);for(let t=0;t<c-1;t++)e.fill(u[l+t],s[t],s[t+1]);a=s[c-1],t=u[l+c-1]}e.fill(t,a,e.length)}function Ni(e,t,n,r,i){let a=n.length,o=null,s=0;for(let c=0;c<i.length;c++){let l=e[t+c],u=r;if(n[r]<l){let e=r,t=1;for(;e+t<a&&n[e+t]<l;)e+=t,t*=2;let i=Math.min(e+t,a-1);for(;i-e>1;){let t=e+i>>>1;n[t]<l?e=t:i=t}r=i}i[c]=r,c>0&&r!==u+1&&((o??=new Int32Array(i.length-1))[s++]=c-1)}return o?o.subarray(0,s):wi}function Pi(e,t,n,r,i){let a=t.length;if(r){let t=e.pending[0],n=t.from+a,r=t.cols.map(e=>e instanceof Float64Array?e.subarray(t.from,n):e.slice(t.from,n));if(a>0)for(let i=0;i<r.length;i++)e.last[i]=t.cols[i][n-1];return e.pending=n<t.t.length?[{...t,from:n}]:[],r}let o=e.pending,s=[],c=[];if(a>0){let e=t[a-1],n=0;for(let r of o){let i=r.t,a=Ei(i,e,r.from,i.length),o=new Int32Array(a-r.from);if(c.push(Ni(i,r.from,t,n,o)),o.length&&(n=o[o.length-1]),s.push(o),a<i.length)break}}let l=e.channels.map((r,l)=>{if(r.sparse&&n){let e=r.text?Array(a).fill(null):new Float64Array(a).fill(NaN);for(let n=0;n<s.length;n++){let r=s[n],{t:i,from:c}=o[n],u=o[n].cols[l];for(let n=0;n<r.length;n++){let o=r[n];o<a&&t[o]===i[c+n]&&(e[o]=u[c+n])}}return e}if(r.text){let t=Array(a);return Mi(t,e.last[l],s,o,l),t}let u;return i?(e.scratch[l]?.length>=a||(e.scratch[l]=new Float64Array(a)),u=e.scratch[l].subarray(0,a)):u=new Float64Array(a),ji(u,e.last[l],s,c,o,l),u}),u=[];for(let t=0;t<o.length;t++){let n=o[t],r=t<s.length?s[t].length:0;if(r>0)for(let t=0;t<e.channels.length;t++)e.last[t]=n.cols[t][n.from+r-1];n.from+r<n.t.length&&u.push(r?{...n,from:n.from+r}:n)}return e.pending=u,l}async function Fi(e,t,n,r,i,a=!1){let o=e.map((e,r)=>new Di(e,t[r],n[r])),s=-1;e.forEach((t,n)=>{!t.irregular&&(s<0||t.samples>e[s].samples)&&(s=n)});let c=e.map((e,t)=>t===s||!!e.irregular),l=o.filter((e,t)=>c[t]),u=l.length===1,d=0;for(;;){i?.throwIfAborted();for(let e of l)for(;!e.done&&e.rows()===0;)await e.fill();if(l.every(e=>e.rows()===0))break;let e=1/0;for(let t of l)t.done||(e=Math.min(e,t.lastTime()));for(let t=0;t<o.length;t++)if(!c[t])for(;!o[t].done&&o[t].lastTime()<=e;)await o[t].fill();let t=ki(l.map(e=>e.pending[0]??Ti),e),n=[t];for(let e=0;e<o.length;e++)n.push(...Pi(o[e],t,c[e],u&&c[e],a));d+=t.length,t.length&&await r({length:t.length,columns:n})}return d}var Ii=class{#e;#t;#n;#r=0;constructor(e,t){let n=Math.max(1024,t);this.#e=e.map(e=>e.name),this.#t=e.map(()=>new Float64Array(n)),this.#n=e.map(()=>null)}append(e){let t=this.#r,n=t+e.length;if(n>this.#t[0].length){let e=Math.max(n,Math.ceil(this.#t[0].length*1.5));this.#t=this.#t.map(n=>{let r=new Float64Array(e);return r.set(n.subarray(0,t)),r})}e.columns.forEach((n,r)=>{let i=this.#t[r];if(n instanceof Float64Array){i.set(n.subarray(0,e.length),t);return}let a=this.#n[r];for(let o=0;o<e.length;o++){i[t+o]=NaN;let e=n[o];e!=null&&((a??=this.#n[r]=[])[t+o]=e)}}),this.#r=n}table(){let e=this.#r,t=this.#t.map(t=>t.length-e>t.length/100?t.slice(0,e):t.subarray(0,e));return{keys:this.#e,length:e,values:t,text:this.#n}}};async function Li(e,t,n){return ee(await e.plan(t,n))}const Ri=(e,t,n)=>Math.max(0,Math.min(e,Math.max(1<<20,n),Math.floor(1e8/t)));function zi(e,t){let n=t.flatMap(t=>t.channels.map(n=>({ch:e.groups[t.group].channels[n],group:e.groups[t.group].name}))),r=new Map;for(let{ch:e}of n)r.set(e.name.toLowerCase(),(r.get(e.name.toLowerCase())??0)+1);let i=Xt(n.map(({ch:e,group:n})=>t.length>1&&r.get(e.name.toLowerCase())>1?`${e.name} [${n}]`:e.name));return[{name:`Time`,unit:t.every(t=>e.groups[t.group].time.kind===`index`)?``:`s`,text:!1},...n.map(({ch:e},t)=>({name:i[t],unit:e.unit,text:!!e.text}))]}function Bi(e,t){let n=t.map(t=>e.groups[t.group]);if(n.some(e=>e.samples<0))return-1;let r=0,i=0;for(let e of n)e.irregular?i+=e.samples:r=Math.max(r,e.samples);return r+i}async function Vi(e,t,n,r,i,a,o={}){let s=zi(n,i),c=i.map(e=>n.groups[e.group]),l=i.map(e=>e.channels.map(t=>n.groups[e.group].channels[t])),u=[...n.events];async function*d(e){for await(let t of e)t.events&&u.push(...t.events),yield t}let f={files:t,plan:n,io:r,selection:i,signal:o.signal},p=e.streamGroup&&i.length>1&&!n.interleaved?i.map(t=>xi(d(e.streamGroup({...f,selection:[t]},t.group)))):Si(d(e.stream(f)),new Map(i.map((e,t)=>[e.group,t]))),m=Bi(n,i),h=a===`memory`?new Ii(s,Ri(m,s.length,r.size)):null,g=0,_=await Fi(c,l,p,async e=>{h?h.append(e):await o.chunk(e);let t=Date.now();o.progress&&t-g>100&&(g=t,o.progress(Math.min(.99,r.bytesRead/Math.max(1,r.size))))},o.signal,!!h);return o.progress?.(1),u.sort((e,t)=>e.time-t.time),{columns:s,rows:_,table:h?.table(),events:u}}function Hi(e){let t=new Set,n=e.columns.map(e=>{if(!(e instanceof Float64Array))return e;let n=e.byteOffset===0&&e.byteLength===e.buffer.byteLength&&!t.has(e.buffer)?e:e.slice();return t.add(n.buffer),n});return[{length:e.length,columns:n},[...t]]}function Ui(e,t=vi){let r=null,i=null,a=null,o=null,s=2,c=null;return async l=>{if(l.type===`ack`){s++;let e=c;c=null,e?.();return}if(l.type===`warm`){Nn();return}let u=setInterval(()=>e({type:`alive`,work:a?.bytesRead??0}),1e3);try{if(l.type===`plan`){r=t(l.importer),i=l.files,a=new n(i.main),o=await Li(r,i,a),e({type:`plan`,plan:{...o,state:void 0}});return}a.bytesRead=0;let u=await Vi(r,i,o,a,l.selection,l.mode,{progress:t=>e({type:`progress`,fraction:t}),chunk:async t=>{for(;s===0;)await new Promise(e=>{c=e});s--;let[n,r]=Hi(t);e({type:`chunk`,chunk:n},r)}});e({type:`done`,result:u},u.table?ii(u.table):[])}catch(t){e({type:`error`,message:E(t).message})}finally{clearInterval(u)}}}const Wi=self;let Gi=null;jn(async()=>{if(!Gi)throw Error(`The import worker was not told where the HDF5 reader is.`);await import(Gi);let e=globalThis.__kymoscopeH5wasm;if(!e)throw Error(`HDF5 reader failed to load.`);let{FS:t}=await e.ready,n=0;return async r=>{let i=`/kymo${++n}`;t.mkdir(i),t.mount(t.filesystems.WORKERFS,{files:[r]},i);try{let n=new e.File(`${i}/${r.name}`,`r`);return{root:n,close:()=>{n.close(),t.unmount(i),t.rmdir(i)}}}catch(e){throw t.unmount(i),t.rmdir(i),e}}});const Ki=Ui((e,t)=>Wi.postMessage(e,t??[]));Wi.onmessage=e=>{e.data.type===`init`?Gi=e.data.h5Url:Ki(e.data)};
|
|
6
|
+
`,i))f(n,i,e),i=e+1,u===d&&(yield m(u,r,l),r=new Float64Array(d),l=s.map(()=>new Float64Array(d)),u=0);p=n.slice(i)}p.trim()&&f(p,0,p.length),u&&(yield m(u,r.slice(0,u),l.map(e=>e.slice(0,u))));return}let h=i.recordSize,g=xr[a.ft],_=Math.max(1,Math.floor(Math.min(t,d*h)/h)),v=i.samples;for await(let t of o.windows(i.offset,Math.min(i.length,i.samples*h),_*h)){e.signal?.throwIfAborted();let n=Math.min(v,Math.floor(t.bytes.length/h));if(n<=0)break;let i=r(t.bytes),o=new Float64Array(n);if(!l)for(let e=0;e<n;e++)o[e]=i.getUint32(e*h+4,!0);yield m(n,o,s.map(e=>{let t=new Float64Array(n);if(e<c){let{a:r,b:o}=a.analog[e],s=8+e*g;if(a.ft===`BINARY`)for(let e=0,a=s;e<n;e++,a+=h){let n=i.getInt16(a,!0);t[e]=n===-32768?NaN:r*n+o}else if(a.ft===`BINARY32`)for(let e=0,a=s;e<n;e++,a+=h){let n=i.getInt32(a,!0);t[e]=n===-2147483648?NaN:r*n+o}else for(let e=0,a=s;e<n;e++,a+=h)t[e]=r*i.getFloat32(a,!0)+o}else{let r=e-c,a=8+c*g+2*(r>>4),o=1<<(r&15);for(let e=0,r=a;e<n;e++,r+=h)t[e]=i.getUint16(r,!0)&o?1:0}return t})),v-=n}}new TextEncoder;function Dr(e,t,n){let r=t,i=r+n,a=[],o=``;for(;r<i;){let t=e[r++];if(!(t&128))a.push(t);else if((t&224)==192){let n=e[r++]&63;a.push((t&31)<<6|n)}else if((t&240)==224){let n=e[r++]&63,i=e[r++]&63;a.push((t&31)<<12|n<<6|i)}else if((t&248)==240){let n=e[r++]&63,i=e[r++]&63,o=e[r++]&63,s=(t&7)<<18|n<<12|i<<6|o;s>65535&&(s-=65536,a.push(s>>>10&1023|55296),s=56320|s&1023),a.push(s)}else a.push(t);a.length>=4096&&(o+=String.fromCharCode(...a),a.length=0)}return a.length>0&&(o+=String.fromCharCode(...a)),o}const Or=new TextDecoder;function kr(e,t,n){let r=e.subarray(t,t+n);return Or.decode(r)}function Ar(e,t,n){return n>200?kr(e,t,n):Dr(e,t,n)}var jr=class{type;data;constructor(e,t){this.type=e,this.data=t}},Q=class e extends Error{constructor(t){super(t);let n=Object.create(e.prototype);Object.setPrototypeOf(this,n),Object.defineProperty(this,`name`,{configurable:!0,enumerable:!1,value:e.name})}};function Mr(e,t,n){let r=Math.floor(n/4294967296),i=n;e.setUint32(t,r),e.setUint32(t+4,i)}function Nr(e,t){let n=e.getInt32(t),r=e.getUint32(t+4);return n*4294967296+r}function Pr(e,t){let n=e.getUint32(t),r=e.getUint32(t+4);return n*4294967296+r}function Fr({sec:e,nsec:t}){if(e>=0&&t>=0&&e<=17179869183)if(t===0&&e<=4294967295){let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e),t}else{let n=e/4294967296,r=e&4294967295,i=new Uint8Array(8),a=new DataView(i.buffer);return a.setUint32(0,t<<2|n&3),a.setUint32(4,r),i}else{let n=new Uint8Array(12),r=new DataView(n.buffer);return r.setUint32(0,t),Mr(r,4,e),n}}function Ir(e){let t=e.getTime(),n=Math.floor(t/1e3),r=(t-n*1e3)*1e6,i=Math.floor(r/1e9);return{sec:n+i,nsec:r-i*1e9}}function Lr(e){return e instanceof Date?Fr(Ir(e)):null}function Rr(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:{let e=t.getUint32(0),n=t.getUint32(4);return{sec:(e&3)*4294967296+n,nsec:e>>>2}}case 12:return{sec:Nr(t,4),nsec:t.getUint32(0)};default:throw new Q(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${e.length}`)}}function zr(e){let t=Rr(e);return new Date(t.sec*1e3+t.nsec/1e6)}const Br={type:-1,encode:Lr,decode:zr};var Vr=class e{static defaultCodec=new e;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(Br)}register({type:e,encode:t,decode:n}){if(e>=0)this.encoders[e]=t,this.decoders[e]=n;else{let r=-1-e;this.builtInEncoders[r]=t,this.builtInDecoders[r]=n}}tryToEncode(e,t){for(let n=0;n<this.builtInEncoders.length;n++){let r=this.builtInEncoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new jr(-1-n,i)}}for(let n=0;n<this.encoders.length;n++){let r=this.encoders[n];if(r!=null){let i=r(e,t);if(i!=null)return new jr(n,i)}}return e instanceof jr?e:null}decode(e,t,n){let r=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return r?r(e,t,n):new jr(t,e)}};function Hr(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function Ur(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):Hr(e)?new Uint8Array(e):Uint8Array.from(e)}function Wr(e){return`${e<0?`-`:``}0x${Math.abs(e).toString(16).padStart(2,`0`)}`}var Gr=class{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(e=16,t=16){this.maxKeyLength=e,this.maxLengthPerKey=t,this.caches=[];for(let e=0;e<this.maxKeyLength;e++)this.caches.push([])}canBeCached(e){return e>0&&e<=this.maxKeyLength}find(e,t,n){let r=this.caches[n-1];FIND_CHUNK:for(let i of r){let r=i.bytes;for(let i=0;i<n;i++)if(r[i]!==e[t+i])continue FIND_CHUNK;return i.str}return null}store(e,t){let n=this.caches[e.length-1],r={bytes:e,str:t};n.length>=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)}decode(e,t,n){let r=this.find(e,t,n);if(r!=null)return this.hit++,r;this.miss++;let i=Dr(e,t,n),a=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(a,i),i}};const Kr=`array`,qr=`map_key`,Jr=`map_value`,Yr=e=>{if(typeof e==`string`||typeof e==`number`)return e;throw new Q(`The type of key must be string or number but `+typeof e)};var Xr=class{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(e){let t=this.getUninitializedStateFromPool();t.type=Kr,t.position=0,t.size=e,t.array=Array(e)}pushMapState(e){let t=this.getUninitializedStateFromPool();t.type=qr,t.readCount=0,t.size=e,t.map={}}getUninitializedStateFromPool(){return this.stackHeadPosition++,this.stackHeadPosition===this.stack.length&&this.stack.push({type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null}),this.stack[this.stackHeadPosition]}release(e){if(this.stack[this.stackHeadPosition]!==e)throw Error(`Invalid stack state. Released state is not on top of the stack.`);if(e.type===Kr){let t=e;t.size=0,t.array=void 0,t.position=0,t.type=void 0}if(e.type===qr||e.type===Jr){let t=e;t.size=0,t.map=void 0,t.readCount=0,t.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}};const Zr=new DataView(new ArrayBuffer(0)),Qr=new Uint8Array(Zr.buffer);try{Zr.getInt8(0)}catch(e){if(!(e instanceof RangeError))throw Error(`This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access`)}const $r=RangeError(`Insufficient data`),ei=new Gr;var ti=class e{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=Zr;bytes=Qr;headByte=-1;stack=new Xr;entered=!1;constructor(e){this.extensionCodec=e?.extensionCodec??Vr.defaultCodec,this.context=e?.context,this.useBigInt64=e?.useBigInt64??!1,this.rawStrings=e?.rawStrings??!1,this.maxStrLength=e?.maxStrLength??4294967295,this.maxBinLength=e?.maxBinLength??4294967295,this.maxArrayLength=e?.maxArrayLength??4294967295,this.maxMapLength=e?.maxMapLength??4294967295,this.maxExtLength=e?.maxExtLength??4294967295,this.keyDecoder=e?.keyDecoder===void 0?ei:e.keyDecoder,this.mapKeyConverter=e?.mapKeyConverter??Yr}clone(){return new e({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=-1,this.stack.reset()}setBuffer(e){let t=Ur(e);this.bytes=t,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength),this.pos=0}appendBuffer(e){if(this.headByte===-1&&!this.hasRemaining(1))this.setBuffer(e);else{let t=this.bytes.subarray(this.pos),n=Ur(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}}hasRemaining(e){return this.view.byteLength-this.pos>=e}createExtraByteError(e){let{view:t,pos:n}=this;return RangeError(`Extra ${t.byteLength-n} of ${t.byteLength} byte(s) found at buffer[${e}]`)}decode(e){if(this.entered)return this.clone().decode(e);try{this.entered=!0,this.reinitializeState(),this.setBuffer(e);let t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t}finally{this.entered=!1}}*decodeMulti(e){if(this.entered){yield*this.clone().decodeMulti(e);return}try{for(this.entered=!0,this.reinitializeState(),this.setBuffer(e);this.hasRemaining(1);)yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(e){if(this.entered)return this.clone().decodeAsync(e);try{this.entered=!0;let t=!1,n;for await(let r of e){if(t)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);try{n=this.doDecodeSync(),t=!0}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}if(t){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:r,pos:i,totalPos:a}=this;throw RangeError(`Insufficient data in parsing ${Wr(r)} at ${a} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(e){return this.decodeMultiAsync(e,!0)}decodeStream(e){return this.decodeMultiAsync(e,!1)}async*decodeMultiAsync(e,t){if(this.entered){yield*this.clone().decodeMultiAsync(e,t);return}try{this.entered=!0;let n=t,r=-1;for await(let i of e){if(t&&r===0)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete());try{for(;yield this.doDecodeSync(),--r!==0;);}catch(e){if(!(e instanceof RangeError))throw e}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){DECODE:for(;;){let e=this.readHeadByte(),t;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){let n=e-128;if(n!==0){this.pushMapState(n),this.complete();continue DECODE}else t={}}else if(e<160){let n=e-144;if(n!==0){this.pushArrayState(n),this.complete();continue DECODE}else t=[]}else{let n=e-160;t=this.decodeString(n,0)}else if(e===192)t=null;else if(e===194)t=!1;else if(e===195)t=!0;else if(e===202)t=this.readF32();else if(e===203)t=this.readF64();else if(e===204)t=this.readU8();else if(e===205)t=this.readU16();else if(e===206)t=this.readU32();else if(e===207)t=this.useBigInt64?this.readU64AsBigInt():this.readU64();else if(e===208)t=this.readI8();else if(e===209)t=this.readI16();else if(e===210)t=this.readI32();else if(e===211)t=this.useBigInt64?this.readI64AsBigInt():this.readI64();else if(e===217){let e=this.lookU8();t=this.decodeString(e,1)}else if(e===218){let e=this.lookU16();t=this.decodeString(e,2)}else if(e===219){let e=this.lookU32();t=this.decodeString(e,4)}else if(e===220){let e=this.readU16();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===221){let e=this.readU32();if(e!==0){this.pushArrayState(e),this.complete();continue DECODE}else t=[]}else if(e===222){let e=this.readU16();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===223){let e=this.readU32();if(e!==0){this.pushMapState(e),this.complete();continue DECODE}else t={}}else if(e===196){let e=this.lookU8();t=this.decodeBinary(e,1)}else if(e===197){let e=this.lookU16();t=this.decodeBinary(e,2)}else if(e===198){let e=this.lookU32();t=this.decodeBinary(e,4)}else if(e===212)t=this.decodeExtension(1,0);else if(e===213)t=this.decodeExtension(2,0);else if(e===214)t=this.decodeExtension(4,0);else if(e===215)t=this.decodeExtension(8,0);else if(e===216)t=this.decodeExtension(16,0);else if(e===199){let e=this.lookU8();t=this.decodeExtension(e,1)}else if(e===200){let e=this.lookU16();t=this.decodeExtension(e,2)}else if(e===201){let e=this.lookU32();t=this.decodeExtension(e,4)}else throw new Q(`Unrecognized type byte: ${Wr(e)}`);this.complete();let n=this.stack;for(;n.length>0;){let e=n.top();if(e.type===Kr)if(e.array[e.position]=t,e.position++,e.position===e.size)t=e.array,n.release(e);else continue DECODE;else if(e.type===qr){if(t===`__proto__`)throw new Q(`The key __proto__ is not allowed`);e.key=this.mapKeyConverter(t),e.type=Jr;continue DECODE}else if(e.map[e.key]=t,e.readCount++,e.readCount===e.size)t=e.map,n.release(e);else{e.key=null,e.type=qr;continue DECODE}}return t}}readHeadByte(){return this.headByte===-1&&(this.headByte=this.readU8()),this.headByte}complete(){this.headByte=-1}readArraySize(){let e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new Q(`Unrecognized array type byte: ${Wr(e)}`)}}pushMapState(e){if(e>this.maxMapLength)throw new Q(`Max length exceeded: map length (${e}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(e)}pushArrayState(e){if(e>this.maxArrayLength)throw new Q(`Max length exceeded: array length (${e}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(e)}decodeString(e,t){return!this.rawStrings||this.stateIsMapKey()?this.decodeUtf8String(e,t):this.decodeBinary(e,t)}decodeUtf8String(e,t){if(e>this.maxStrLength)throw new Q(`Max length exceeded: UTF-8 byte length (${e}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+t+e)throw $r;let n=this.pos+t,r;return r=this.stateIsMapKey()&&this.keyDecoder?.canBeCached(e)?this.keyDecoder.decode(this.bytes,n,e):Ar(this.bytes,n,e),this.pos+=t+e,r}stateIsMapKey(){return this.stack.length>0?this.stack.top().type===qr:!1}decodeBinary(e,t){if(e>this.maxBinLength)throw new Q(`Max length exceeded: bin length (${e}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(e+t))throw $r;let n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r}decodeExtension(e,t){if(e>this.maxExtLength)throw new Q(`Max length exceeded: ext length (${e}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let e=this.view.getUint8(this.pos);return this.pos++,e}readI8(){let e=this.view.getInt8(this.pos);return this.pos++,e}readU16(){let e=this.view.getUint16(this.pos);return this.pos+=2,e}readI16(){let e=this.view.getInt16(this.pos);return this.pos+=2,e}readU32(){let e=this.view.getUint32(this.pos);return this.pos+=4,e}readI32(){let e=this.view.getInt32(this.pos);return this.pos+=4,e}readU64(){let e=Pr(this.view,this.pos);return this.pos+=8,e}readI64(){let e=Nr(this.view,this.pos);return this.pos+=8,e}readU64AsBigInt(){let e=this.view.getBigUint64(this.pos);return this.pos+=8,e}readI64AsBigInt(){let e=this.view.getBigInt64(this.pos);return this.pos+=8,e}readF32(){let e=this.view.getFloat32(this.pos);return this.pos+=4,e}readF64(){let e=this.view.getFloat64(this.pos);return this.pos+=8,e}};function ni(e,t){return new ti(t).decode(e)}const ri=e=>e+7&-8;function ii(e){let t=e=>RangeError(`columns message: ${e}`);e.byteOffset%8!=0&&(e=e.slice());let n=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.byteLength<8)throw t(`short`);if(n.getUint8(0)!==1)throw t(`version ${n.getUint8(0)}`);let r=n.getUint16(2,!0),i=n.getUint32(4,!0),a=new TextDecoder,o=[],s=8;for(let i=0;i<r;i++){if(s+3>e.byteLength)throw t(`short channel table`);let r=n.getUint8(s),i=n.getUint8(s+1),c=n.getUint8(s+2);if(s+=3,r!==4&&r!==8)throw t(`value size ${r}`);if(s+i+c>e.byteLength)throw t(`short channel table`);o.push({name:a.decode(e.subarray(s,s+i)),unit:a.decode(e.subarray(s+i,s+i+c)),size:r}),s+=i+c}if(s=ri(s),s+ri(i*8)+o.reduce((e,t)=>e+ri(i*t.size),0)>e.byteLength)throw t(`short data`);let c=e.byteOffset,l=new Float64Array(e.buffer,c+s,i);s+=ri(i*8);let u={},d={};for(let t of o)u[t.name]=t.size===4?new Float32Array(e.buffer,c+s,i):new Float64Array(e.buffer,c+s,i),t.unit&&(d[t.name]=t.unit),s+=ri(i*t.size);return{t:l,columns:u,units:d}}function ai(e){return e.values.map(e=>e.buffer)}const oi=`ElapsedTime`;function si(){let e=globalThis.crypto;if(!e?.subtle)throw Error(`WebCrypto SubtleCrypto is not available`);return e.subtle}async function ci(e,t,n,r){let i=await si().decrypt({name:`AES-GCM`,iv:t,additionalData:r},e,n);return new Uint8Array(i)}new TextEncoder().encode(`kymoscope-device-wrap-v1`),new TextEncoder().encode(`kymoscope-sender-bind-v1`);const $=(e,t)=>RangeError(`${e}: ${t}`);function li(e){if(e.byteLength<8)throw $(`block schema`,`short`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(t.getUint8(0)!==2)throw $(`block schema`,`version ${t.getUint8(0)}`);let n=t.getUint16(2,!0),r=t.getUint32(4,!0),i=new TextDecoder(`utf-8`,{fatal:!0}),a=[],o=8;try{for(let r=0;r<n;r++){if(o+3>e.byteLength)throw $(`block schema`,`short channel table`);let n=t.getUint8(o),r=t.getUint8(o+1),s=t.getUint8(o+2);if(o+=3,n!==4&&n!==8)throw $(`block schema`,`value size ${n}`);if(o+r+s>e.byteLength)throw $(`block schema`,`short channel table`);a.push({name:i.decode(e.subarray(o,o+r)),unit:i.decode(e.subarray(o+r,o+r+s)),size:n}),o+=r+s}}catch(e){throw e instanceof RangeError?e:$(`block schema`,`invalid text`)}return{id:r,channels:a}}async function ui(e,t){let n=new Blob([e]).stream().pipeThrough(new DecompressionStream(`deflate`)).getReader(),r=new Uint8Array(t),i=0;try{for(;;){let{done:e,value:a}=await n.read();if(e)break;if(i+a.length>t)throw $(`block`,`body larger than its header says`);r.set(a,i),i+=a.length}}catch(e){throw await n.cancel().catch(()=>{}),e instanceof RangeError?e:$(`block`,`body is not valid deflate`)}if(i!==t)throw $(`block`,`body size mismatch`);return r}async function di(e,t){if(e.byteLength<20)throw $(`block`,`short`);let n=new DataView(e.buffer,e.byteOffset,e.byteLength);if(n.getUint8(0)!==2)throw $(`block`,`version ${n.getUint8(0)}`);let r=n.getUint8(1),i=n.getUint16(2,!0),a=n.getUint32(4,!0),o=t.get(n.getUint32(8,!0));if(!o)return null;if(o.channels.length!==i)throw $(`block`,`channel count differs from its schema`);let s=n.getFloat64(12,!0),c=Math.max(0,a-1),l=4*c+o.channels.reduce((e,t)=>e+t.size*a,0);if(l>67108864)throw $(`block`,`too large`);let u;if(r&1)u=await ui(e.subarray(20),l);else if(u=e.subarray(20),u.byteLength<l)throw $(`block`,`body size mismatch`);let d=new DataView(u.buffer,u.byteOffset,u.byteLength),f=new Float64Array(a),p=0;a&&(f[0]=s);for(let e=1;e<a;e++)p+=d.getInt32(4*(e-1),!0),f[e]=s+p/1e6;let m=4*c,h={},g={};for(let e of o.channels){let t=new Uint8Array(a*e.size);for(let n=0;n<e.size;n++)for(let r=0;r<a;r++)t[r*e.size+n]=u[m+n*a+r];h[e.name]=e.size===4?new Float32Array(t.buffer):new Float64Array(t.buffer),e.unit&&(g[e.name]=e.unit),m+=a*e.size}return{block:{t:f,columns:h,units:g},historical:(r&2)!=0}}const fi=[75,82,67,49];function pi(e){let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function mi(e){if(e.length<56||fi.some((t,n)=>e[n]!==t))throw RangeError(`not a KRC1 chunk`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint16(4,!0);if(n!==1)throw RangeError(`KRC version ${n}`);let r=t.getUint16(6,!0);if(r<56)throw RangeError(`KRC header too short`);return{recordingId:pi(e.subarray(8,24)),seq:t.getUint32(24,!0),count:t.getUint32(28,!0),bytes:t.getUint32(32,!0),headerBytes:r,t0:t.getFloat64(40,!0),t1:t.getFloat64(48,!0)}}function hi(e){let t=mi(e),n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=Math.min(e.length,t.bytes),i=[],a=t.headerBytes;for(;i.length<t.count&&a+12<=r;){let t=n.getUint32(a+8,!0);if(a+12+t>r)break;i.push({at:n.getFloat64(a,!0),bytes:e.subarray(a+12,a+12+t)}),a+=12+t}return{header:t,messages:i,truncated:i.length<t.count}}function gi(e){let t=new Map;return async n=>{if(n.length===0)return null;let r=n[0]&128?2:1;if(n.length<r+12+16)return null;let i=r===2?n[1]:null,a=t.get(i),o=[...a?[a]:[],...e.filter(e=>e.keyId===i&&e.key!==a).map(e=>e.key)];for(let e of o)try{let a=await ci(e,n.subarray(r,r+12),n.subarray(r+12),n.subarray(0,r));return t.set(i,e),{kind:n[0]&-129,plaintext:a}}catch{}return null}}const _i=8192;async function*vi(e){let t=0;for(;t+56<=e.size;){let n=mi(await e.read(t,56));if(yield await e.slice(t,n.bytes),n.bytes<=56)return;t+=n.bytes}}function yi(e){let t=e.filter(e=>e&&typeof e.t==`number`&&Array.isArray(e.signals)),n={},r={};return t.forEach((e,i)=>{for(let a of e.signals){if(!a||typeof a.name!=`string`)continue;let e=n[a.name]??=new Float64Array(t.length).fill(NaN);e[i]=typeof a.value==`number`?a.value:NaN,a.unit&&!r[a.name]&&(r[a.name]=a.unit)}}),{t:t.map(e=>e.t),columns:n,units:r}}function bi(e){let t=2166136261^e.length;for(let n=0,r=Math.min(e.length,64);n<r;n++)t=Math.imul(t^e[n],16777619);return t>>>0}const xi=(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n]);async function*Si(e,t,n,r){let i=gi(e.keys??[]),a=new Map,o=new Map;for await(let e of vi(t)){let{header:t,messages:s}=hi(e);n.t0??=t.t0;for(let e of s){let t=bi(e.bytes),s=o.get(t);if(s&&xi(s,e.bytes))continue;o.set(t,e.bytes),o.size>4096&&o.delete(o.keys().next().value);let c=await i(e.bytes);if(!c){n.lost++;continue}try{if(c.kind===5){let e=li(c.plaintext);a.set(e.id,e);continue}if(c.kind===4){let t=await di(c.plaintext,a);if(!t){n.lost++;continue}(r===void 0||r===!!t.historical)&&(yield{at:e.at,t:t.block.t,columns:t.block.columns,units:t.block.units??{},historical:t.historical});continue}if(r)continue;if(c.kind===3){let t=ii(c.plaintext);yield{at:e.at,t:t.t,columns:t.columns,units:t.units??{}}}else if(c.kind===2){let t=ni(c.plaintext);yield{at:e.at,...yi(Array.isArray(t?.frames)?t.frames:[])}}}catch{n.lost++}}}}const Ci={mdf:Ut,edf:Yt,xdf:sn,tdms:xn,hdf5:qn,mat:gr,comtrade:Tr,krc:{id:`krc`,label:`Kymoscope recording`,extensions:[],sniff:()=>!1,async plan(e,t){let n=[oi],r=new Map([[oi,`s`]]),i={lost:0,t0:null},a=0,o=!1;for await(let s of Si(e,t,i)){a+=s.t.length,s.historical&&(o=!0);for(let e of Object.keys(s.columns))e!==`ElapsedTime`&&(r.has(e)?!r.get(e)&&s.units[e]&&r.set(e,s.units[e]):(n.push(e),r.set(e,s.units[e]??``)))}let s=n.map(e=>({name:e,unit:r.get(e)??``})),c=i.lost?[`${i.lost} ${i.lost===1?`message`:`messages`} couldn't be opened with the keys this browser has.`]:[];return{format:`Kymoscope recording`,startTime:i.t0===null?null:new Date(i.t0).toISOString(),groups:[{name:`Recording`,channels:s,samples:a,time:{kind:`timestamps`},rateHz:null}],meta:{},events:[],notes:c,state:{names:n,backlog:o}}},async*stream(e){let{names:t,backlog:n=!1}=e.plan.state,r=e.selection.find(e=>e.group===0)?.channels??[],i=new Map(r.map((e,n)=>[t[e],n])),a=i.get(oi),o=()=>r.map(()=>new Float64Array(_i).fill(NaN)),s=new Float64Array(_i),c=o(),l=0,u=0,d=0,f=-1/0,p=0,m=null,h=()=>{let e={group:0,time:s.slice(0,l),start:u,length:l,columns:c.map(e=>e.slice(0,l))};return u+=l,l=0,s=new Float64Array(_i),c=o(),e};function*g(e){let t=e.t.length;for(let n=0;n<t;){let r=Math.min(t-n,_i-l);for(let t=0;t<r;t++){let r=+e.t[n+t]+d;m??=r,s[l+t]=r-m}if(a!==void 0)for(let t=0;t<r;t++)c[a][l+t]=+e.t[n+t];for(let[t,a]of Object.entries(e.columns)){let e=t===`ElapsedTime`?void 0:i.get(t);if(e===void 0)continue;let o=c[e];if(a instanceof Float64Array||a instanceof Float32Array)o.set(a.subarray(n,n+r),l);else for(let e=0;e<r;e++)o[l+e]=+a[n+e]}l+=r,n+=r,l===_i&&(yield h())}}let _=n?Si(e.files,e.io,{lost:0,t0:null},!0):null,v=async()=>{for(let e=await _?.next();e&&!e.done;e=await _.next())if(e.value.t.length)return e.value;return null},y=await v();for await(let t of Si(e.files,e.io,{lost:0,t0:null},n?!1:void 0)){if(e.signal?.aborted)return;let n=t.t.length;if(n!==0){for(+t.t[0]+d<f&&(d=f+Math.max(0,(t.at-p)/1e3)-+t.t[0]),p=t.at;y&&+y.t[0]<+t.t[0];y=await v())yield*g(y);yield*g(t),f=+t.t[n-1]+d}}for(;y&&!e.signal?.aborted;y=await v())yield*g(y);l>0&&(yield h())}}};function wi(e){let t=Ci[e];if(!t)throw Error(`No importer for format ${e}.`);return t}const Ti=`This file's groups do not interleave in time: reading them together would hold too much in memory. Choose fewer groups, or split them.`,Ei=e=>e.length*(1+e.columns.length);function Di(e){let t=e[Symbol.asyncIterator]();return{pull:async()=>{let e=await t.next();return e.done?null:e.value}}}function Oi(e,t){let n=Array.from({length:t.size},()=>[]),r=!1,i=0,a=async a=>{for(;;){if(n[a].length){let e=n[a].shift();return i-=Ei(e),e}if(r)return null;let o=await e.next();if(o.done){r=!0;continue}let s=t.get(o.value.group);if(s!==void 0&&(n[s].push(o.value),(i+=Ei(o.value))>128e6))throw Error(Ti)}};return n.map((e,t)=>({pull:()=>a(t)}))}function ki(e,t){if(e.time)return e.time;let n=new Float64Array(e.length);if(t.time.kind===`rate`){let{rate:r,start:i}=t.time;for(let t=0;t<e.length;t++)n[t]=i+(e.start+t)/r}else for(let t=0;t<e.length;t++)n[t]=e.start+t;return n}const Ai=new Int32Array,ji={t:new Float64Array,cols:[],from:0};function Mi(e,t,n,r){let i=n,a=r;for(;i<a;){let n=i+a>>>1;e[n]<=t?i=n+1:a=n}return i}var Ni=class{group;channels;feed;pending=[];done=!1;last;scratch=[];#e=-1/0;constructor(e,t,n){this.group=e,this.channels=t,this.feed=n,this.last=t.map(e=>e.text?null:NaN)}rows(){let e=0;for(let t of this.pending)e+=t.t.length-t.from;return e}lastTime(){let e=this.pending[this.pending.length-1];return e&&e.t.length>e.from?e.t[e.t.length-1]:-1/0}async fill(){let e=await this.feed.pull();if(!e){this.done=!0;return}if(e.length===0)return;let t=Pi(ki(e,this.group),this.#e);if(t.length&&(this.#e=t[t.length-1]),this.pending.push({t,cols:e.columns,from:0}),this.rows()*(1+this.channels.length)>128e6)throw Error(Ti)}};function Pi(e,t){let n=t,r=0;for(;r<e.length;r++){let t=e[r];if(!(t>=n&&t>-1/0&&t<1/0))break;n=t}if(r===e.length)return e;for(n===-1/0&&(n=0);r<e.length;r++){let t=e[r];t>=n&&t<1/0?n=t:e[r]=n}return e}function Fi(e,t){let n=e.length,r=e.map(e=>e.t),i=Int32Array.from(e,e=>e.from),a=Int32Array.from(e,e=>Mi(e.t,t,e.from,e.t.length));if(n===1)return r[0].subarray(i[0],a[0]);let o=0;for(let e=0;e<n;e++)o+=a[e]-i[e];let s=new Float64Array(o),c=0;for(;;){let e=1/0;for(let t=0;t<n;t++)i[t]<a[t]&&r[t][i[t]]<e&&(e=r[t][i[t]]);if(e===1/0)break;s[c++]=e;for(let t=0;t<n;t++){let n=r[t],o=a[t],s=i[t];for(;s<o&&n[s]===e;)s++;i[t]=s}}return s.subarray(0,c)}function Ii(e,t,n,r,i,a){if(i-r>8)e.set(t.subarray(n+r,n+i),a);else for(let o=r;o<i;o++)e[a+o-r]=t[n+o]}function Li(e,t,n,r,i,a){let o=0;for(let s=0;s<n.length;s++){let c=n[s],l=c.length;if(l===0)continue;let u=i[s].from,d=i[s].cols[a];e.fill(t,o,c[0]);let f=r[s],p=0;for(let t=0;t<f.length;t++){let n=f[t];Ii(e,d,u,p,n,c[p]);let r=c[n],i=c[n+1],a=d[u+n];if(i-r>16)e.fill(a,r,i);else for(let t=r;t<i;t++)e[t]=a;p=n+1}Ii(e,d,u,p,l-1,c[p]),o=c[l-1],t=d[u+l-1]}e.fill(t,o,e.length)}function Ri(e,t,n,r,i){let a=0;for(let o=0;o<n.length;o++){let s=n[o],c=s.length;if(c===0)continue;let l=r[o].from,u=r[o].cols[i];e.fill(t,a,s[0]);for(let t=0;t<c-1;t++)e.fill(u[l+t],s[t],s[t+1]);a=s[c-1],t=u[l+c-1]}e.fill(t,a,e.length)}function zi(e,t,n,r,i){let a=n.length,o=null,s=0;for(let c=0;c<i.length;c++){let l=e[t+c],u=r;if(n[r]<l){let e=r,t=1;for(;e+t<a&&n[e+t]<l;)e+=t,t*=2;let i=Math.min(e+t,a-1);for(;i-e>1;){let t=e+i>>>1;n[t]<l?e=t:i=t}r=i}i[c]=r,c>0&&r!==u+1&&((o??=new Int32Array(i.length-1))[s++]=c-1)}return o?o.subarray(0,s):Ai}function Bi(e,t,n,r,i){let a=t.length;if(r){let t=e.pending[0],n=t.from+a,r=t.cols.map(e=>e instanceof Float64Array?e.subarray(t.from,n):e.slice(t.from,n));if(a>0)for(let i=0;i<r.length;i++)e.last[i]=t.cols[i][n-1];return e.pending=n<t.t.length?[{...t,from:n}]:[],r}let o=e.pending,s=[],c=[];if(a>0){let e=t[a-1],n=0;for(let r of o){let i=r.t,a=Mi(i,e,r.from,i.length),o=new Int32Array(a-r.from);if(c.push(zi(i,r.from,t,n,o)),o.length&&(n=o[o.length-1]),s.push(o),a<i.length)break}}let l=e.channels.map((r,l)=>{if(r.sparse&&n){let e=r.text?Array(a).fill(null):new Float64Array(a).fill(NaN);for(let n=0;n<s.length;n++){let r=s[n],{t:i,from:c}=o[n],u=o[n].cols[l];for(let n=0;n<r.length;n++){let o=r[n];o<a&&t[o]===i[c+n]&&(e[o]=u[c+n])}}return e}if(r.text){let t=Array(a);return Ri(t,e.last[l],s,o,l),t}let u;return i?(e.scratch[l]?.length>=a||(e.scratch[l]=new Float64Array(a)),u=e.scratch[l].subarray(0,a)):u=new Float64Array(a),Li(u,e.last[l],s,c,o,l),u}),u=[];for(let t=0;t<o.length;t++){let n=o[t],r=t<s.length?s[t].length:0;if(r>0)for(let t=0;t<e.channels.length;t++)e.last[t]=n.cols[t][n.from+r-1];n.from+r<n.t.length&&u.push(r?{...n,from:n.from+r}:n)}return e.pending=u,l}async function Vi(e,t,n,r,i,a=!1){let o=e.map((e,r)=>new Ni(e,t[r],n[r])),s=-1;e.forEach((t,n)=>{!t.irregular&&(s<0||t.samples>e[s].samples)&&(s=n)});let c=e.map((e,t)=>t===s||!!e.irregular),l=o.filter((e,t)=>c[t]),u=l.length===1,d=0;for(;;){i?.throwIfAborted();for(let e of l)for(;!e.done&&e.rows()===0;)await e.fill();if(l.every(e=>e.rows()===0))break;let e=1/0;for(let t of l)t.done||(e=Math.min(e,t.lastTime()));for(let t=0;t<o.length;t++)if(!c[t])for(;!o[t].done&&o[t].lastTime()<=e;)await o[t].fill();let t=Fi(l.map(e=>e.pending[0]??ji),e),n=[t];for(let e=0;e<o.length;e++)n.push(...Bi(o[e],t,c[e],u&&c[e],a));d+=t.length,t.length&&await r({length:t.length,columns:n})}return d}var Hi=class{#e;#t;#n;#r=0;constructor(e,t){let n=Math.max(1024,t);this.#e=e.map(e=>e.name),this.#t=e.map(()=>new Float64Array(n)),this.#n=e.map(()=>null)}append(e){let t=this.#r,n=t+e.length;if(n>this.#t[0].length){let e=Math.max(n,Math.ceil(this.#t[0].length*1.5));this.#t=this.#t.map(n=>{let r=new Float64Array(e);return r.set(n.subarray(0,t)),r})}e.columns.forEach((n,r)=>{let i=this.#t[r];if(n instanceof Float64Array){i.set(n.subarray(0,e.length),t);return}let a=this.#n[r];for(let o=0;o<e.length;o++){i[t+o]=NaN;let e=n[o];e!=null&&((a??=this.#n[r]=[])[t+o]=e)}}),this.#r=n}table(){let e=this.#r,t=this.#t.map(t=>t.length-e>t.length/100?t.slice(0,e):t.subarray(0,e));return{keys:this.#e,length:e,values:t,text:this.#n}}};async function Ui(e,t,n){return ee(await e.plan(t,n))}const Wi=(e,t,n)=>Math.max(0,Math.min(e,Math.max(1<<20,n),Math.floor(1e8/t)));function Gi(e,t){let n=t.flatMap(t=>t.channels.map(n=>({ch:e.groups[t.group].channels[n],group:e.groups[t.group].name}))),r=new Map;for(let{ch:e}of n)r.set(e.name.toLowerCase(),(r.get(e.name.toLowerCase())??0)+1);let i=Xt(n.map(({ch:e,group:n})=>t.length>1&&r.get(e.name.toLowerCase())>1?`${e.name} [${n}]`:e.name));return[{name:`Time`,unit:t.every(t=>e.groups[t.group].time.kind===`index`)?``:`s`,text:!1},...n.map(({ch:e},t)=>({name:i[t],unit:e.unit,text:!!e.text}))]}function Ki(e,t){let n=t.map(t=>e.groups[t.group]);if(n.some(e=>e.samples<0))return-1;let r=0,i=0;for(let e of n)e.irregular?i+=e.samples:r=Math.max(r,e.samples);return r+i}async function qi(e,t,n,r,i,a,o={}){let s=Gi(n,i),c=i.map(e=>n.groups[e.group]),l=i.map(e=>e.channels.map(t=>n.groups[e.group].channels[t])),u=[...n.events];async function*d(e){for await(let t of e)t.events&&u.push(...t.events),yield t}let f={files:t,plan:n,io:r,selection:i,signal:o.signal},p=e.streamGroup&&i.length>1&&!n.interleaved?i.map(t=>Di(d(e.streamGroup({...f,selection:[t]},t.group)))):Oi(d(e.stream(f)),new Map(i.map((e,t)=>[e.group,t]))),m=Ki(n,i),h=a===`memory`?new Hi(s,Wi(m,s.length,r.size)):null,g=0,_=await Vi(c,l,p,async e=>{h?h.append(e):await o.chunk(e);let t=Date.now();o.progress&&t-g>100&&(g=t,o.progress(Math.min(.99,r.bytesRead/Math.max(1,r.size))))},o.signal,!!h);return o.progress?.(1),u.sort((e,t)=>e.time-t.time),{columns:s,rows:_,table:h?.table(),events:u}}function Ji(e){let t=new Set,n=e.columns.map(e=>{if(!(e instanceof Float64Array))return e;let n=e.byteOffset===0&&e.byteLength===e.buffer.byteLength&&!t.has(e.buffer)?e:e.slice();return t.add(n.buffer),n});return[{length:e.length,columns:n},[...t]]}function Yi(e,t=wi){let r=null,i=null,a=null,o=null,s=2,c=null;return async l=>{if(l.type===`ack`){s++;let e=c;c=null,e?.();return}if(l.type===`warm`){Nn();return}let u=setInterval(()=>e({type:`alive`,work:a?.bytesRead??0}),1e3);try{if(l.type===`plan`){r=t(l.importer),i=l.files,a=new n(i.main),o=await Ui(r,i,a),e({type:`plan`,plan:{...o,state:void 0}});return}a.bytesRead=0;let u=await qi(r,i,o,a,l.selection,l.mode,{progress:t=>e({type:`progress`,fraction:t}),chunk:async t=>{for(;s===0;)await new Promise(e=>{c=e});s--;let[n,r]=Ji(t);e({type:`chunk`,chunk:n},r)}});e({type:`done`,result:u},u.table?ai(u.table):[])}catch(t){e({type:`error`,message:E(t).message})}finally{clearInterval(u)}}}const Xi=self;let Zi=null;jn(async()=>{if(!Zi)throw Error(`The import worker was not told where the HDF5 reader is.`);await import(Zi);let e=globalThis.__kymoscopeH5wasm;if(!e)throw Error(`HDF5 reader failed to load.`);let{FS:t}=await e.ready,n=0;return async r=>{let i=`/kymo${++n}`;t.mkdir(i),t.mount(t.filesystems.WORKERFS,{files:[r]},i);try{let n=new e.File(`${i}/${r.name}`,`r`);return{root:n,close:()=>{n.close(),t.unmount(i),t.rmdir(i)}}}catch(e){throw t.unmount(i),t.rmdir(i),e}}});const Qi=Yi((e,t)=>Xi.postMessage(e,t??[]));Xi.onmessage=e=>{e.data.type===`init`?Zi=e.data.h5Url:Qi(e.data)};
|