fitsjs-ng 1.0.0 → 1.0.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/header-verify.ts","../src/header.ts","../src/hdu.ts","../src/utils.ts","../src/data-unit.ts","../src/image-utils.ts","../src/image.ts","../src/types.ts","../src/tabular.ts","../src/table.ts","../src/binary-table.ts","../src/decompress.ts","../src/compressed-image.ts","../src/parser.ts","../src/fits.ts"],"names":["LINE_WIDTH","BLOCK_LENGTH","LINES_PER_BLOCK","DEFAULT_MAX_HEADER_LINES","NULL_VALUE","ZERO_VALUE","N_RANDOM","VERSION","FITSError","message","HeaderError","DataError","DecompressionError","verifyOrder","ctx","keyword","order","verifyBetween","value","lower","upper","verifyBoolean","VerifyFns","v","isArray","_ctx","bitpix","_isArray","index","tfields","Header","_Header","block","maxLines","onWarning","key","fallback","comment","naxis","i","naxisValues","length","a","b","nLinesRaw","nLines","line","indicator","rawValue","fullValue","valueStr","openQuote","closeQuote","pos","q","afterQuote","slashIdx","baseKey","match","HDU","header","data","swap8","swap16","swap32","swapEndian","textDecoder","uint8ArrayToString","arr","excessBytes","toBits","byte","DataUnit","getExtent","len","min","max","getPixel","x","y","width","Image","_Image","naxisCount","begin","info","buffer","bzero","bscale","bytes","nPixels","identity","view","needFloat","result","frame","frameInfo","arrayBuffer","startFrame","count","indices","_","BINARY_TYPE_BYTE_SIZES","TYPED_ARRAY_CONSTRUCTORS","Tabular","firstRow","lastRow","columns","row","number_","buf","offsetInCache","end","readRows","actualRows","name","colIndex","d","descriptor","accessor","elementByteOffset","TypedArrayCtor","column","rowsPerIteration","factor","iterations","chunkIndex","startRow","nRows","offset","r","ASCII_ACCESSORS","Table","pattern","form","fn","tbcol","_nRows","rows","accessors","subarray","j","start","fields","DATA_ACCESSORS","val","val1","val2","BinaryTable","type","heapOffset","bytesPerElement","heapSlice","Ctor","swapFn","newOffset","_view","_offset","dataAccessor","nBytes","bits","s","c","off","newOff","RiceSetup","array","lastpix","riceDecompress","blocksize","bytepix","pixels","nx","setup","setupFn","fsbits","fsmax","initialLastpix","initialPointer","pointer","bbits","nonzeroCount","nzero","k","idx","nbits","fs","imax","diff","generateRandomSequence","seed","random","temp","RANDOM_SEQUENCE","CompressedImage","ztile","paramIdx","tileSize","tileIndex","rowsRemaining","scale","zero","nTile","useDither","rIndex","seed1","seed1Initial","pixelIndex","_nFrame","heapBlob","createDataUnit","parseBuffer","options","hdus","totalLength","blockCount","headerStorage","headerFound","blockStart","blockBytes","newStorage","rowIndex","headerString","headerEnd","dataLength","dataSlice","dataunit","parseBlob","blob","headerChunks","blockBuffer","totalHeaderBytes","sum","chunk","dataBlob","FITS","_FITS","url","response","nodeBuffer","hdu"],"mappings":";AACO,IAAMA,EAAa,EAAA,CAGbC,CAAAA,CAAe,IAAA,CAGfC,EAAAA,CAAkB,GAGlBC,EAAAA,CAA2B,GAAA,CAG3BC,EAAAA,CAAa,WAAA,CAGbC,GAAa,WAAA,CAGbC,CAAAA,CAAW,IAGXC,EAAAA,CAAU,YCnBVC,CAAAA,CAAN,cAAwB,KAAM,CACnC,YAAYC,CAAAA,CAAiB,CAC3B,MAAMA,CAAO,CAAA,CACb,KAAK,IAAA,CAAO,YACd,CACF,CAAA,CAKaC,EAAN,cAA0BF,CAAU,CACzC,WAAA,CAAYC,CAAAA,CAAiB,CAC3B,KAAA,CAAMA,CAAO,CAAA,CACb,IAAA,CAAK,KAAO,cACd,CACF,CAAA,CAKaE,CAAAA,CAAN,cAAwBH,CAAU,CACvC,WAAA,CAAYC,CAAAA,CAAiB,CAC3B,KAAA,CAAMA,CAAO,EACb,IAAA,CAAK,IAAA,CAAO,YACd,CACF,CAAA,CAKaG,CAAAA,CAAN,cAAiCJ,CAAU,CAChD,WAAA,CAAYC,EAAiB,CAC3B,KAAA,CAAMA,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAO,qBACd,CACF,ECpBA,SAASI,EAAYC,CAAAA,CAAoBC,CAAAA,CAAiBC,EAAqB,CACzEA,CAAAA,GAAUF,CAAAA,CAAI,SAAA,EAChBA,EAAI,IAAA,CAAK,CAAA,EAAGC,CAAO,CAAA,wBAAA,EAA2BC,CAAK,CAAA,mBAAA,CAAqB,EAE5E,CAEA,SAASC,EAAcF,CAAAA,CAAiBG,CAAAA,CAAeC,EAAeC,CAAAA,CAAqB,CACzF,GAAIF,CAAAA,CAAQC,CAAAA,EAASD,CAAAA,CAAQE,CAAAA,CAC3B,MAAM,IAAIV,CAAAA,CAAY,OAAOK,CAAO,CAAA,UAAA,EAAaG,CAAK,CAAA,gBAAA,EAAmBC,CAAK,CAAA,KAAA,EAAQC,CAAK,EAAE,CAEjG,CAEA,SAASC,CAAAA,CAAcH,CAAAA,CAA2B,CAChD,OAAOA,CAAAA,GAAU,GACnB,CAMO,IAAMI,CAAAA,CAGT,CACF,MAAA,CAAOR,CAAAA,CAAKI,EAAO,CACjB,OAAAJ,CAAAA,CAAI,OAAA,CAAU,KACdD,CAAAA,CAAYC,CAAAA,CAAK,SAAU,CAAC,CAAA,CACrBO,EAAcH,CAAK,CAC5B,CAAA,CAEA,QAAA,CAASJ,EAAKI,CAAAA,CAAO,CACnB,OAAAJ,CAAAA,CAAI,SAAA,CAAY,KAChBA,CAAAA,CAAI,aAAA,CAAgBI,CAAAA,CACpBL,CAAAA,CAAYC,EAAK,UAAA,CAAY,CAAC,EACvBA,CAAAA,CAAI,aACb,EAEA,MAAA,CAAOA,CAAAA,CAAKI,CAAAA,CAAO,CACjB,IAAMK,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAOL,CAAK,EAAG,EAAE,CAAA,CAEpC,GADAL,CAAAA,CAAYC,EAAK,QAAA,CAAU,CAAC,EACxB,CAAC,CAAC,EAAG,EAAA,CAAI,EAAA,CAAI,GAAA,CAAK,GAAG,EAAE,QAAA,CAASS,CAAC,EACnC,MAAM,IAAIb,EAAY,CAAA,aAAA,EAAgBa,CAAC,CAAA,iBAAA,CAAmB,CAAA,CAE5D,OAAOA,CACT,CAAA,CAEA,MAAMT,CAAAA,CAAKI,CAAAA,CAAOM,EAAS,CACzB,IAAMD,CAAAA,CAAI,QAAA,CAAS,OAAOL,CAAK,CAAA,CAAG,EAAE,CAAA,CACpC,GAAI,CAACM,CAAAA,GACHX,CAAAA,CAAYC,CAAAA,CAAK,QAAS,CAAC,CAAA,CAC3BG,EAAc,OAAA,CAASM,CAAAA,CAAG,EAAG,GAAG,CAAA,CAC5BT,CAAAA,CAAI,WAAA,KACFA,CAAAA,CAAI,aAAA,GAAkB,SAAWA,CAAAA,CAAI,aAAA,GAAkB,aACrDS,CAAAA,GAAM,CAAA,CAAA,CACR,MAAM,IAAIb,EAAY,mDAAmD,CAAA,CAKjF,OAAOa,CACT,CAAA,CAEA,OAAOT,CAAAA,CAAKI,CAAAA,CAAO,CACjB,IAAMK,EAAI,QAAA,CAAS,MAAA,CAAOL,CAAK,CAAA,CAAG,EAAE,CAAA,CAE9BF,CAAAA,CAAQ,CAAA,CADAF,CAAAA,CAAI,IAAI,OAAO,CAAA,CAG7B,GADAD,CAAAA,CAAYC,CAAAA,CAAK,SAAUE,CAAK,CAAA,CAC5BF,CAAAA,CAAI,WAAA,KACFA,CAAAA,CAAI,aAAA,GAAkB,SAAWA,CAAAA,CAAI,aAAA,GAAkB,UACrDS,CAAAA,GAAM,CAAA,CACR,MAAM,IAAIb,EAAY,CAAA,yBAAA,EAA4BI,CAAAA,CAAI,aAAa,CAAA,WAAA,CAAa,CAAA,CAItF,OAAOS,CACT,CAAA,CAEA,MAAA,CAAOT,CAAAA,CAAKI,EAAO,CACjB,IAAMK,CAAAA,CAAI,QAAA,CAAS,OAAOL,CAAK,CAAA,CAAG,EAAE,CAAA,CAE9BF,EAAQ,CAAA,CADAF,CAAAA,CAAI,IAAI,OAAO,CAAA,CACK,EAElC,GADAD,CAAAA,CAAYC,CAAAA,CAAK,QAAA,CAAUE,CAAK,CAAA,CAC5BF,CAAAA,CAAI,aAAY,GAEhBA,CAAAA,CAAI,gBAAkB,OAAA,EACtBA,CAAAA,CAAI,aAAA,GAAkB,OAAA,EACtBA,EAAI,aAAA,GAAkB,UAAA,CAAA,EAElBS,IAAM,CAAA,CACR,MAAM,IAAIb,CAAAA,CAAY,CAAA,yBAAA,EAA4BI,CAAAA,CAAI,aAAa,aAAa,CAAA,CAItF,OAAOS,CACT,CAAA,CAEA,OAAOT,CAAAA,CAAKI,CAAAA,CAAO,CACjB,GAAI,CAACJ,CAAAA,CAAI,SAAA,GACP,MAAM,IAAIJ,EAAY,+CAA+C,CAAA,CAEvE,OAAOW,CAAAA,CAAcH,CAAK,CAC5B,CAAA,CAEA,OAAOO,CAAAA,CAAMP,CAAAA,CAAO,CAClB,OAAO,UAAA,CAAW,MAAA,CAAOA,CAAK,CAAC,CACjC,CAAA,CAEA,MAAMO,CAAAA,CAAMP,CAAAA,CAAO,CACjB,OAAO,UAAA,CAAW,MAAA,CAAOA,CAAK,CAAC,CACjC,CAAA,CAEA,KAAA,CAAMJ,CAAAA,CAAKI,EAAO,CAChB,IAAMQ,CAAAA,CAASZ,CAAAA,CAAI,IAAI,QAAQ,CAAA,CAC/B,OAAIY,CAAAA,EAAU,CAAA,EACZZ,EAAI,IAAA,CAAK,CAAA,qCAAA,EAAwCY,CAAM,CAAA,CAAE,EAEpD,QAAA,CAAS,MAAA,CAAOR,CAAK,CAAA,CAAG,EAAE,CACnC,CAAA,CAEA,OAAA,CAAQO,CAAAA,CAAMP,CAAAA,CAAO,CACnB,OAAO,UAAA,CAAW,OAAOA,CAAK,CAAC,CACjC,CAAA,CAEA,OAAA,CAAQO,CAAAA,CAAMP,CAAAA,CAAO,CACnB,OAAO,UAAA,CAAW,MAAA,CAAOA,CAAK,CAAC,CACjC,CAAA,CAEA,MAAA,CAAOO,CAAAA,CAAMP,EAAO,CAClB,OAAO,SAAS,MAAA,CAAOA,CAAK,EAAG,EAAE,CACnC,CAAA,CAEA,QAAA,CAASO,EAAMP,CAAAA,CAAO,CACpB,OAAO,QAAA,CAAS,MAAA,CAAOA,CAAK,CAAA,CAAG,EAAE,CACnC,CAAA,CAEA,QAAQO,CAAAA,CAAMP,CAAAA,CAAO,CACnB,IAAMK,CAAAA,CAAI,SAAS,MAAA,CAAOL,CAAK,CAAA,CAAG,EAAE,EACpC,OAAAD,CAAAA,CAAc,SAAA,CAAWM,CAAAA,CAAG,EAAG,GAAG,CAAA,CAC3BA,CACT,CAAA,CAEA,MAAMT,CAAAA,CAAKI,CAAAA,CAAOS,EAAUC,CAAAA,CAAO,CACjC,IAAMC,CAAAA,CAAUf,CAAAA,CAAI,GAAA,CAAI,SAAS,EACjC,OAAIc,CAAAA,GAAU,QACZX,CAAAA,CAAc,OAAA,CAAS,SAASW,CAAAA,CAAO,EAAE,CAAA,CAAG,CAAA,CAAGC,CAAO,CAAA,CAEjDX,CACT,EAEA,MAAA,CAAOO,CAAAA,CAAMP,EAAO,CAClB,OAAOG,CAAAA,CAAcH,CAAK,CAC5B,CAAA,CAEA,QAAA,CAASO,CAAAA,CAAMP,CAAAA,CAAO,CACpB,IAAMK,CAAAA,CAAI,MAAA,CAAOL,CAAK,EACtB,GAAI,CAAC,CAAC,QAAA,CAAU,QAAA,CAAU,SAAU,aAAa,CAAA,CAAE,QAAA,CAASK,CAAC,EAC3D,MAAM,IAAIb,EAAY,CAAA,eAAA,EAAkBa,CAAC,mBAAmB,CAAA,CAE9D,GAAI,CAAC,CAAC,QAAQ,CAAA,CAAE,QAAA,CAASA,CAAC,CAAA,CACxB,MAAM,IAAIb,CAAAA,CAAY,CAAA,cAAA,EAAiBa,CAAC,CAAA,uBAAA,CAAyB,EAEnE,OAAOA,CACT,CAAA,CAEA,OAAA,CAAQE,EAAMP,CAAAA,CAAO,CACnB,IAAMK,CAAAA,CAAI,SAAS,MAAA,CAAOL,CAAK,EAAG,EAAE,CAAA,CACpC,GAAI,CAAC,CAAC,CAAA,CAAG,EAAA,CAAI,GAAI,EAAA,CAAI,GAAA,CAAK,GAAG,CAAA,CAAE,QAAA,CAASK,CAAC,CAAA,CACvC,MAAM,IAAIb,CAAAA,CAAY,iBAAiBa,CAAC,CAAA,iBAAA,CAAmB,EAE7D,OAAOA,CACT,EAEA,MAAA,CAAOE,CAAAA,CAAMP,CAAAA,CAAOM,CAAAA,CAAS,CAC3B,IAAMD,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAOL,CAAK,CAAA,CAAG,EAAE,CAAA,CACpC,OAAKM,GACHP,CAAAA,CAAc,QAAA,CAAUM,EAAG,CAAA,CAAG,GAAG,EAE5BA,CACT,CAAA,CAEA,KAAA,CAAME,CAAAA,CAAMP,EAAO,CACjB,OAAO,SAAS,MAAA,CAAOA,CAAK,EAAG,EAAE,CACnC,CAAA,CAEA,OAAA,CAAQO,EAAMP,CAAAA,CAAO,CACnB,OAAOA,CAAAA,GAAU,GACnB,EAEA,OAAA,CAAQO,CAAAA,CAAMP,CAAAA,CAAO,CACnB,OAAO,QAAA,CAAS,MAAA,CAAOA,CAAK,CAAA,CAAG,EAAE,CACnC,CAAA,CAEA,OAAA,CAAQO,CAAAA,CAAMP,CAAAA,CAAO,CACnB,OAAO,QAAA,CAAS,OAAOA,CAAK,CAAA,CAAG,EAAE,CACnC,CAAA,CAEA,QAAA,CAASO,CAAAA,CAAMP,EAAO,CACpB,OAAO,SAAS,MAAA,CAAOA,CAAK,EAAG,EAAE,CACnC,CACF,CAAA,KC9MaY,CAAAA,CAAN,MAAMC,CAAgC,CAC3C,OAAwB,cAAgB,YAAA,CAGxC,OAAA,CAAU,KAAA,CAEV,SAAA,CAAY,MAEZ,aAAA,CAGQ,KAAA,CAAiC,IAAI,GAAA,CAErC,SAAqB,EAAC,CAEtB,OAAA,CAAoB,GAE5B,SAAA,CAAY,CAAA,CAGZ,KAGQ,QAAA,CAGC,KAAA,CAET,YACEC,CAAAA,CACAC,CAAAA,CAAmB,GAAA,CACnBC,CAAAA,CACA,CACA,IAAA,CAAK,QAAA,CAAWD,EAChB,IAAA,CAAK,IAAA,CAAOC,GAAa,OAAA,CAAQ,IAAA,CACjC,IAAA,CAAK,KAAA,CAAQF,EACb,IAAA,CAAK,SAAA,CAAUA,CAAK,EACtB,CAMA,IAAIG,CAAAA,CAAwB,CAC1B,OAAI,IAAA,CAAK,SAASA,CAAG,CAAA,CACZ,IAAA,CAAK,KAAA,CAAM,IAAIA,CAAG,CAAA,CAAG,KAAA,CAEvB,IACT,CAOA,SAAA,CAAUA,CAAAA,CAAaC,EAA2B,CAChD,IAAMlB,EAAQ,IAAA,CAAK,GAAA,CAAIiB,CAAG,CAAA,CAC1B,GAAIjB,CAAAA,GAAU,IAAA,CAAM,OAAOkB,CAAAA,EAAY,CAAA,CACvC,GAAI,OAAOlB,CAAAA,EAAU,QAAA,CAAU,OAAOA,EACtC,MAAM,IAAIR,EAAY,CAAA,4BAAA,EAA+ByB,CAAG,SAAS,OAAOjB,CAAK,CAAA,CAAE,CACjF,CAOA,SAAA,CAAUiB,CAAAA,CAAaC,CAAAA,CAA2B,CAChD,IAAMlB,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIiB,CAAG,EAC1B,GAAIjB,CAAAA,GAAU,KAAM,OAAOkB,CAAAA,EAAY,GACvC,GAAI,OAAOlB,CAAAA,EAAU,QAAA,CAAU,OAAOA,CAAAA,CACtC,MAAM,IAAIR,CAAAA,CAAY,CAAA,4BAAA,EAA+ByB,CAAG,CAAA,MAAA,EAAS,OAAOjB,CAAK,CAAA,CAAE,CACjF,CAOA,UAAA,CAAWiB,EAAaC,CAAAA,CAA6B,CACnD,IAAMlB,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIiB,CAAG,EAC1B,GAAIjB,CAAAA,GAAU,IAAA,CAAM,OAAOkB,GAAY,KAAA,CACvC,GAAI,OAAOlB,CAAAA,EAAU,UAAW,OAAOA,CAAAA,CACvC,MAAM,IAAIR,CAAAA,CAAY,gCAAgCyB,CAAG,CAAA,MAAA,EAAS,OAAOjB,CAAK,EAAE,CAClF,CAKA,IAAIiB,CAAAA,CAAajB,CAAAA,CAAkBmB,EAAkB,EAAA,CAAU,CAC7D,IAAA,CAAK,KAAA,CAAM,IAAIF,CAAAA,CAAK,CAClB,MAAO,IAAA,CAAK,SAAA,CACZ,MAAAjB,CAAAA,CACA,OAAA,CAAAmB,CACF,CAAC,EACD,IAAA,CAAK,SAAA,EAAa,EACpB,CAKA,SAASF,CAAAA,CAAsB,CAC7B,OAAO,IAAA,CAAK,MAAM,GAAA,CAAIA,CAAG,CAC3B,CAKA,WAAA,EAAwB,CACtB,OAAO,IAAA,CAAK,QACd,CAKA,YAAuB,CACrB,OAAO,KAAK,OACd,CAKA,MAAiB,CACf,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,CACrC,CAKA,aAAuB,CACrB,IAAMG,CAAAA,CAAQ,IAAA,CAAK,UAAU,OAAO,CAAA,CACpC,GAAIA,CAAAA,GAAU,EAAG,OAAO,MAAA,CACxB,IAAA,IAASC,CAAAA,CAAI,EAAGA,CAAAA,EAAKD,CAAAA,CAAOC,IAC1B,GAAI,IAAA,CAAK,UAAU,CAAA,KAAA,EAAQA,CAAC,CAAA,CAAE,CAAA,GAAM,EAAG,OAAO,KAAA,CAEhD,OAAO,MACT,CAKA,eAAwB,CACtB,GAAI,CAAC,IAAA,CAAK,aAAY,CACpB,SAGF,IAAMD,CAAAA,CAAQ,KAAK,SAAA,CAAU,OAAO,CAAA,CAC9BE,CAAAA,CAAwB,EAAC,CAC/B,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,GAAKF,CAAAA,CAAO,CAAA,EAAA,CAC1BE,CAAAA,CAAY,IAAA,CAAK,KAAK,SAAA,CAAU,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAC,EAG9C,IAAMd,CAAAA,CAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAClCe,CAAAA,CAAUD,EAAY,MAAA,CAAO,CAACE,EAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAAA,CAAG,CAAC,EAAI,IAAA,CAAK,GAAA,CAAIjB,CAAM,CAAA,CAAK,CAAA,CAC3E,OAAAe,CAAAA,EAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,EAE1BA,CACT,CAKA,aAAmC,CACjC,OAAQ,KAAK,aAAA,EACX,KAAK,UAAA,CACH,OAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAU,iBAAA,CAC7B,cACT,KAAK,OAAA,CACH,OAAO,OAAA,CACT,KAAK,OAAA,CACH,OAAI,KAAK,WAAA,EAAY,CAAU,QACxB,IAAA,CACT,QACE,OAAI,IAAA,CAAK,aAAY,CAAU,OAAA,CACxB,IACX,CACF,CAGA,WAAqB,CACnB,OAAO,IAAA,CAAK,OACd,CAGA,WAAA,EAAuB,CACrB,OAAO,IAAA,CAAK,SACd,CAIQ,SAAA,CAAUT,CAAAA,CAAqB,CAErC,IAAMY,CAAAA,CAAYZ,CAAAA,CAAM,OAAS,EAAA,CAC3Ba,CAAAA,CAAS,KAAK,GAAA,CAAID,CAAAA,CAAW,IAAA,CAAK,QAAQ,EAEhD,IAAA,IAAS,CAAA,CAAI,EAAG,CAAA,CAAIC,CAAAA,CAAQ,IAAK,CAC/B,IAAMC,CAAAA,CAAOd,CAAAA,CAAM,MAAM,CAAA,CAAI,EAAA,CAAA,CAAY,EAAI,CAAA,EAAK,EAAS,EAC3D,IAAA,CAAK,QAAA,CAASc,CAAI,EACpB,CACF,CAEQ,QAAA,CAASA,CAAAA,CAAoB,CAEnC,IAAMX,CAAAA,CAAMW,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAE,IAAA,GAC7B,GAAIX,CAAAA,GAAQ,GAAI,OAGhB,IAAMY,CAAAA,CAAYD,CAAAA,CAAK,MAAM,CAAA,CAAG,EAAE,EAC5BE,CAAAA,CAAWF,CAAAA,CAAK,MAAM,EAAE,CAAA,CAG9B,GAAIC,CAAAA,GAAc,KAAM,CAGtB,IAAME,EAAYH,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,CACjCX,CAAAA,GAAQ,UACV,IAAA,CAAK,QAAA,CAAS,IAAA,CAAKc,CAAS,EACnBd,CAAAA,GAAQ,SAAA,EACjB,IAAA,CAAK,OAAA,CAAQ,KAAKc,CAAS,CAAA,CAE7B,MACF,CAIA,IAAIC,EACAb,CAAAA,CACJ,GAAIW,CAAAA,CAAS,SAAA,GAAY,UAAA,CAAW,GAAG,EAAG,CAExC,IAAMG,EAAYH,CAAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,CAClCI,EAAa,EAAA,CACbC,CAAAA,CAAMF,EAAY,CAAA,CACtB,KAAOE,EAAML,CAAAA,CAAS,MAAA,EAAQ,CAC5B,IAAMM,EAAIN,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAKK,CAAG,EACnC,GAAIC,CAAAA,GAAM,EAAA,CAAI,MAEd,GAAIA,CAAAA,CAAI,CAAA,CAAIN,EAAS,MAAA,EAAUA,CAAAA,CAASM,EAAI,CAAC,CAAA,GAAM,GAAA,CAAK,CACtDD,EAAMC,CAAAA,CAAI,CAAA,CACV,QACF,CACAF,CAAAA,CAAaE,EACb,KACF,CACA,GAAIF,CAAAA,GAAe,GAAI,CACrB,IAAMG,EAAaP,CAAAA,CAAS,KAAA,CAAMI,EAAa,CAAC,CAAA,CAC1CI,CAAAA,CAAWD,CAAAA,CAAW,QAAQ,IAAI,CAAA,CACpCC,CAAAA,GAAa,EAAA,EACfN,EAAWF,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAGI,CAAAA,CAAa,CAAC,CAAA,CAAE,IAAA,GAC7Cf,CAAAA,CAAUkB,CAAAA,CAAW,MAAMC,CAAAA,CAAW,CAAC,CAAA,CAAE,IAAA,KAEzCN,CAAAA,CAAWF,CAAAA,CAAS,MAAM,CAAA,CAAGI,CAAAA,CAAa,CAAC,CAAA,CAAE,IAAA,EAAK,CAClDf,CAAAA,CAAU,IAEd,CAAA,KACEa,CAAAA,CAAWF,EAAS,IAAA,EAAK,CACzBX,EAAU,GAEd,CAAA,KAAO,CACL,IAAMmB,EAAWR,CAAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,CAClCQ,IAAa,EAAA,EACfN,CAAAA,CAAWF,CAAAA,CAAS,KAAA,CAAM,EAAGQ,CAAQ,CAAA,CAAE,MAAK,CAC5CnB,CAAAA,CAAUW,EAAS,KAAA,CAAMQ,CAAAA,CAAW,CAAC,CAAA,CAAE,MAAK,GAE5CN,CAAAA,CAAWF,EAAS,IAAA,EAAK,CACzBX,EAAU,EAAA,EAEd,CAGA,IAAInB,CAAAA,CACAgC,EAAS,UAAA,CAAW,GAAG,EAEzBhC,CAAAA,CAAQgC,CAAAA,CAAS,MAAM,CAAA,CAAG,EAAE,CAAA,CAAE,UAAA,CAAW,KAAM,GAAG,CAAA,CAAE,IAAA,EAAK,CAChDA,IAAa,GAAA,EAAOA,CAAAA,GAAa,GAAA,CAE1ChC,CAAAA,CAAQgC,EAGRhC,CAAAA,CAAQ,UAAA,CAAWgC,CAAQ,CAAA,CAI7BhC,CAAAA,CAAQ,KAAK,QAAA,CAASiB,CAAAA,CAAKjB,CAAK,CAAA,CAEhC,KAAK,GAAA,CAAIiB,CAAAA,CAAKjB,EAAOmB,CAAO,EAC9B,CAEQ,QAAA,CAASF,CAAAA,CAAajB,CAAAA,CAA6B,CACzD,IAAIuC,CAAAA,CAAUtB,CAAAA,CACVX,EAAU,KAAA,CACVI,CAAAA,CAEE8B,EAAQ3B,CAAAA,CAAO,aAAA,CAAc,IAAA,CAAKI,CAAG,EAC3C,OAAIuB,CAAAA,GACFlC,EAAU,IAAA,CACViC,CAAAA,CAAUC,EAAM,CAAC,CAAA,CACjB9B,CAAAA,CAAQ8B,CAAAA,CAAM,CAAC,CAAA,CAAA,CAGbD,CAAAA,IAAWnC,IACbJ,CAAAA,CAAQI,CAAAA,CAAUmC,CAAO,CAAA,CAAG,IAAA,CAAMvC,CAAAA,CAAOM,CAAAA,CAASI,CAAK,CAAA,CAAA,CAGlDV,CACT,CACF,ECnTO,IAAMyC,EAAN,KAAU,CACN,MAAA,CACA,IAAA,CAET,YAAYC,CAAAA,CAAgBC,CAAAA,CAAiB,CAC3C,IAAA,CAAK,MAAA,CAASD,EACd,IAAA,CAAK,IAAA,CAAOC,EACd,CAKA,SAAmB,CACjB,OAAO,IAAA,CAAK,IAAA,GAAS,MACvB,CACF,ECjBA,IAAMC,EAAAA,CAAS5C,GAA0BA,CAAAA,CAEnC6C,EAAAA,CAAU7C,IAA4BA,CAAAA,CAAQ,GAAA,GAAS,EAAOA,CAAAA,EAAS,CAAA,CAAK,GAAA,CAE5E8C,EAAAA,CAAU9C,IACZA,CAAAA,CAAQ,GAAA,GAAS,IACjBA,CAAAA,CAAQ,KAAA,GAAW,EACnBA,CAAAA,EAAS,CAAA,CAAK,KAAA,CACdA,CAAAA,EAAS,GAAM,GAAA,CAEN+C,CAAAA,CAAa,CACxB,CAAA,CAAGH,EAAAA,CACH,EAAGA,EAAAA,CACH,EAAA,CAAIC,EAAAA,CACJ,CAAA,CAAGA,GACH,EAAA,CAAIC,EAAAA,CACJ,CAAA,CAAGA,EACL,EAGME,EAAAA,CAAc,IAAI,WAAA,CAAY,OAAO,EAKpC,SAASC,CAAAA,CAAmBC,EAAyB,CAC1D,OAAOF,GAAY,MAAA,CAAOE,CAAG,CAC/B,CAKO,SAASC,CAAAA,CAAY5B,CAAAA,CAAwB,CAClD,OAAA,CAAQ,IAAA,CAAgBA,EAAS,IAAA,EAAiB,IACpD,CAKO,SAAS6B,GAAOC,CAAAA,CAAwB,CAC7C,IAAMH,CAAAA,CAAgB,GAClB7B,CAAAA,CAAI,GAAA,CACR,KAAOA,CAAAA,EAAK,GACV6B,CAAAA,CAAI,IAAA,CAAKG,CAAAA,CAAOhC,CAAAA,CAAI,EAAI,CAAC,CAAA,CACzBA,CAAAA,GAAM,CAAA,CAER,OAAO6B,CACT,KC9CaI,CAAAA,CAAN,KAAe,CAEpB,MAAA,CAEA,IAAA,CAGA,OAAgB,UAAA,CAAaP,EAE7B,WAAA,CAAYJ,CAAAA,CAA0B,CAChCA,CAAAA,YAAgB,WAAA,CAClB,KAAK,MAAA,CAASA,CAAAA,CACL,OAAO,IAAA,CAAS,KAAeA,CAAAA,YAAgB,IAAA,GACxD,KAAK,IAAA,CAAOA,CAAAA,EAEhB,CACF,EChBO,SAASY,CAAAA,CAAUL,CAAAA,CAAkD,CAC1E,IAAMM,CAAAA,CAAMN,CAAAA,CAAI,MAAA,CACZO,EACAC,CAAAA,CACArC,CAAAA,CAAI,CAAA,CAGR,KAAOA,EAAImC,CAAAA,CAAKnC,CAAAA,EAAAA,CAAK,CACnB,IAAMrB,CAAAA,CAAQkD,EAAI7B,CAAC,CAAA,CACnB,GAAI,CAAC,MAAMrB,CAAK,CAAA,CAAG,CACjByD,CAAAA,CAAMC,CAAAA,CAAM1D,EACZqB,CAAAA,EAAAA,CACA,KACF,CACF,CAEA,GAAIoC,CAAAA,GAAQ,MAAA,EAAaC,IAAQ,MAAA,CAC/B,OAAO,CAAC,GAAA,CAAK,GAAG,CAAA,CAIlB,KAAOrC,EAAImC,CAAAA,CAAKnC,CAAAA,EAAAA,CAAK,CACnB,IAAMrB,EAAQkD,CAAAA,CAAI7B,CAAC,CAAA,CACf,KAAA,CAAMrB,CAAK,CAAA,GACXA,CAAAA,CAAQyD,EAAKA,CAAAA,CAAMzD,CAAAA,CACdA,EAAQ0D,CAAAA,GAAKA,CAAAA,CAAM1D,CAAAA,CAAAA,EAC9B,CAEA,OAAO,CAACyD,CAAAA,CAAKC,CAAG,CAClB,CAKO,SAASC,CAAAA,CACdT,CAAAA,CACAU,CAAAA,CACAC,CAAAA,CACAC,EACQ,CACR,IAAMpD,EAAQmD,CAAAA,CAAIC,CAAAA,CAAQF,EAC1B,OAAIlD,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,EAASwC,EAAI,MAAA,CACrB,GAAA,CAEFA,CAAAA,CAAIxC,CAAK,CAClB,CCtCO,IAAMqD,CAAAA,CAAN,MAAMC,UAAcV,CAAS,CACzB,OACA,KAAA,CACA,KAAA,CACA,OACA,KAAA,CACA,KAAA,CACA,MAAA,CACA,KAAA,CACA,OACA,WAAA,CACA,YAAA,CAET,YAAYZ,CAAAA,CAAgBC,CAAAA,CAA0B,CACpD,KAAA,CAAMA,CAAI,CAAA,CAEV,IAAMsB,EAAavB,CAAAA,CAAO,SAAA,CAAU,OAAO,CAAA,CAC3C,IAAA,CAAK,OAASA,CAAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAEvC,KAAK,KAAA,CAAQ,EAAC,CACd,IAAA,IAASrB,EAAI,CAAA,CAAGA,CAAAA,EAAK4C,CAAAA,CAAY5C,CAAAA,EAAAA,CAC/B,KAAK,KAAA,CAAM,IAAA,CAAKqB,EAAO,SAAA,CAAU,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,CAAC,CAAA,CAG/C,IAAA,CAAK,MAAQqB,CAAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CACtC,IAAA,CAAK,OAASA,CAAAA,CAAO,SAAA,CAAU,QAAA,CAAU,CAAC,EAC1C,IAAA,CAAK,KAAA,CAAQA,EAAO,SAAA,CAAU,QAAA,CAAU,CAAC,CAAA,CACzC,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAAO,UAAU,OAAO,CAAA,CACrC,IAAA,CAAK,MAAA,CAASA,EAAO,SAAA,CAAU,QAAA,CAAU,CAAC,CAAA,CAC1C,KAAK,KAAA,CAAQ,IAAA,CAAK,IAAI,IAAA,CAAK,MAAM,EAAI,CAAA,CACrC,IAAA,CAAK,MAAA,CAAU,IAAA,CAAK,MAAM,MAAA,CAAO,CAAClB,EAAGC,CAAAA,GAAMD,CAAAA,CAAIC,EAAG,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAK,MAAM,CAAA,CAAK,EAEhF,IAAA,CAAK,YAAA,CAAe,EAAC,CACrB,IAAA,CAAK,WAAA,CAAc,IAAA,CAAK,MAAQ,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,MAAA,CAElD,QAASJ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,MAAOA,CAAAA,EAAAA,CAAK,CACnC,IAAM6C,CAAAA,CAAQ7C,CAAAA,CAAI,KAAK,WAAA,CACjB8C,CAAAA,CAAoB,CAAE,KAAA,CAAAD,CAAM,CAAA,CAC9B,IAAA,CAAK,SACPC,CAAAA,CAAK,OAAA,CAAU,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAMD,CAAAA,CAAOA,EAAQ,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,CAEpE,IAAA,CAAK,aAAa,IAAA,CAAKC,CAAI,EAC7B,CACF,CAKA,OAAO,YAAA,CACLC,CAAAA,CACA5D,CAAAA,CACA6D,EACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAQ,KAAK,GAAA,CAAI/D,CAAM,EAAI,CAAA,CAC3BgE,CAAAA,CAAUJ,EAAO,UAAA,CAAaG,CAAAA,CAC9BE,CAAAA,CAAWJ,CAAAA,GAAU,GAAKC,CAAAA,GAAW,CAAA,CACrCI,EAAO,IAAI,QAAA,CAASN,CAAM,CAAA,CAC1BO,CAAAA,CAAY,EAAE,MAAA,CAAO,UAAUN,CAAK,CAAA,EAAK,OAAO,SAAA,CAAUC,CAAM,GAEtE,GAAI9D,CAAAA,GAAW,CAAA,CAAG,CAChB,GAAIiE,CAAAA,CAAU,OAAO,IAAI,UAAA,CAAWL,EAAO,KAAA,CAAM,CAAC,CAAC,CAAA,CACnD,IAAMQ,CAAAA,CAASD,CAAAA,CAAY,IAAI,YAAA,CAAaH,CAAO,EAAI,IAAI,UAAA,CAAWA,CAAO,CAAA,CAC7E,QAASnD,CAAAA,CAAI,CAAA,CAAGA,EAAImD,CAAAA,CAASnD,CAAAA,EAAAA,CAC3BuD,EAAOvD,CAAC,CAAA,CAAIgD,CAAAA,CAAQC,CAAAA,CAASI,EAAK,QAAA,CAASrD,CAAC,EAE9C,OAAOuD,CACT,CAEA,GAAIpE,CAAAA,GAAW,EAAA,CAAI,CACjB,GAAIiE,CAAAA,CAAU,CACZ,IAAMG,CAAAA,CAAS,IAAI,UAAA,CAAWJ,CAAO,CAAA,CACrC,IAAA,IAASnD,EAAI,CAAA,CAAGA,CAAAA,CAAImD,EAASnD,CAAAA,EAAAA,CAAKuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIqD,CAAAA,CAAK,QAAA,CAASrD,CAAAA,CAAI,EAAG,KAAK,CAAA,CACxE,OAAOuD,CACT,CACA,IAAMA,CAAAA,CAASD,CAAAA,CAAY,IAAI,YAAA,CAAaH,CAAO,CAAA,CAAI,IAAI,WAAWA,CAAO,CAAA,CAC7E,QAASnD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAImD,CAAAA,CAASnD,IAC3BuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIgD,CAAAA,CAAQC,EAASI,CAAAA,CAAK,QAAA,CAASrD,CAAAA,CAAI,CAAA,CAAG,KAAK,CAAA,CAEzD,OAAOuD,CACT,CAEA,GAAIpE,IAAW,EAAA,CAAI,CACjB,GAAIiE,CAAAA,CAAU,CACZ,IAAMG,CAAAA,CAAS,IAAI,UAAA,CAAWJ,CAAO,EACrC,IAAA,IAASnD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAImD,EAASnD,CAAAA,EAAAA,CAAKuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIqD,CAAAA,CAAK,SAASrD,CAAAA,CAAI,CAAA,CAAG,KAAK,CAAA,CACxE,OAAOuD,CACT,CACA,IAAMA,CAAAA,CAAS,IAAI,YAAA,CAAaJ,CAAO,CAAA,CACvC,IAAA,IAASnD,EAAI,CAAA,CAAGA,CAAAA,CAAImD,EAASnD,CAAAA,EAAAA,CAC3BuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIgD,CAAAA,CAAQC,CAAAA,CAASI,CAAAA,CAAK,SAASrD,CAAAA,CAAI,CAAA,CAAG,KAAK,CAAA,CAEzD,OAAOuD,CACT,CAEA,GAAIpE,CAAAA,GAAW,GAAA,CAAK,CAClB,IAAMoE,CAAAA,CAAS,IAAI,YAAA,CAAaJ,CAAO,EACvC,GAAIC,CAAAA,CACF,IAAA,IAASpD,CAAAA,CAAI,EAAGA,CAAAA,CAAImD,CAAAA,CAASnD,CAAAA,EAAAA,CAAKuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIqD,CAAAA,CAAK,UAAA,CAAWrD,CAAAA,CAAI,EAAG,KAAK,CAAA,CAAA,aAEjEA,CAAAA,CAAI,CAAA,CAAGA,EAAImD,CAAAA,CAASnD,CAAAA,EAAAA,CAC3BuD,CAAAA,CAAOvD,CAAC,EAAIgD,CAAAA,CAAQC,CAAAA,CAASI,EAAK,UAAA,CAAWrD,CAAAA,CAAI,EAAG,KAAK,CAAA,CAG7D,OAAOuD,CACT,CAGA,IAAMA,CAAAA,CAAS,IAAI,YAAA,CAAaJ,CAAO,EACvC,GAAIC,CAAAA,CACF,IAAA,IAASpD,CAAAA,CAAI,EAAGA,CAAAA,CAAImD,CAAAA,CAASnD,IAAKuD,CAAAA,CAAOvD,CAAC,EAAIqD,CAAAA,CAAK,UAAA,CAAWrD,CAAAA,CAAI,CAAA,CAAG,KAAK,CAAA,CAAA,KAE1E,IAAA,IAASA,EAAI,CAAA,CAAGA,CAAAA,CAAImD,EAASnD,CAAAA,EAAAA,CAC3BuD,CAAAA,CAAOvD,CAAC,CAAA,CAAIgD,EAAQC,CAAAA,CAASI,CAAAA,CAAK,WAAWrD,CAAAA,CAAI,CAAA,CAAG,KAAK,CAAA,CAG7D,OAAOuD,CACT,CAQA,MAAM,QAAA,CAASC,CAAAA,CAAgB,EAAwB,CACrD,IAAMC,EAAY,IAAA,CAAK,YAAA,CAAaD,CAAK,CAAA,CAEzC,GAAIC,CAAAA,CAAU,OAAA,EAAWA,CAAAA,CAAU,OAAA,CAAQ,OAAS,CAAA,CAClD,OAAOd,CAAAA,CAAM,YAAA,CAAac,EAAU,OAAA,CAAQ,CAAC,EAAI,IAAA,CAAK,MAAA,CAAQ,KAAK,KAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAIvF,GAAI,CAAC,IAAA,CAAK,KACR,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAGjE,IAAMZ,CAAAA,CAAQY,EAAU,KAAA,CAElBC,CAAAA,CAAc,MADF,IAAA,CAAK,IAAA,CAAK,MAAMb,CAAAA,CAAOA,CAAAA,CAAQ,IAAA,CAAK,WAAW,EAC7B,WAAA,EAAY,CAGhD,OAAAY,CAAAA,CAAU,QAAU,CAACC,CAAW,CAAA,CAEzBf,CAAAA,CAAM,aAAae,CAAAA,CAAa,IAAA,CAAK,OAAQ,IAAA,CAAK,KAAA,CAAO,KAAK,MAAM,CAC7E,CASA,MAAM,UAAUC,CAAAA,CAAoBC,CAAAA,CAAsC,CACxE,IAAMC,CAAAA,CAAU,MAAM,IAAA,CAAK,CAAE,MAAA,CAAQD,CAAM,EAAG,CAACE,CAAAA,CAAG,IAAMH,CAAAA,CAAa,CAAC,EACtE,OAAO,OAAA,CAAQ,GAAA,CAAIE,CAAAA,CAAQ,IAAK7D,CAAAA,EAAM,IAAA,CAAK,QAAA,CAASA,CAAC,CAAC,CAAC,CACzD,CAGA,UAAA,EAAsB,CACpB,OAAO,IAAA,CAAK,MAAM,MAAA,CAAS,CAC7B,CAMA,OAAQ,MAAA,CAAO,aAAa,CAAA,EAAuC,CACjE,IAAA,IAASA,CAAAA,CAAI,EAAGA,CAAAA,CAAI,IAAA,CAAK,MAAOA,CAAAA,EAAAA,CAC9B,MAAM,IAAA,CAAK,QAAA,CAASA,CAAC,EAEzB,CAGA,UAAU6B,CAAAA,CAAmC,CAC3C,OAAOK,CAAAA,CAAUL,CAAG,CACtB,CAGA,SAASA,CAAAA,CAAiBU,CAAAA,CAAWC,CAAAA,CAAmB,CACtD,OAAOF,CAAAA,CAAST,CAAAA,CAAKU,CAAAA,CAAGC,CAAAA,CAAG,KAAK,KAAK,CACvC,CACF,ECjIO,IAAMuB,EAAiD,CAC5D,CAAA,CAAG,CAAA,CACH,CAAA,CAAG,EACH,CAAA,CAAG,CAAA,CACH,EAAG,CAAA,CACH,CAAA,CAAG,EACH,CAAA,CAAG,CAAA,CACH,CAAA,CAAG,CAAA,CACH,EAAG,CAAA,CACH,CAAA,CAAG,EACH,CAAA,CAAG,EACL,EAgBaC,CAAAA,CAAkE,CAC7E,CAAA,CAAG,UAAA,CACH,EAAG,UAAA,CACH,CAAA,CAAG,UAAA,CACH,CAAA,CAAG,aACH,CAAA,CAAG,YAAA,CACH,CAAA,CAAG,UAAA,CACH,EAAG,UAAA,CACH,CAAA,CAAG,UACL,CAAA,CC9FO,IAAeC,EAAf,cAA+BhC,CAAS,CAEnC,SAAA,CAAY,QAEb,WAAA,CACA,IAAA,CACA,KACA,MAAA,CACA,UAAA,CACA,QAGC,SAAA,CAA8B,EAAC,CAE/B,WAAA,CAAwB,EAAC,CAEzB,kBAAA,CAA+B,EAAC,CAEhC,WAAA,CAAwB,EAAC,CAGnC,IAAA,CAGU,UAAA,CACR+B,CAAAA,CAGM,iBAAmB,CAAA,CACnB,eAAA,CAAkB,CAAA,CAClB,aAAA,CAAgB,EAChB,YAAA,CAER,WAAA,CAAY3C,CAAAA,CAAgBC,CAAAA,CAA0B,CACpD,KAAA,CAAMA,CAAI,EAEV,IAAA,CAAK,WAAA,CAAcD,EAAO,SAAA,CAAU,QAAQ,CAAA,CAC5C,IAAA,CAAK,KAAOA,CAAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CACrC,IAAA,CAAK,KAAOA,CAAAA,CAAO,SAAA,CAAU,SAAS,CAAA,CAEtC,KAAK,MAAA,CAAS,IAAA,CAAK,YAAc,IAAA,CAAK,IAAA,CACtC,KAAK,UAAA,CAAaA,CAAAA,CAAO,SAAA,CAAU,QAAQ,EAC3C,IAAA,CAAK,OAAA,CAAU,IAAA,CAAK,UAAA,CAAWA,CAAM,CAAA,CAEjC,IAAA,CAAK,MAAA,CAEP,IAAA,CAAK,KAAO,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAQ,KAAK,MAAA,CAAS,IAAA,CAAK,UAAU,CAAA,EAExE,KAAK,gBAAA,CAAmB,CAAA,CACxB,KAAK,eAAA,CAAkB,CAAA,CACvB,KAAK,aAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAY,IAAA,CAAK,WAAW,GAOrE,CAKU,aAAA,CAAcA,EAAsB,CAC5C,IAAA,CAAK,cAAA,EAAe,CACpB,KAAK,YAAA,CAAaA,CAAM,EAC1B,CAKQ,cAAA,EAAuB,CAC7B,IAAA,CAAK,SAAA,CAAY,EAAC,CAClB,KAAK,WAAA,CAAc,GACnB,IAAA,CAAK,kBAAA,CAAqB,EAAC,CAC3B,IAAA,CAAK,WAAA,CAAc,GACrB,CAeQ,YAAA,CAAa6C,EAAkBC,CAAAA,CAA0B,CAC/D,OAAI,IAAA,CAAK,MAAA,EAAU,CAAC,IAAA,CAAK,KAAa,IAAA,CAClC,IAAA,CAAK,aACH,EAAAD,CAAAA,CAAW,KAAK,gBAAA,EAChBC,CAAAA,CAAU,IAAA,CAAK,eAAA,CAAA,CAGd,KACT,CAKQ,UAAA,CAAW9C,CAAAA,CAAiC,CAClD,IAAM+C,CAAAA,CAAoB,EAAC,CAC3B,IAAA,IAASpE,EAAI,CAAA,CAAGA,CAAAA,EAAK,KAAK,IAAA,CAAMA,CAAAA,EAAAA,CAAK,CACnC,IAAMJ,CAAAA,CAAM,CAAA,KAAA,EAAQI,CAAC,GACrB,GAAI,CAACqB,EAAO,QAAA,CAASzB,CAAG,EAAG,OAAO,IAAA,CAClCwE,CAAAA,CAAQ,IAAA,CAAK/C,EAAO,SAAA,CAAUzB,CAAG,CAAC,EACpC,CACA,OAAOwE,CACT,CAQA,MAAM,OAAA,CACJC,EACAC,CAAAA,CACwD,CACxD,GAAI,IAAA,CAAK,aAAaD,CAAAA,CAAKA,CAAAA,CAAMC,CAAO,CAAA,CAAG,CACzC,IAAIC,CAAAA,CACJ,GAAI,IAAA,CAAK,YAAA,CAAc,CACrB,IAAMC,CAAAA,CAAAA,CAAiBH,CAAAA,CAAM,IAAA,CAAK,kBAAoB,IAAA,CAAK,WAAA,CAC3DE,EAAM,IAAA,CAAK,YAAA,CAAa,MAAMC,CAAAA,CAAeA,CAAAA,CAAgBF,CAAAA,CAAU,IAAA,CAAK,WAAW,EACzF,CAAA,KAAA,GAAW,KAAK,MAAA,CAAQ,CACtB,IAAMzB,CAAAA,CAAQwB,CAAAA,CAAM,IAAA,CAAK,WAAA,CACnBI,EAAM5B,CAAAA,CAAQyB,CAAAA,CAAU,IAAA,CAAK,WAAA,CACnCC,EAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM1B,CAAAA,CAAO4B,CAAG,EACpC,CAAA,WACQ,IAAI,KAAA,CAAM,0BAA0B,CAAA,CAE5C,OAAO,IAAA,CAAK,QAAA,CAASF,EAAKD,CAAO,CACnC,CAGA,GAAI,CAAC,KAAK,IAAA,CACR,MAAM,IAAI,KAAA,CAAM,0BAA0B,CAAA,CAG5C,IAAMzB,EAAQwB,CAAAA,CAAM,IAAA,CAAK,YACnBK,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,cAAeJ,CAAO,CAAA,CAC/CG,CAAAA,CAAM5B,CAAAA,CAAQ6B,EAAW,IAAA,CAAK,WAAA,CAE9BhB,CAAAA,CAAc,MADF,KAAK,IAAA,CAAK,KAAA,CAAMb,EAAO4B,CAAG,CAAA,CACR,aAAY,CAEhD,OAAA,IAAA,CAAK,YAAA,CAAef,CAAAA,CACpB,KAAK,gBAAA,CAAmBW,CAAAA,CACxB,KAAK,eAAA,CAAkBA,CAAAA,CAAMK,EAEtB,IAAA,CAAK,QAAA,CAAShB,CAAAA,CAAaY,CAAO,CAC3C,CAMA,MAAc,eAAeD,CAAAA,CAAaC,CAAAA,CAAuC,CAC/E,IAAMK,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAON,CAAAA,CAAKC,CAAO,CAAA,CAC9CzB,EAAQwB,CAAAA,CAAM,IAAA,CAAK,WAAA,CACnBI,CAAAA,CAAM5B,EAAQ8B,CAAAA,CAAa,IAAA,CAAK,YAEtC,GAAI,IAAA,CAAK,OACP,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM9B,EAAO4B,CAAG,CAAA,CAGrC,GAAI,CAAC,IAAA,CAAK,KACR,MAAM,IAAI,KAAA,CAAM,0BAA0B,EAI5C,OADkB,IAAA,CAAK,KAAK,KAAA,CAAM5B,CAAAA,CAAO4B,CAAG,CAAA,CAC3B,WAAA,EACnB,CAQA,MAAM,SAAA,CAAUG,CAAAA,CAAkC,CAChD,GAAI,CAAC,IAAA,CAAK,OAAA,CACR,MAAM,IAAI,MAAM,4BAA4B,CAAA,CAG9C,IAAMC,CAAAA,CAAW,IAAA,CAAK,QAAQ,OAAA,CAAQD,CAAI,CAAA,CAC1C,GAAIC,IAAa,EAAA,CACf,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAWD,CAAI,CAAA,WAAA,CAAa,CAAA,CAG9C,GAAI,IAAA,CAAK,QAAU,CAAC,IAAA,CAAK,KAGvB,OAAA,CADc,MAAM,KAAK,OAAA,CAAQ,CAAA,CAAG,IAAA,CAAK,IAAI,GACjC,GAAA,CAAKE,CAAAA,EAAMA,CAAAA,CAAEF,CAAI,CAAC,CAAA,CAIhC,IAAMG,CAAAA,CAAa,IAAA,CAAK,YAAYF,CAAQ,CAAA,CACtCG,EAAW,IAAA,CAAK,SAAA,CAAUH,CAAQ,CAAA,CAClCI,CAAAA,CAAoB,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA,CAAGJ,CAAQ,EAAE,MAAA,CAAO,CAAC1E,EAAGC,CAAAA,GAAMD,CAAAA,CAAIC,CAAAA,CAAG,CAAC,EAExF8E,CAAAA,CACJH,CAAAA,EAAc,KAAK,UAAA,CAAWA,CAAU,EAAI,IAAA,CAAK,UAAA,CAAWA,CAAU,CAAA,CAAK,KAEvEI,CAAAA,CAAoBD,CAAAA,CACtB,MAAM,IAAA,CAAK,IAAIA,EAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CACxC,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAEjBE,CAAAA,CAAmB,KAAK,GAAA,CAC5B,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,KAAK,KAAA,CAAM,IAAA,CAAK,UAAY,IAAA,CAAK,WAAW,CAAC,CAAA,CACzD,IAAA,CAAK,IACP,CAAA,CAEMC,EAAS,IAAA,CAAK,IAAA,CAAOD,EACvBE,CAAAA,CAAa,IAAA,CAAK,MAAMD,CAAM,CAAA,GAAMA,CAAAA,CAASA,CAAAA,CAAS,KAAK,KAAA,CAAMA,CAAM,CAAA,CAAI,CAAA,CAC3ErF,EAAI,CAAA,CACJuF,CAAAA,CAAa,CAAA,CAEjB,KAAOD,EAAa,CAAA,EAAG,CACrB,IAAME,CAAAA,CAAWD,CAAAA,CAAaH,EACxBrC,CAAAA,CAAS,MAAM,IAAA,CAAK,cAAA,CAAeyC,EAAUJ,CAAgB,CAAA,CAC7DK,EAAQ1C,CAAAA,CAAO,UAAA,CAAa,KAAK,WAAA,CACjCM,CAAAA,CAAO,IAAI,QAAA,CAASN,CAAM,CAAA,CAC5B2C,CAAAA,CAAST,EAEb,IAAA,IAASU,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAOE,CAAAA,EAAAA,CACzBR,CAAAA,CAAOnF,CAAC,CAAA,CAAIgF,CAAAA,CAAS3B,CAAAA,CAAMqC,CAAM,EAAE,CAAC,CAAA,CACpC1F,CAAAA,EAAAA,CACA0F,CAAAA,EAAU,KAAK,WAAA,CAGjBJ,CAAAA,EAAAA,CACAC,IACF,CAEA,OAAOJ,CACT,CACF,CAAA,CCnPA,IAAMS,EAAAA,CAAsE,CAC1E,CAAA,CAAIjH,CAAAA,EAAkBA,EAAM,IAAA,EAAK,CACjC,EAAIA,CAAAA,EAAkB,QAAA,CAASA,CAAAA,CAAO,EAAE,EACxC,CAAA,CAAIA,CAAAA,EAAkB,WAAWA,CAAK,CAAA,CACtC,EAAIA,CAAAA,EAAkB,UAAA,CAAWA,CAAK,CAAA,CACtC,EAAIA,CAAAA,EAAkB,UAAA,CAAWA,CAAK,CACxC,EAQakH,CAAAA,CAAN,cAAoB5B,CAAQ,CACzB,eAAyD,EAAC,CAE1D,UAAsB,EAAC,CAEvB,UAAsB,EAAC,CAEvB,QAAA,CAAW,KAAA,CAEnB,YAAY5C,CAAAA,CAAgBC,CAAAA,CAA0B,CACpD,KAAA,CAAMD,CAAAA,CAAQC,CAAI,CAAA,CAClB,IAAA,CAAK,aAAA,CAAcD,CAAM,EAC3B,CAEU,YAAA,CAAaA,EAAsB,CAC3C,IAAA,CAAK,eAAiB,EAAC,CACvB,IAAA,CAAK,SAAA,CAAY,EAAC,CAClB,IAAA,CAAK,SAAA,CAAY,GACjB,IAAA,CAAK,QAAA,CAAW,KAAA,CAChB,IAAMyE,EAAU,yBAAA,CAGhB,IAAA,IAAS9F,EAAI,CAAA,CAAGA,CAAAA,EAAK,KAAK,IAAA,CAAMA,CAAAA,EAAAA,CAC9B,GAAIqB,CAAAA,CAAO,SAAS,CAAA,KAAA,EAAQrB,CAAC,EAAE,CAAA,CAAG,CAChC,KAAK,QAAA,CAAW,IAAA,CAChB,KACF,CAGF,QAASA,CAAAA,CAAI,CAAA,CAAGA,GAAK,IAAA,CAAK,IAAA,CAAMA,IAAK,CACnC,IAAM+F,CAAAA,CAAO1E,CAAAA,CAAO,UAAU,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,CAAA,CACnCmB,EAAQ2E,CAAAA,CAAQ,IAAA,CAAKC,CAAI,CAAA,CAC/B,GAAI,CAAC5E,CAAAA,CAAO,CACV,IAAA,CAAK,cAAA,CAAe,KAAMnC,CAAAA,EAAcA,CAAAA,CAAE,IAAA,EAAM,EAChD,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CACrB,KAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,CACrB,QACF,CAEA,IAAM+F,EAAa5D,CAAAA,CAAM,CAAC,EACpBsB,CAAAA,CAAQ,QAAA,CAAStB,CAAAA,CAAM,CAAC,EAAI,EAAE,CAAA,CAC9B6E,CAAAA,CAAKJ,EAAAA,CAAgBb,CAAU,CAAA,GAAO/F,CAAAA,EAAcA,CAAAA,CAAE,IAAA,IAC5D,IAAA,CAAK,cAAA,CAAe,KAAKgH,CAAE,CAAA,CAG3B,IAAMC,CAAAA,CAAQ5E,CAAAA,CAAO,QAAA,CAAS,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,CAAA,CAAIqB,EAAO,SAAA,CAAU,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,CAAA,CAAI,CAAA,CAAI,CAAA,CACjF,KAAK,SAAA,CAAU,IAAA,CAAKiG,CAAK,CAAA,CACzB,IAAA,CAAK,UAAU,IAAA,CAAKxD,CAAK,EAC3B,CACF,CAEmB,QAAA,CAASM,CAAAA,CAAqBmD,CAAAA,CAA6B,CAC5E,IAAMT,CAAAA,CAAQ1C,CAAAA,CAAO,UAAA,CAAa,IAAA,CAAK,YACjClB,CAAAA,CAAM,IAAI,WAAWkB,CAAM,CAAA,CAC3BoD,EAAmB,EAAC,CACpBC,CAAAA,CAAY,IAAA,CAAK,gBAAkB,EAAC,CAE1C,QAASpG,CAAAA,CAAI,CAAA,CAAGA,EAAIyF,CAAAA,CAAOzF,CAAAA,EAAAA,CAAK,CAC9B,IAAM6C,EAAQ7C,CAAAA,CAAI,IAAA,CAAK,YACjByE,CAAAA,CAAM5B,CAAAA,CAAQ,KAAK,WAAA,CACnBwD,CAAAA,CAAWxE,CAAAA,CAAI,QAAA,CAASgB,EAAO4B,CAAG,CAAA,CAClClE,CAAAA,CAAOqB,CAAAA,CAAmByE,CAAQ,CAAA,CAElChC,CAAAA,CAAgB,EAAC,CACvB,GAAI,IAAA,CAAK,QAAA,CAEP,QAASiC,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAU,MAAA,CAAQE,CAAAA,EAAAA,CAAK,CACzC,IAAMC,CAAAA,CAAQ,IAAA,CAAK,UAAUD,CAAC,CAAA,CACxB7D,EAAQ,IAAA,CAAK,SAAA,CAAU6D,CAAC,CAAA,CACxB3H,EAAQ4B,CAAAA,CAAK,SAAA,CAAUgG,EAAOA,CAAAA,CAAQ9D,CAAK,EAAE,IAAA,EAAK,CACpD,IAAA,CAAK,OAAA,GACP4B,EAAI,IAAA,CAAK,OAAA,CAAQiC,CAAC,CAAE,EAAIF,CAAAA,CAAUE,CAAC,CAAA,CAAG3H,CAAK,GAE/C,CAAA,KACK,CAEL,IAAM6H,CAAAA,CAASjG,CAAAA,CAAK,MAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CACtC,QAAS+F,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAU,MAAA,CAAQE,IAAK,CACzC,IAAM3H,CAAAA,CAAQ6H,CAAAA,CAAOF,CAAC,CAAA,EAAK,EAAA,CACvB,KAAK,OAAA,GACPjC,CAAAA,CAAI,KAAK,OAAA,CAAQiC,CAAC,CAAE,CAAA,CAAIF,EAAUE,CAAC,CAAA,CAAG3H,CAAK,CAAA,EAE/C,CACF,CACAwH,CAAAA,CAAK,IAAA,CAAK9B,CAAG,EACf,CAEA,OAAO8B,CACT,CACF,MCpGMM,EAAAA,CAAwF,CAC5F,CAAA,CAAEpD,CAAAA,CAAMqC,EAAQ,CAEd,OAAO,CADGrC,CAAAA,CAAK,OAAA,CAAQqC,CAAM,CAAA,GACf,EAAA,CAAIA,CAAAA,CAAS,CAAC,CAC9B,CAAA,CACA,CAAA,CAAErC,EAAMqC,CAAAA,CAAQ,CACd,OAAO,CAACrC,CAAAA,CAAK,QAAA,CAASqC,CAAM,EAAGA,CAAAA,CAAS,CAAC,CAC3C,CAAA,CACA,EAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,OAAO,CAACrC,CAAAA,CAAK,QAAA,CAASqC,EAAQ,KAAK,CAAA,CAAGA,EAAS,CAAC,CAClD,CAAA,CACA,CAAA,CAAErC,EAAMqC,CAAAA,CAAQ,CACd,OAAO,CAACrC,CAAAA,CAAK,SAASqC,CAAAA,CAAQ,KAAK,CAAA,CAAGA,CAAAA,CAAS,CAAC,CAClD,CAAA,CACA,EAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,IAAMgB,CAAAA,CAAMrD,CAAAA,CAAK,WAAA,CAAYqC,EAAQ,KAAK,CAAA,CAC1C,OAAO,CAAC,OAAOgB,CAAG,CAAA,CAAGhB,CAAAA,CAAS,CAAC,CACjC,CAAA,CACA,CAAA,CAAErC,EAAMqC,CAAAA,CAAQ,CAEd,OAAO,CADK,MAAA,CAAO,YAAA,CAAarC,CAAAA,CAAK,SAASqC,CAAM,CAAC,EACxCA,CAAAA,CAAS,CAAC,CACzB,CAAA,CACA,CAAA,CAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,OAAO,CAACrC,EAAK,UAAA,CAAWqC,CAAAA,CAAQ,KAAK,CAAA,CAAGA,CAAAA,CAAS,CAAC,CACpD,EACA,CAAA,CAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,OAAO,CAACrC,CAAAA,CAAK,UAAA,CAAWqC,CAAAA,CAAQ,KAAK,CAAA,CAAGA,CAAAA,CAAS,CAAC,CACpD,CAAA,CACA,EAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,IAAMiB,EAAOtD,CAAAA,CAAK,UAAA,CAAWqC,EAAQ,KAAK,CAAA,CACpCkB,EAAOvD,CAAAA,CAAK,UAAA,CAAWqC,CAAAA,CAAS,CAAA,CAAG,KAAK,CAAA,CAC9C,OAAO,CAAC,CAACiB,CAAAA,CAAMC,CAAI,CAAA,CAAGlB,CAAAA,CAAS,CAAC,CAClC,EACA,CAAA,CAAErC,CAAAA,CAAMqC,CAAAA,CAAQ,CACd,IAAMiB,CAAAA,CAAOtD,CAAAA,CAAK,UAAA,CAAWqC,CAAAA,CAAQ,KAAK,CAAA,CACpCkB,CAAAA,CAAOvD,EAAK,UAAA,CAAWqC,CAAAA,CAAS,EAAG,KAAK,CAAA,CAC9C,OAAO,CAAC,CAACiB,CAAAA,CAAMC,CAAI,EAAGlB,CAAAA,CAAS,EAAE,CACnC,CACF,CAAA,CASamB,CAAAA,CAAN,cAA0B5C,CAAQ,CACvC,WAAA,CAAY5C,EAAgBC,CAAAA,CAA0B,CACpD,MAAMD,CAAAA,CAAQC,CAAI,CAAA,CAClB,IAAA,CAAK,cAAcD,CAAM,EAC3B,CAEU,YAAA,CAAaA,EAAsB,CAC3C,IAAMyE,CAAAA,CAAU,8BAAA,CAEhB,QAAS9F,CAAAA,CAAI,CAAA,CAAGA,GAAK,IAAA,CAAK,IAAA,CAAMA,IAAK,CACnC,IAAM+F,CAAAA,CAAO1E,CAAAA,CAAO,UAAU,CAAA,KAAA,EAAQrB,CAAC,EAAE,CAAA,CACnC8G,CAAAA,CAAOzF,EAAO,SAAA,CAAU,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,EACnCmB,CAAAA,CAAQ2E,CAAAA,CAAQ,KAAKC,CAAI,CAAA,CAC/B,GAAI,CAAC5E,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+BnB,CAAC,YAAY+F,CAAI,CAAA,CAAA,CAAG,EAGrE,IAAMnC,CAAAA,CAAQ,QAAA,CAASzC,CAAAA,CAAM,CAAC,CAAA,CAAI,EAAE,GAAK,CAAA,CACnClC,CAAAA,CAAUkC,EAAM,CAAC,CAAA,CACjB4D,CAAAA,CAAa5D,CAAAA,CAAM,CAAC,CAAA,CAE1B,IAAA,CAAK,YAAY,IAAA,CAAK4D,CAAU,EAChC,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK+B,CAAI,EAC1B,IAAA,CAAK,kBAAA,CAAmB,MAAM/C,CAAAA,CAAuBgB,CAAU,GAAK,CAAA,EAAKnB,CAAK,CAAA,CAE1E3E,CAAAA,CACF,KAAK,kBAAA,CAAmB8F,CAAAA,CAAY+B,CAAI,CAAA,CAC/BlD,IAAU,CAAA,CACnB,IAAA,CAAK,mBAAA,CAAoBmB,CAAU,EAC1BA,CAAAA,GAAe,GAAA,CACxB,KAAK,qBAAA,CAAsBnB,CAAK,EACvBmB,CAAAA,GAAe,GAAA,CACxB,IAAA,CAAK,sBAAA,CAAuBnB,CAAK,CAAA,CAEjC,IAAA,CAAK,mBAAmBmB,CAAAA,CAAYnB,CAAK,EAE7C,CACF,CAKU,WAAA,CAAYP,CAAAA,CAAgBqC,EAAgBX,CAAAA,CAA0C,CAC9F,IAAM7E,CAAAA,CAASmD,CAAAA,CAAK,SAASqC,CAAAA,CAAQ,KAAK,CAAA,CAC1CA,CAAAA,EAAU,EACV,IAAMqB,CAAAA,CAAa1D,CAAAA,CAAK,QAAA,CAASqC,EAAQ,KAAK,CAAA,CAG9C,GAFAA,CAAAA,EAAU,EAEN,CAAC,IAAA,CAAK,KACR,MAAM,IAAI,MAAM,oBAAoB,CAAA,CAGtC,IAAMsB,CAAAA,CAAkBjD,EAAuBgB,CAAU,CAAA,EAAK,EACxDkC,CAAAA,CAAY,IAAA,CAAK,KAAK,KAAA,CAAMF,CAAAA,CAAYA,CAAAA,CAAa7G,CAAAA,CAAS8G,CAAe,CAAA,CAC7EE,CAAAA,CAAOlD,EAAyBe,CAAU,CAAA,CAChD,GAAI,CAACmC,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,2CAAA,EAA8CnC,CAAU,CAAA,CAAE,CAAA,CAG5E,IAAMlD,CAAAA,CAAM,IAAIqF,CAAAA,CAAKD,CAAS,EAGxBE,CAAAA,CAASzF,CAAAA,CAAWqD,CAAU,CAAA,CACpC,GAAIoC,GAAUpC,CAAAA,GAAe,GAAA,CAC3B,IAAA,IAASuB,CAAAA,CAAI,EAAGA,CAAAA,CAAIzE,CAAAA,CAAI,OAAQyE,CAAAA,EAAAA,CAC5BzE,CAAAA,CAAmByE,CAAC,CAAA,CAAIa,CAAAA,CAAOtF,CAAAA,CAAIyE,CAAC,CAAE,CAAA,CAI5C,OAAO,CAACzE,CAAAA,CAAK6D,CAAM,CACrB,CAEQ,kBAAA,CAAmBX,CAAAA,CAAoB+B,CAAAA,CAAoB,CACjE,GAAIA,CAAAA,GAAS,iBAAA,CAAmB,CAC9B,IAAM9B,CAAAA,CAA2B,CAAC3B,CAAAA,CAAMqC,CAAAA,GAAW,CACjD,GAAM,CAAC7D,EAAKuF,CAAS,CAAA,CAAI,KAAK,WAAA,CAAY/D,CAAAA,CAAMqC,CAAAA,CAAQX,CAAU,EAElE,OAAO,CAAClD,EAAKuF,CAAS,CACxB,EACA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAKpC,CAAQ,EAC9B,CAAA,KAAA,GAAW8B,CAAAA,GAAS,uBAAwB,CAC1C,IAAM9B,EAA2B,CAACqC,CAAAA,CAAOC,CAAAA,GAAY,CACnD,MAAM,IAAIjJ,CAAAA,CAAmB,2CAA2C,CAC1E,EACA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK2G,CAAQ,EAC9B,CAAA,KAAO,CACL,IAAMA,CAAAA,CAA2B,CAAC3B,EAAMqC,CAAAA,GAC/B,IAAA,CAAK,WAAA,CAAYrC,CAAAA,CAAMqC,EAAQX,CAAU,CAAA,CAElD,KAAK,SAAA,CAAU,IAAA,CAAKC,CAAQ,EAC9B,CACF,CAEQ,mBAAA,CAAoBD,EAA0B,CACpD,IAAMwC,EAAed,EAAAA,CAAe1B,CAAU,EAC9C,GAAI,CAACwC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCxC,CAAU,CAAA,CAAE,EAEjE,IAAMC,CAAAA,CAA2B,CAAC3B,CAAAA,CAAMqC,IAC/B6B,CAAAA,CAAalE,CAAAA,CAAMqC,CAAM,CAAA,CAElC,IAAA,CAAK,UAAU,IAAA,CAAKV,CAAQ,EAC9B,CAEQ,sBAAsBpB,CAAAA,CAAqB,CACjD,IAAM4D,CAAAA,CAAS,IAAA,CAAK,KAAK5D,CAAAA,CAAQ,CAAC,CAAA,CAC5BoB,CAAAA,CAA2B,CAAC3B,CAAAA,CAAMqC,CAAAA,GAAW,CACjD,IAAM3C,CAAAA,CAASM,EAAK,MAAA,CAAO,KAAA,CAAMqC,CAAAA,CAAQA,CAAAA,CAAS8B,CAAM,CAAA,CAClDtE,CAAAA,CAAQ,IAAI,UAAA,CAAWH,CAAM,CAAA,CAC/B0E,CAAAA,CAAiB,EAAC,CACtB,QAASrH,CAAAA,CAAI,CAAA,CAAGA,EAAI8C,CAAAA,CAAM,MAAA,CAAQ9C,IAChCqH,CAAAA,CAAOA,CAAAA,CAAK,MAAA,CAAO1F,EAAAA,CAAOmB,EAAM9C,CAAC,CAAE,CAAC,CAAA,CAEtC,OAAO,CAACqH,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG7D,CAAK,EAAG8B,CAAAA,CAAS8B,CAAM,CAC/C,CAAA,CACA,IAAA,CAAK,UAAU,IAAA,CAAKxC,CAAQ,EAC9B,CAEQ,uBAAuBpB,CAAAA,CAAqB,CAClD,IAAMoB,CAAAA,CAA2B,CAAC3B,EAAMqC,CAAAA,GAAW,CACjD,IAAM3C,CAAAA,CAASM,EAAK,MAAA,CAAO,KAAA,CAAMqC,EAAQA,CAAAA,CAAS9B,CAAK,EACjD/B,CAAAA,CAAM,IAAI,UAAA,CAAWkB,CAAM,EAC7B2E,CAAAA,CAAI,EAAA,CACR,QAASC,CAAAA,CAAI,CAAA,CAAGA,EAAI9F,CAAAA,CAAI,MAAA,CAAQ8F,CAAAA,EAAAA,CAC9BD,CAAAA,EAAK,OAAO,YAAA,CAAa7F,CAAAA,CAAI8F,CAAC,CAAE,CAAA,CAElC,OAAO,CAACD,CAAAA,CAAE,IAAA,EAAK,CAAGhC,EAAS9B,CAAK,CAClC,CAAA,CACA,IAAA,CAAK,UAAU,IAAA,CAAKoB,CAAQ,EAC9B,CAEQ,mBAAmBD,CAAAA,CAAoBnB,CAAAA,CAAqB,CAClE,IAAM2D,CAAAA,CAAed,GAAe1B,CAAU,CAAA,CAC9C,GAAI,CAACwC,EACH,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmCxC,CAAU,EAAE,CAAA,CAEjE,IAAMC,CAAAA,CAA2B,CAAC3B,EAAMqC,CAAAA,GAAW,CACjD,IAAMpE,CAAAA,CAAkB,GACpBsG,CAAAA,CAAMlC,CAAAA,CACV,IAAA,IAASiC,CAAAA,CAAI,EAAGA,CAAAA,CAAI/D,CAAAA,CAAO+D,CAAAA,EAAAA,CAAK,CAC9B,GAAM,CAAChJ,CAAAA,CAAOkJ,CAAM,CAAA,CAAIN,EAAalE,CAAAA,CAAMuE,CAAG,EAC9CtG,CAAAA,CAAK,IAAA,CAAK3C,CAAK,CAAA,CACfiJ,CAAAA,CAAMC,EACR,CACA,OAAO,CAACvG,CAAAA,CAAMsG,CAAG,CACnB,CAAA,CACA,KAAK,SAAA,CAAU,IAAA,CAAK5C,CAAQ,EAC9B,CAEmB,QAAA,CAASjC,CAAAA,CAAqB0C,EAA0C,CACzF,IAAMpC,EAAO,IAAI,QAAA,CAASN,CAAM,CAAA,CAC5B2C,EAAS,CAAA,CACPS,CAAAA,CAAmB,EAAC,CAE1B,QAASR,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAOE,IAAK,CAC9B,IAAMtB,EAAgB,EAAC,CACvB,QAASsD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,UAAU,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAC9C,GAAM,CAAChJ,EAAOyI,CAAS,CAAA,CAAI,IAAA,CAAK,SAAA,CAAUO,CAAC,CAAA,CAAGtE,CAAAA,CAAMqC,CAAM,CAAA,CAC1DA,CAAAA,CAAS0B,EACL,IAAA,CAAK,OAAA,GACP/C,CAAAA,CAAI,IAAA,CAAK,QAAQsD,CAAC,CAAE,CAAA,CAAIhJ,CAAAA,EAE5B,CACAwH,CAAAA,CAAK,IAAA,CAAK9B,CAAG,EACf,CAEA,OAAO8B,CACT,CACF,EC5NO,IAAM2B,EAAqF,CAChG,CAAA,CAAEC,CAAAA,CAAO,CAKP,OAAO,CAAC,CAAA,CAAQ,EADAA,CAAAA,CAAM,CAAC,EACS,CAAO,CACzC,CAAA,CAEA,CAAA,CAAEA,EAAO,CAIP,IAAIC,EAAU,CAAA,CACd,OAAAA,EAAUA,CAAAA,CAAWD,CAAAA,CAAM,CAAC,CAAA,EAAM,EAClCC,CAAAA,CAAUA,CAAAA,CAAUD,CAAAA,CAAM,CAAC,EACpB,CAAC,CAAA,CAAQ,EAAA,CAAOC,CAAAA,CAAS,CAAO,CACzC,CAAA,CAEA,EAAED,CAAAA,CAAO,CAIP,IAAIC,CAAAA,CAAU,CAAA,CACd,OAAAA,CAAAA,CAAUA,EAAWD,CAAAA,CAAM,CAAC,GAAM,EAAA,CAClCC,CAAAA,CAAUA,EAAWD,CAAAA,CAAM,CAAC,CAAA,EAAM,EAAA,CAClCC,EAAUA,CAAAA,CAAWD,CAAAA,CAAM,CAAC,CAAA,EAAM,CAAA,CAClCC,EAAUA,CAAAA,CAAUD,CAAAA,CAAM,CAAC,CAAA,CACpB,CAAC,CAAA,CAAQ,EAAA,CAAOC,CAAAA,CAAS,CAAO,CACzC,CACF,EAgBO,SAASC,CAAAA,CACdF,EACAG,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CAAiFR,EACrE,CACZ,IAAMS,CAAAA,CAAUD,CAAAA,CAAMH,CAAO,CAAA,CAC7B,GAAI,CAACI,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BJ,CAAO,CAAA,CAAE,EAGzD,GAAM,CAACK,EAAQC,CAAAA,CAAOC,CAAAA,CAAgBC,CAAc,CAAA,CAAIJ,CAAAA,CAAQR,CAAK,CAAA,CACjEC,EAAUU,CAAAA,CACVE,CAAAA,CAAUD,CAAAA,CAERE,CAAAA,CAAQ,GAAKL,CAAAA,CAGbM,CAAAA,CAAe,IAAI,UAAA,CAAW,GAAG,CAAA,CACnCC,CAAAA,CAAQ,EACRC,CAAAA,CAAI,GAAA,CACJC,EAAM,GAAA,CACV,KAAOA,CAAAA,EAAO,CAAA,EAAG,CACf,KAAOA,CAAAA,EAAOD,GACZF,CAAAA,CAAaG,CAAG,EAAIF,CAAAA,CACpBE,CAAAA,EAAAA,CAEFD,CAAAA,CAAIA,CAAAA,CAAI,EACRD,CAAAA,GACF,CACAD,EAAa,CAAC,CAAA,CAAI,EAGlB,IAAI1I,CAAAA,CAAI2H,CAAAA,CAAMa,CAAAA,EAAS,EACnBM,CAAAA,CAAQ,CAAA,CAERlJ,EAAI,CAAA,CACR,KAAOA,EAAIqI,CAAAA,EAAI,CAGb,IAFAa,CAAAA,EAASV,EAEFU,CAAAA,CAAQ,CAAA,EACb9I,EAAKA,CAAAA,EAAK,CAAA,CAAK2H,EAAMa,CAAAA,EAAS,CAAA,CAC9BM,CAAAA,EAAS,CAAA,CAGX,IAAMC,CAAAA,CAAAA,CAAM/I,CAAAA,EAAK8I,GAAS,CAAA,CAC1B9I,CAAAA,EAAAA,CAAM,GAAK8I,CAAAA,EAAS,CAAA,CAEpB,IAAIE,CAAAA,CAAOpJ,EAAIkI,CAAAA,CAGf,GAFIkB,EAAOf,CAAAA,GAAIe,CAAAA,CAAOf,GAElBc,CAAAA,CAAK,CAAA,CAEP,KAAOnJ,CAAAA,CAAIoJ,GACPhB,CAAAA,CAAsBpI,CAAC,CAAA,CAAIgI,CAAAA,CAC7BhI,YAEOmJ,CAAAA,GAAOV,CAAAA,CAEhB,KAAOzI,CAAAA,CAAIoJ,GAAM,CACfJ,CAAAA,CAAIH,EAAQK,CAAAA,CACZ,IAAIG,EAAOjJ,CAAAA,EAAK4I,CAAAA,CAEhB,IADAA,CAAAA,EAAK,EACEA,CAAAA,EAAK,CAAA,EACV5I,EAAI2H,CAAAA,CAAMa,CAAAA,EAAS,EACnBS,CAAAA,EAAQjJ,CAAAA,EAAK4I,CAAAA,CACbA,CAAAA,EAAK,EAEHE,CAAAA,CAAQ,CAAA,EACV9I,EAAI2H,CAAAA,CAAMa,CAAAA,EAAS,EACnBS,CAAAA,EAAQjJ,CAAAA,EAAK,CAAC4I,CAAAA,CACd5I,IAAM,CAAA,EAAK8I,CAAAA,EAAS,CAAA,EAEpB9I,CAAAA,CAAI,GAEDiJ,CAAAA,CAAO,CAAA,IAAO,CAAA,CACjBA,CAAAA,CAAOA,GAAQ,CAAA,CAEfA,CAAAA,CAAO,EAAEA,CAAAA,EAAQ,CAAA,CAAA,CAEjBjB,EAAsBpI,CAAC,CAAA,CAAIqJ,CAAAA,CAAOrB,CAAAA,CACpCA,EAAWI,CAAAA,CAAsBpI,CAAC,EAClCA,CAAAA,GACF,CAAA,UAGOA,CAAAA,CAAIoJ,CAAAA,EAAM,CACf,KAAOhJ,IAAM,CAAA,EACX8I,CAAAA,EAAS,EACT9I,CAAAA,CAAI2H,CAAAA,CAAMa,GAAS,CAAA,CAMrB,IAJAG,CAAAA,CAAQG,CAAAA,CAAQJ,EAAa1I,CAAC,CAAA,CAC9B8I,CAAAA,EAASH,CAAAA,CAAQ,EACjB3I,CAAAA,EAAK,CAAA,EAAK8I,CAAAA,CACVA,CAAAA,EAASC,EACFD,CAAAA,CAAQ,CAAA,EACb9I,EAAKA,CAAAA,EAAK,CAAA,CAAK2H,EAAMa,CAAAA,EAAS,CAAA,CAC9BM,CAAAA,EAAS,CAAA,CAEX,IAAIG,CAAAA,CAAQN,CAAAA,EAASI,EAAO/I,CAAAA,EAAK8I,CAAAA,CACjC9I,IAAM,CAAA,EAAK8I,CAAAA,EAAS,CAAA,CAAA,CACfG,CAAAA,CAAO,KAAO,CAAA,CACjBA,CAAAA,CAAOA,GAAQ,CAAA,CAEfA,CAAAA,CAAO,EAAEA,CAAAA,EAAQ,CAAA,CAAA,CAEjBjB,CAAAA,CAAsBpI,CAAC,EAAIqJ,CAAAA,CAAOrB,CAAAA,CACpCA,CAAAA,CAAWI,CAAAA,CAAsBpI,CAAC,CAAA,CAClCA,CAAAA,GACF,CAEJ,CAEA,OAAOoI,CACT,CC1JA,SAASkB,EAAAA,EAAuC,CAG9C,IAAIC,CAAAA,CAAO,CAAA,CAELC,CAAAA,CAAS,IAAI,aAAa,GAAQ,CAAA,CACxC,QAASxJ,CAAAA,CAAI,CAAA,CAAGA,EAAI,GAAA,CAAUA,CAAAA,EAAAA,CAAK,CACjC,IAAMyJ,EAAO,KAAA,CAAIF,CAAAA,CACjBA,EAAOE,CAAAA,CAAO,UAAA,CAAI,KAAK,KAAA,CAAMA,CAAAA,CAAO,UAAC,CAAA,CACrCD,EAAOxJ,CAAC,CAAA,CAAIuJ,CAAAA,CAAO,WACrB,CACA,OAAOC,CACT,CAGA,IAAME,EAAkBJ,EAAAA,EAAuB,CAUlCK,EAAN,cAA8B9C,CAAY,CACtC,QAAA,CACA,OAAA,CACA,MAAA,CACA,MAAA,CACA,MACA,OAAA,CACA,KAAA,CACA,MACA,MAAA,CACA,KAAA,CACA,OACA,mBAAA,CACA,QAAA,CAET,WAAA,CAAYxF,CAAAA,CAAgBC,EAA0B,CACpD,KAAA,CAAMD,EAAQC,CAAI,CAAA,CAElB,KAAK,QAAA,CAAWD,CAAAA,CAAO,SAAA,CAAU,UAAU,EAC3C,IAAA,CAAK,OAAA,CAAUA,CAAAA,CAAO,SAAA,CAAU,SAAS,CAAA,CACzC,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAO,UAAU,QAAQ,CAAA,CACvC,KAAK,MAAA,CAASA,CAAAA,CAAO,SAAS,QAAQ,CAAA,CAAIA,CAAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,CAAI,IAAA,CACvE,KAAK,KAAA,CAAQA,CAAAA,CAAO,SAAS,OAAO,CAAA,CAAIA,CAAAA,CAAO,SAAA,CAAU,OAAO,CAAA,CAAI,IAAA,CACpE,KAAK,OAAA,CAAUA,CAAAA,CAAO,UAAU,UAAU,CAAA,CAE1C,IAAA,CAAK,KAAA,CAAQ,EAAC,CACd,IAAA,IAASrB,CAAAA,CAAI,CAAA,CAAGA,GAAK,IAAA,CAAK,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CACrC,IAAM4J,CAAAA,CAAQvI,CAAAA,CAAO,SAAS,CAAA,KAAA,EAAQrB,CAAC,EAAE,CAAA,CACrCqB,CAAAA,CAAO,SAAA,CAAU,CAAA,KAAA,EAAQrB,CAAC,CAAA,CAAE,CAAA,CAC5BA,IAAM,CAAA,CACJqB,CAAAA,CAAO,UAAU,SAAS,CAAA,CAC1B,CAAA,CACN,IAAA,CAAK,MAAM,IAAA,CAAKuI,CAAK,EACvB,CAEA,IAAA,CAAK,MAAQvI,CAAAA,CAAO,SAAA,CAAU,SAAS,CAAA,CACvC,KAAK,MAAA,CAASA,CAAAA,CAAO,UAAU,SAAA,CAAW,CAAC,EAG3C,IAAA,CAAK,mBAAA,CAAsB,EAAC,CACxB,KAAK,QAAA,GAAa,QAAA,GACpB,KAAK,mBAAA,CAAoB,SAAA,CAAe,GACxC,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAa,CAAA,CAAA,CAIxC,IAAIwI,CAAAA,CAAW,CAAA,CACf,KAAOxI,CAAAA,CAAO,QAAA,CAAS,QAAQwI,CAAQ,CAAA,CAAE,CAAA,EAAG,CAC1C,IAAMjF,CAAAA,CAAOvD,CAAAA,CAAO,UAAU,CAAA,KAAA,EAAQwI,CAAQ,EAAE,CAAA,CAC1ClL,CAAAA,CAAQ0C,CAAAA,CAAO,SAAA,CAAU,OAAOwI,CAAQ,CAAA,CAAE,CAAA,CAChD,IAAA,CAAK,oBAAoBjF,CAAI,CAAA,CAAIjG,CAAAA,CACjCkL,CAAAA,GACF,CAEA,IAAA,CAAK,QAAA,CAAWxI,EAAO,SAAA,CAAU,UAAA,CAAY,gBAAgB,CAAA,CAC7D,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAAO,UAAU,OAAO,CAAA,CACrC,KAAK,MAAA,CAASA,CAAAA,CAAO,UAAU,QAAA,CAAU,CAAC,CAAA,CAM1C,IAAA,CAAK,cAAcA,CAAM,EAC3B,CAMmB,YAAA,CAAaA,CAAAA,CAAsB,CAEpD,KAAA,CAAM,YAAA,CAAaA,CAAM,CAAA,CAGzB,QAASsG,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,YAAY,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAChD,IAAMb,EAAO,IAAA,CAAK,WAAA,CAAYa,CAAC,CAAA,CACzB5C,CAAAA,CAAa,KAAK,WAAA,CAAY4C,CAAC,CAAA,CAEjCb,CAAAA,GAAS,kBACX,IAAA,CAAK,SAAA,CAAUa,CAAC,CAAA,CAAI,CAACtE,EAAMqC,CAAAA,GAAW,CACpC,GAAM,CAAC7D,EAAKuF,CAAS,CAAA,CAAI,KAAK,WAAA,CAAY/D,CAAAA,CAAMqC,EAAQX,CAAU,CAAA,CAG5DoD,CAAAA,CAAU,IAAA,CAAK,oBAAoB,OAAA,EAAc,CAAA,CACjDD,CAAAA,CAAY,IAAA,CAAK,oBAAoB,SAAA,EAAgB,EAAA,CACrDhB,CAAAA,CAAOlD,CAAAA,CAAyBmE,CAAO,CAAA,CAC7C,GAAI,CAACjB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BiB,CAAO,CAAA,CAAE,EAE1D,IAAM2B,CAAAA,CAAW,KAAK,KAAA,CAAM,CAAC,GAAK,IAAA,CAAK,KAAA,CACjC1B,CAAAA,CAAS,IAAIlB,EAAK4C,CAAQ,CAAA,CAChC,OAAA7B,CAAAA,CAAepG,CAAAA,CAAmBqG,EAAWC,CAAAA,CAASC,CAAAA,CAAQ0B,CAAAA,CAAUhC,CAAS,EAC1E,CAACM,CAAAA,CAAQhB,CAAS,CAC3B,EACSN,CAAAA,GAAS,sBAAA,GAClB,IAAA,CAAK,SAAA,CAAUa,CAAC,CAAA,CAAI,CAACN,EAAOC,CAAAA,GAAY,CACtC,MAAM,IAAIjJ,CAAAA,CAAmB,2CAA2C,CAC1E,GAEJ,CACF,CAMmB,SAAS0E,CAAAA,CAAqB0C,CAAAA,CAA6B,CAC5E,IAAMpC,CAAAA,CAAO,IAAI,QAAA,CAASN,CAAM,CAAA,CAC5B2C,CAAAA,CAAS,EACP7D,CAAAA,CAAM,IAAI,aAAa,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,MAAM,EAEjDkI,CAAAA,CAAY,CAAA,CACZC,CAAAA,CAAgBvE,CAAAA,CACpB,KAAOuE,CAAAA,EAAAA,EAAiB,CACtBD,CAAAA,EAAAA,CACA,IAAM1F,EAAgB,EAAC,CACvB,QAASsD,CAAAA,CAAI,CAAA,CAAGA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAC9C,GAAM,CAAChJ,EAAOyI,CAAS,CAAA,CAAI,KAAK,SAAA,CAAUO,CAAC,CAAA,CAAGtE,CAAAA,CAAMqC,CAAM,CAAA,CAC1DA,CAAAA,CAAS0B,EACL,IAAA,CAAK,OAAA,GACP/C,EAAI,IAAA,CAAK,OAAA,CAAQsD,CAAC,CAAE,EAAIhJ,CAAAA,EAE5B,CAGA,IAAM2C,CAAAA,CAAQ+C,EAAI,eAAA,EAChBA,CAAAA,CAAI,iBAAA,EACJA,CAAAA,CAAI,qBACA4F,CAAAA,CAAS5F,CAAAA,CAAI,QAAwB,IAAA,CAAK,MAAA,CAC1C6F,EAAQ7F,CAAAA,CAAI,KAAA,EAAuB,IAAA,CAAK,KAAA,CAGxC8F,EAAQJ,CAAAA,CAGRK,CAAAA,CACJ,KAAK,QAAA,GAAa,sBAAA,EAA0B,KAAK,QAAA,GAAa,sBAAA,CAG5DC,CAAAA,CAAS,CAAA,CACTC,EAAQ,CAAA,CACZ,GAAIF,EAAW,CAEb,IAAMG,GADQJ,CAAAA,CAAQ,IAAA,CAAK,OAAA,CAAU,CAAA,CACP,GAAK,GAAA,CACnCG,CAAAA,CAAQC,CAAAA,CAAe,CAAA,CAAIA,EAAe,GAAA,CAAWA,CAAAA,CACrDF,CAAAA,CAAS,IAAA,CAAK,MAAMX,CAAAA,CAAgBY,CAAK,EAAK,GAAG,EACnD,CAEA,IAAA,IAASrB,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM3H,EAAK,MAAA,CAAQ2H,CAAAA,EAAAA,CAAO,CAC1C,IAAMuB,CAAAA,CAAAA,CAAcL,EAAQ,CAAA,EAAK,IAAA,CAAK,KAAA,CAAQlB,CAAAA,CACxCtK,EAAQ2C,CAAAA,CAAK2H,CAAG,EAEtB,GAAItK,CAAAA,GAAU,YACZkD,CAAAA,CAAI2I,CAAU,CAAA,CAAI,GAAA,CAAA,KAAA,GACT7L,IAAU,WAAA,CACnBkD,CAAAA,CAAI2I,CAAU,CAAA,CAAI,CAAA,CAAA,KAAA,GACTJ,EAAW,CACpB,IAAMzE,CAAAA,CAAI+D,CAAAA,CAAgBW,CAAM,CAAA,CAChCxI,CAAAA,CAAI2I,CAAU,CAAA,CAAA,CAAK7L,CAAAA,CAAQgH,EAAI,EAAA,EAAOsE,CAAAA,CAAQC,EAChD,CAAA,KACErI,EAAI2I,CAAU,CAAA,CAAI7L,EAAQsL,CAAAA,CAAQC,CAAAA,CAIhCE,IACFC,CAAAA,EAAAA,CACIA,CAAAA,GAAW,GAAA,GACbC,CAAAA,CAAAA,CAASA,EAAQ,CAAA,EAAK,GAAA,CACtBD,EAAS,IAAA,CAAK,KAAA,CAAMX,EAAgBY,CAAK,CAAA,CAAK,GAAG,CAAA,CAAA,EAGvD,CACF,CAEA,OAAOzI,CACT,CAMA,MAAM,QAAA,CAAS4I,CAAAA,CAAkB,CAAA,CAA0B,CACzD,GAAI,IAAA,CAAK,IAAA,CAEP,OADe,MAAM,IAAA,CAAK,QAAQ,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA,CAKhD,GAAI,CAAC,IAAA,CAAK,KACR,MAAM,IAAI,MAAM,0BAA0B,CAAA,CAG5C,IAAMC,CAAAA,CAAW,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,CAAQ,IAAA,CAAK,OAAS,IAAA,CAAK,UAAU,CAAA,CAC3E,OAAA,IAAA,CAAK,KAAO,MAAMA,CAAAA,CAAS,WAAA,EAAY,CAEhC,KAAK,QAAA,CAASD,CAAO,CAC9B,CAGA,UAAU5I,CAAAA,CAAqC,CAC7C,OAAOK,CAAAA,CAAUL,CAAG,CACtB,CAGA,QAAA,CAASA,CAAAA,CAAmBU,CAAAA,CAAWC,EAAmB,CACxD,OAAOF,EAAST,CAAAA,CAAKU,CAAAA,CAAGC,EAAG,IAAA,CAAK,KAAK,CACvC,CACF,ECxOA,SAASmI,EAAAA,CAAetJ,EAAgBC,CAAAA,CAAgD,CACtF,IAAMwF,CAAAA,CAA4BzF,CAAAA,CAAO,WAAA,EAAY,CACrD,GAAKyF,CAAAA,CAEL,OAAQA,CAAAA,EACN,KAAK,OAAA,CACH,OAAO,IAAIpE,CAAAA,CAAMrB,EAAQC,CAAI,CAAA,CAC/B,KAAK,aAAA,CACH,OAAO,IAAIuF,CAAAA,CAAYxF,CAAAA,CAAQC,CAAI,CAAA,CACrC,KAAK,OAAA,CACH,OAAO,IAAIuE,CAAAA,CAAMxE,CAAAA,CAAQC,CAAI,CAAA,CAC/B,KAAK,iBAAA,CACH,OAAO,IAAIqI,CAAAA,CAAgBtI,CAAAA,CAAQC,CAAI,CAAA,CACzC,QACE,MACJ,CACF,CAYO,SAASsJ,CAAAA,CAAY7H,EAAqB8H,CAAAA,CAA8B,CAC7E,IAAMC,CAAAA,CAAc,EAAC,CACfC,CAAAA,CAAchI,CAAAA,CAAO,UAAA,CACvB2C,EAAS,CAAA,CAEb,KAAOA,EAASqF,CAAAA,EAAa,CAE3B,IAAIC,CAAAA,CAAa,CAAA,CACbC,CAAAA,CAAgB,IAAI,WAAW,CAAC,CAAA,CAChCC,EAAc,KAAA,CAElB,KAAO,CAACA,CAAAA,EAAexF,CAAAA,CAASsF,CAAAA,CAAa,IAAA,CAAe,MAAgBD,CAAAA,EAAa,CACvF,IAAMI,CAAAA,CAAazF,CAAAA,CAASsF,EAAa,IAAA,CACnCI,CAAAA,CAAa,IAAI,UAAA,CAAWrI,EAAQoI,CAAAA,CAAY,IAAY,CAAA,CAG5DE,CAAAA,CAAa,IAAI,UAAA,CAAWJ,CAAAA,CAAc,MAAA,CAAS,IAAY,EACrEI,CAAAA,CAAW,GAAA,CAAIJ,EAAe,CAAC,CAAA,CAC/BI,EAAW,GAAA,CAAID,CAAAA,CAAYH,CAAAA,CAAc,MAAM,EAC/CA,CAAAA,CAAgBI,CAAAA,CAGhB,IAAMlF,CAAAA,CAAO,IAAA,CAAe,GAC5B,IAAA,IAAS9B,CAAAA,CAAM8B,CAAAA,CAAO,CAAA,CAAG9B,GAAO,CAAA,CAAGA,CAAAA,EAAAA,CAAO,CACxC,IAAMiH,CAAAA,CAAWjH,EAAM,EAAA,CACjBjE,CAAAA,CAAIgL,CAAAA,CAAWE,CAAQ,EAG7B,GAAIlL,CAAAA,GAAM,EAAA,CAGV,CAAA,GACEA,IAAM,EAAA,EACNgL,CAAAA,CAAWE,CAAAA,CAAW,CAAC,IAAM,EAAA,EAC7BF,CAAAA,CAAWE,EAAW,CAAC,CAAA,GAAM,IAC7BF,CAAAA,CAAWE,CAAAA,CAAW,CAAC,CAAA,GAAM,GAC7B,CACAJ,CAAAA,CAAc,KACd,KACF,CAGA,MACF,CAIA,GAFAF,CAAAA,EAAAA,CAEI,CAACE,EACH,SAIF,IAAMK,EAAe3J,CAAAA,CAAmBqJ,CAAa,EAC/C5J,CAAAA,CAAS,IAAI9B,CAAAA,CAAOgM,CAAAA,CAAcV,GAAS,cAAA,CAAgBA,CAAAA,EAAS,SAAS,CAAA,CAG7EW,EAAY9F,CAAAA,CAASsF,CAAAA,CAAa,IAAA,CAClCS,CAAAA,CAAapK,EAAO,aAAA,EAAc,CAGlCqK,EAAY3I,CAAAA,CAAO,KAAA,CAAMyI,EAAWA,CAAAA,CAAYC,CAAU,CAAA,CAG5DE,CAAAA,CAYJ,GAXItK,CAAAA,CAAO,WAAA,KACTsK,CAAAA,CAAWhB,EAAAA,CAAetJ,EAAQqK,CAAS,CAAA,CAAA,CAI7CZ,CAAAA,CAAK,IAAA,CAAK,IAAI1J,CAAAA,CAAIC,CAAAA,CAAQsK,CAAQ,CAAC,CAAA,CAGnCjG,EAAS8F,CAAAA,CAAYC,CAAAA,CAAa3J,CAAAA,CAAY2J,CAAU,EAGpD/F,CAAAA,EAAUqF,CAAAA,CACZ,KAEJ,CAGA,GAAI,CAACG,CAAAA,CACH,KAEJ,CAEA,OAAOJ,CACT,CAYA,eAAsBc,GAAUC,CAAAA,CAAYhB,CAAAA,CAAuC,CACjF,IAAMC,CAAAA,CAAc,EAAC,CACfC,EAAcc,CAAAA,CAAK,IAAA,CACrBnG,EAAS,CAAA,CAEb,KAAOA,EAASqF,CAAAA,EAAa,CAE3B,IAAIC,CAAAA,CAAa,EACXc,CAAAA,CAA6B,GAC/BZ,CAAAA,CAAc,KAAA,CAElB,KAAO,CAACA,CAAAA,EAAexF,CAAAA,CAASsF,CAAAA,CAAa,KAAe,IAAA,EAAgBD,CAAAA,EAAa,CACvF,IAAMI,EAAazF,CAAAA,CAASsF,CAAAA,CAAa,IAAA,CAEnCe,CAAAA,CAAc,MADFF,CAAAA,CAAK,KAAA,CAAMV,EAAYA,CAAAA,CAAa,IAAY,EAC9B,WAAA,EAAY,CAC1CC,CAAAA,CAAa,IAAI,WAAWW,CAAW,CAAA,CAE7CD,EAAa,IAAA,CAAKV,CAAU,EAG5B,IAAMjF,CAAAA,CAAO,IAAA,CAAe,EAAA,CAC5B,QAAS9B,CAAAA,CAAM8B,CAAAA,CAAO,EAAG9B,CAAAA,EAAO,CAAA,CAAGA,IAAO,CACxC,IAAMiH,CAAAA,CAAWjH,CAAAA,CAAM,GACjBjE,CAAAA,CAAIgL,CAAAA,CAAWE,CAAQ,CAAA,CAE7B,GAAIlL,CAAAA,GAAM,EAAA,CAEV,CAAA,GACEA,CAAAA,GAAM,IACNgL,CAAAA,CAAWE,CAAAA,CAAW,CAAC,CAAA,GAAM,EAAA,EAC7BF,EAAWE,CAAAA,CAAW,CAAC,CAAA,GAAM,EAAA,EAC7BF,EAAWE,CAAAA,CAAW,CAAC,IAAM,EAAA,CAC7B,CACAJ,EAAc,IAAA,CACd,KACF,CAEA,KAAA,CACF,CAIA,GAFAF,CAAAA,EAAAA,CAEI,CAACE,CAAAA,CACH,SAIF,IAAMc,CAAAA,CAAmBF,CAAAA,CAAa,MAAA,CAAO,CAACG,EAAKtE,CAAAA,GAAMsE,CAAAA,CAAMtE,CAAAA,CAAE,MAAA,CAAQ,CAAC,CAAA,CACpEsD,CAAAA,CAAgB,IAAI,UAAA,CAAWe,CAAgB,CAAA,CACjDlL,CAAAA,CAAM,EACV,IAAA,IAAWoL,CAAAA,IAASJ,EAClBb,CAAAA,CAAc,GAAA,CAAIiB,CAAAA,CAAOpL,CAAG,EAC5BA,CAAAA,EAAOoL,CAAAA,CAAM,OAEf,IAAMX,CAAAA,CAAe3J,EAAmBqJ,CAAa,CAAA,CAC/C5J,CAAAA,CAAS,IAAI9B,EAAOgM,CAAAA,CAAcV,CAAAA,EAAS,eAAgBA,CAAAA,EAAS,SAAS,EAG7EW,CAAAA,CAAY9F,CAAAA,CAASsF,CAAAA,CAAa,IAAA,CAClCS,EAAapK,CAAAA,CAAO,aAAA,EAAc,CAGpCsK,CAAAA,CACJ,GAAItK,CAAAA,CAAO,WAAA,EAAY,CAAG,CACxB,IAAM8K,CAAAA,CAAWN,CAAAA,CAAK,MAAML,CAAAA,CAAWA,CAAAA,CAAYC,CAAU,CAAA,CAC7DE,CAAAA,CAAWhB,EAAAA,CAAetJ,CAAAA,CAAQ8K,CAAQ,EAC5C,CAOA,GALArB,CAAAA,CAAK,IAAA,CAAK,IAAI1J,CAAAA,CAAIC,CAAAA,CAAQsK,CAAQ,CAAC,EAGnCjG,CAAAA,CAAS8F,CAAAA,CAAYC,EAAa3J,CAAAA,CAAY2J,CAAU,EAEpD/F,CAAAA,EAAUqF,CAAAA,CACZ,KAEJ,CAEA,GAAI,CAACG,CAAAA,CACH,KAEJ,CAEA,OAAOJ,CACT,CCrMO,IAAMsB,EAAAA,CAAN,MAAMC,CAAK,CAEP,KAED,WAAA,CAAYvB,CAAAA,CAAa,CAC/B,IAAA,CAAK,IAAA,CAAOA,EACd,CAOA,OAAO,eAAA,CAAgB/H,CAAAA,CAAqB8H,EAA6B,CACvE,IAAMC,EAAOF,CAAAA,CAAY7H,CAAAA,CAAQ8H,CAAO,CAAA,CACxC,OAAO,IAAIwB,CAAAA,CAAKvB,CAAI,CACtB,CAKA,aAAa,QAAA,CAASe,CAAAA,CAAYhB,CAAAA,CAAsC,CACtE,IAAMC,CAAAA,CAAO,MAAMc,EAAAA,CAAUC,CAAAA,CAAMhB,CAAO,CAAA,CAC1C,OAAO,IAAIwB,CAAAA,CAAKvB,CAAI,CACtB,CAQA,aAAa,OAAA,CAAQwB,CAAAA,CAAazB,EAAuC,CACvE,IAAM0B,CAAAA,CAAW,MAAM,MAAMD,CAAAA,CAAKzB,CAAAA,EAAS,WAAW,CAAA,CACtD,GAAI,CAAC0B,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,CAAE,CAAA,CAExF,IAAMxJ,CAAAA,CAAS,MAAMwJ,CAAAA,CAAS,WAAA,EAAY,CAC1C,OAAOF,EAAK,eAAA,CAAgBtJ,CAAAA,CAAQ8H,CAAO,CAC7C,CAMA,OAAO,cAAA,CACL2B,EACA3B,CAAAA,CACM,CACN,IAAMnH,CAAAA,CAAc8I,CAAAA,CAAW,MAAA,CAAO,KAAA,CACpCA,EAAW,UAAA,CACXA,CAAAA,CAAW,WAAaA,CAAAA,CAAW,UACrC,EACA,OAAOH,CAAAA,CAAK,eAAA,CAAgB3I,CAAAA,CAAamH,CAAO,CAClD,CAQA,OAAOxL,CAAAA,CAAiC,CACtC,GAAIA,CAAAA,GAAU,MAAA,CACZ,OAAOA,CAAAA,EAAS,GAAKA,CAAAA,CAAQ,IAAA,CAAK,KAAK,MAAA,CAAS,IAAA,CAAK,KAAKA,CAAK,CAAA,CAAI,MAAA,CAErE,IAAA,IAAWoN,KAAO,IAAA,CAAK,IAAA,CACrB,GAAIA,CAAAA,CAAI,OAAA,GAAW,OAAOA,CAG9B,CAMA,SAAA,CAAUpN,EAAoC,CAC5C,OAAO,KAAK,MAAA,CAAOA,CAAK,GAAG,MAC7B,CAMA,WAAA,CAAYA,CAAAA,CAAsC,CAChD,OAAO,IAAA,CAAK,OAAOA,CAAK,CAAA,EAAG,IAC7B,CACF","file":"index.js","sourcesContent":["/** Width of a single FITS header card in bytes (characters). */\nexport const LINE_WIDTH = 80\n\n/** Size of a FITS block in bytes. All FITS structures are padded to this boundary. */\nexport const BLOCK_LENGTH = 2880\n\n/** Number of header card lines per FITS block. */\nexport const LINES_PER_BLOCK = BLOCK_LENGTH / LINE_WIDTH // 36\n\n/** Default maximum number of header lines to parse. */\nexport const DEFAULT_MAX_HEADER_LINES = 600\n\n/** FITS special integer value representing a NULL pixel in compressed images. */\nexport const NULL_VALUE = -2147483647\n\n/** FITS special integer value representing a 0.0 pixel in compressed images. */\nexport const ZERO_VALUE = -2147483646\n\n/** Number of random values in the dithering sequence. */\nexport const N_RANDOM = 10000\n\n/** Library version. */\nexport const VERSION = __VERSION__\n","/**\n * Base error class for all FITS-related errors.\n */\nexport class FITSError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FITSError'\n }\n}\n\n/**\n * Error thrown during header parsing or validation.\n */\nexport class HeaderError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'HeaderError'\n }\n}\n\n/**\n * Error thrown during data unit reading or interpretation.\n */\nexport class DataError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'DataError'\n }\n}\n\n/**\n * Error thrown when decompression fails.\n */\nexport class DecompressionError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'DecompressionError'\n }\n}\n","import type { CardValue, ExtensionType, WarningCallback } from './types'\nimport { HeaderError } from './errors'\n\n/**\n * Context interface for verification functions — represents the header state\n * during parsing so verification functions can access current parse state.\n */\nexport interface VerifyContext {\n cardIndex: number\n primary: boolean\n extension: boolean\n extensionType?: ExtensionType\n warn: WarningCallback\n get(key: string): CardValue\n isPrimary(): boolean\n isExtension(): boolean\n}\n\nfunction verifyOrder(ctx: VerifyContext, keyword: string, order: number): void {\n if (order !== ctx.cardIndex) {\n ctx.warn(`${keyword} should appear at index ${order} in the FITS header`)\n }\n}\n\nfunction verifyBetween(keyword: string, value: number, lower: number, upper: number): void {\n if (value < lower || value > upper) {\n throw new HeaderError(`The ${keyword} value of ${value} is not between ${lower} and ${upper}`)\n }\n}\n\nfunction verifyBoolean(value: CardValue): boolean {\n return value === 'T' ? true : false\n}\n\n/**\n * Verification functions for reserved FITS header keywords.\n * Each function receives (ctx, value, isArray, index?) and returns the validated value.\n */\nexport const VerifyFns: Record<\n string,\n (ctx: VerifyContext, value: CardValue, isArray: boolean, index?: string) => CardValue\n> = {\n SIMPLE(ctx, value) {\n ctx.primary = true\n verifyOrder(ctx, 'SIMPLE', 0)\n return verifyBoolean(value)\n },\n\n XTENSION(ctx, value) {\n ctx.extension = true\n ctx.extensionType = value as ExtensionType\n verifyOrder(ctx, 'XTENSION', 0)\n return ctx.extensionType\n },\n\n BITPIX(ctx, value) {\n const v = parseInt(String(value), 10)\n verifyOrder(ctx, 'BITPIX', 1)\n if (![8, 16, 32, -32, -64].includes(v)) {\n throw new HeaderError(`BITPIX value ${v} is not permitted`)\n }\n return v\n },\n\n NAXIS(ctx, value, isArray) {\n const v = parseInt(String(value), 10)\n if (!isArray) {\n verifyOrder(ctx, 'NAXIS', 2)\n verifyBetween('NAXIS', v, 0, 999)\n if (ctx.isExtension()) {\n if (ctx.extensionType === 'TABLE' || ctx.extensionType === 'BINTABLE') {\n if (v !== 2) {\n throw new HeaderError(`NAXIS must be 2 for TABLE and BINTABLE extensions`)\n }\n }\n }\n }\n return v\n },\n\n PCOUNT(ctx, value) {\n const v = parseInt(String(value), 10)\n const naxis = ctx.get('NAXIS') as number\n const order = 1 + 1 + 1 + naxis\n verifyOrder(ctx, 'PCOUNT', order)\n if (ctx.isExtension()) {\n if (ctx.extensionType === 'IMAGE' || ctx.extensionType === 'TABLE') {\n if (v !== 0) {\n throw new HeaderError(`PCOUNT must be 0 for the ${ctx.extensionType} extensions`)\n }\n }\n }\n return v\n },\n\n GCOUNT(ctx, value) {\n const v = parseInt(String(value), 10)\n const naxis = ctx.get('NAXIS') as number\n const order = 1 + 1 + 1 + naxis + 1\n verifyOrder(ctx, 'GCOUNT', order)\n if (ctx.isExtension()) {\n if (\n ctx.extensionType === 'IMAGE' ||\n ctx.extensionType === 'TABLE' ||\n ctx.extensionType === 'BINTABLE'\n ) {\n if (v !== 1) {\n throw new HeaderError(`GCOUNT must be 1 for the ${ctx.extensionType} extensions`)\n }\n }\n }\n return v\n },\n\n EXTEND(ctx, value) {\n if (!ctx.isPrimary()) {\n throw new HeaderError('EXTEND must only appear in the primary header')\n }\n return verifyBoolean(value)\n },\n\n BSCALE(_ctx, value) {\n return parseFloat(String(value))\n },\n\n BZERO(_ctx, value) {\n return parseFloat(String(value))\n },\n\n BLANK(ctx, value) {\n const bitpix = ctx.get('BITPIX') as number\n if (bitpix <= 0) {\n ctx.warn(`BLANK is not to be used for BITPIX = ${bitpix}`)\n }\n return parseInt(String(value), 10)\n },\n\n DATAMIN(_ctx, value) {\n return parseFloat(String(value))\n },\n\n DATAMAX(_ctx, value) {\n return parseFloat(String(value))\n },\n\n EXTVER(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n EXTLEVEL(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n TFIELDS(_ctx, value) {\n const v = parseInt(String(value), 10)\n verifyBetween('TFIELDS', v, 0, 999)\n return v\n },\n\n TBCOL(ctx, value, _isArray, index) {\n const tfields = ctx.get('TFIELDS') as number\n if (index !== undefined) {\n verifyBetween('TBCOL', parseInt(index, 10), 0, tfields)\n }\n return value\n },\n\n ZIMAGE(_ctx, value) {\n return verifyBoolean(value)\n },\n\n ZCMPTYPE(_ctx, value) {\n const v = String(value)\n if (!['GZIP_1', 'RICE_1', 'PLIO_1', 'HCOMPRESS_1'].includes(v)) {\n throw new HeaderError(`ZCMPTYPE value ${v} is not permitted`)\n }\n if (!['RICE_1'].includes(v)) {\n throw new HeaderError(`Compress type ${v} is not yet implemented`)\n }\n return v\n },\n\n ZBITPIX(_ctx, value) {\n const v = parseInt(String(value), 10)\n if (![8, 16, 32, 64, -32, -64].includes(v)) {\n throw new HeaderError(`ZBITPIX value ${v} is not permitted`)\n }\n return v\n },\n\n ZNAXIS(_ctx, value, isArray) {\n const v = parseInt(String(value), 10)\n if (!isArray) {\n verifyBetween('ZNAXIS', v, 0, 999)\n }\n return v\n },\n\n ZTILE(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZSIMPLE(_ctx, value) {\n return value === 'T' ? true : false\n },\n\n ZPCOUNT(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZGCOUNT(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZDITHER0(_ctx, value) {\n return parseInt(String(value), 10)\n },\n}\n","import type { CardValue, HeaderCard, DataUnitType, ExtensionType, WarningCallback } from './types'\nimport { DEFAULT_MAX_HEADER_LINES } from './constants'\nimport { HeaderError } from './errors'\nimport { VerifyFns, type VerifyContext } from './header-verify'\n\n/**\n * Represents a parsed FITS header.\n *\n * A FITS header consists of 80-character card images containing\n * keyword = value / comment triplets.\n */\nexport class Header implements VerifyContext {\n private static readonly ARRAY_PATTERN = /(\\D+)(\\d+)/\n\n /** Whether this is a primary header (contains SIMPLE keyword). */\n primary = false\n /** Whether this is an extension header (contains XTENSION keyword). */\n extension = false\n /** The extension type if this is an extension header. */\n extensionType?: ExtensionType\n\n /** Storage for parsed header cards, keyed by keyword. */\n private cards: Map<string, HeaderCard> = new Map()\n /** Storage for COMMENT cards. */\n private comments: string[] = []\n /** Storage for HISTORY cards. */\n private history: string[] = []\n /** Running index of the current card being parsed. */\n cardIndex = 0\n\n /** Warning callback for non-fatal issues during parsing. */\n warn: WarningCallback\n\n /** Maximum number of header lines to parse. */\n private maxLines: number\n\n /** The raw header block string, preserved for reference. */\n readonly block: string\n\n constructor(\n block: string,\n maxLines: number = DEFAULT_MAX_HEADER_LINES,\n onWarning?: WarningCallback,\n ) {\n this.maxLines = maxLines\n this.warn = onWarning ?? console.warn\n this.block = block\n this.readBlock(block)\n }\n\n /**\n * Get the value for a header keyword.\n * Returns `null` if the keyword is not present.\n */\n get(key: string): CardValue {\n if (this.contains(key)) {\n return this.cards.get(key)!.value\n }\n return null\n }\n\n /**\n * Get a numeric value for a header keyword.\n * Returns the `fallback` (default `0`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a number.\n */\n getNumber(key: string, fallback?: number): number {\n const value = this.get(key)\n if (value === null) return fallback ?? 0\n if (typeof value === 'number') return value\n throw new HeaderError(`Expected number for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Get a string value for a header keyword.\n * Returns the `fallback` (default `''`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a string.\n */\n getString(key: string, fallback?: string): string {\n const value = this.get(key)\n if (value === null) return fallback ?? ''\n if (typeof value === 'string') return value\n throw new HeaderError(`Expected string for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Get a boolean value for a header keyword.\n * Returns the `fallback` (default `false`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a boolean.\n */\n getBoolean(key: string, fallback?: boolean): boolean {\n const value = this.get(key)\n if (value === null) return fallback ?? false\n if (typeof value === 'boolean') return value\n throw new HeaderError(`Expected boolean for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Set a keyword with a value and optional comment.\n */\n set(key: string, value: CardValue, comment: string = ''): void {\n this.cards.set(key, {\n index: this.cardIndex,\n value,\n comment,\n })\n this.cardIndex += 1\n }\n\n /**\n * Check if the header contains a specific keyword.\n */\n contains(key: string): boolean {\n return this.cards.has(key)\n }\n\n /**\n * Get all COMMENT card values.\n */\n getComments(): string[] {\n return this.comments\n }\n\n /**\n * Get all HISTORY card values.\n */\n getHistory(): string[] {\n return this.history\n }\n\n /**\n * Returns all keyword names in insertion order.\n */\n keys(): string[] {\n return Array.from(this.cards.keys())\n }\n\n /**\n * Determine if this header has an associated data unit based on NAXIS.\n */\n hasDataUnit(): boolean {\n const naxis = this.getNumber('NAXIS')\n if (naxis === 0) return false\n for (let i = 1; i <= naxis; i++) {\n if (this.getNumber(`NAXIS${i}`) !== 0) return true\n }\n return false\n }\n\n /**\n * Calculate the byte length of the associated data unit.\n */\n getDataLength(): number {\n if (!this.hasDataUnit()) {\n return 0\n }\n\n const naxis = this.getNumber('NAXIS')\n const naxisValues: number[] = []\n for (let i = 1; i <= naxis; i++) {\n naxisValues.push(this.getNumber(`NAXIS${i}`))\n }\n\n const bitpix = this.getNumber('BITPIX')\n let length = (naxisValues.reduce((a, b) => a * b, 1) * Math.abs(bitpix)) / 8\n length += this.getNumber('PCOUNT')\n\n return length\n }\n\n /**\n * Determine the data unit type from header keywords.\n */\n getDataType(): DataUnitType | null {\n switch (this.extensionType) {\n case 'BINTABLE':\n if (this.contains('ZIMAGE')) return 'CompressedImage'\n return 'BinaryTable'\n case 'TABLE':\n return 'Table'\n case 'IMAGE':\n if (this.hasDataUnit()) return 'Image'\n return null\n default:\n if (this.hasDataUnit()) return 'Image'\n return null\n }\n }\n\n /** Check if this is a primary header. */\n isPrimary(): boolean {\n return this.primary\n }\n\n /** Check if this is an extension header. */\n isExtension(): boolean {\n return this.extension\n }\n\n // --- Private parsing methods ---\n\n private readBlock(block: string): void {\n const lineWidth = 80\n const nLinesRaw = block.length / lineWidth\n const nLines = Math.min(nLinesRaw, this.maxLines)\n\n for (let i = 0; i < nLines; i++) {\n const line = block.slice(i * lineWidth, (i + 1) * lineWidth)\n this.readLine(line)\n }\n }\n\n private readLine(line: string): void {\n // Check bytes 1 to 8 for key or whitespace\n const key = line.slice(0, 8).trim()\n if (key === '') return\n\n // Get indicator and value portion\n const indicator = line.slice(8, 10)\n const rawValue = line.slice(10)\n\n // Check the indicator\n if (indicator !== '= ') {\n // Key will be either COMMENT, HISTORY, or END\n // For COMMENT/HISTORY, the value is everything after the keyword (pos 8)\n const fullValue = line.slice(8).trim()\n if (key === 'COMMENT') {\n this.comments.push(fullValue)\n } else if (key === 'HISTORY') {\n this.history.push(fullValue)\n }\n return\n }\n\n // Split value from comment (comment starts with ' /')\n // Must not match ' /' inside quoted string values\n let valueStr: string\n let comment: string\n if (rawValue.trimStart().startsWith(\"'\")) {\n // String value — find closing quote, skipping escaped quotes ('')\n const openQuote = rawValue.indexOf(\"'\")\n let closeQuote = -1\n let pos = openQuote + 1\n while (pos < rawValue.length) {\n const q = rawValue.indexOf(\"'\", pos)\n if (q === -1) break\n // Check if this is an escaped quote (followed by another quote)\n if (q + 1 < rawValue.length && rawValue[q + 1] === \"'\") {\n pos = q + 2 // Skip the escaped pair\n continue\n }\n closeQuote = q\n break\n }\n if (closeQuote !== -1) {\n const afterQuote = rawValue.slice(closeQuote + 1)\n const slashIdx = afterQuote.indexOf(' /')\n if (slashIdx !== -1) {\n valueStr = rawValue.slice(0, closeQuote + 1).trim()\n comment = afterQuote.slice(slashIdx + 2).trim()\n } else {\n valueStr = rawValue.slice(0, closeQuote + 1).trim()\n comment = ''\n }\n } else {\n valueStr = rawValue.trim()\n comment = ''\n }\n } else {\n const slashIdx = rawValue.indexOf(' /')\n if (slashIdx !== -1) {\n valueStr = rawValue.slice(0, slashIdx).trim()\n comment = rawValue.slice(slashIdx + 2).trim()\n } else {\n valueStr = rawValue.trim()\n comment = ''\n }\n }\n\n // Parse the value\n let value: CardValue\n if (valueStr.startsWith(\"'\")) {\n // String data type — strip surrounding quotes and unescape doubled quotes\n value = valueStr.slice(1, -1).replaceAll(\"''\", \"'\").trim()\n } else if (valueStr === 'T' || valueStr === 'F') {\n // Boolean — leave as string for verification functions to handle\n value = valueStr\n } else {\n // Numeric\n value = parseFloat(valueStr)\n }\n\n // Validate against reserved keyword rules\n value = this.validate(key, value)\n\n this.set(key, value, comment)\n }\n\n private validate(key: string, value: CardValue): CardValue {\n let baseKey = key\n let isArray = false\n let index: string | undefined\n\n const match = Header.ARRAY_PATTERN.exec(key)\n if (match) {\n isArray = true\n baseKey = match[1]!\n index = match[2]\n }\n\n if (baseKey in VerifyFns) {\n value = VerifyFns[baseKey]!(this, value, isArray, index)\n }\n\n return value\n }\n}\n","import type { Header } from './header'\nimport type { DataUnit } from './data-unit'\n\n/**\n * Header Data Unit — the fundamental building block of a FITS file.\n *\n * Each HDU contains a header and an optional data unit. The header\n * describes the structure and metadata of the data unit.\n */\nexport class HDU {\n readonly header: Header\n readonly data?: DataUnit\n\n constructor(header: Header, data?: DataUnit) {\n this.header = header\n this.data = data\n }\n\n /**\n * Check if this HDU has an associated data unit.\n */\n hasData(): boolean {\n return this.data !== undefined\n }\n}\n","import { BLOCK_LENGTH } from './constants'\n\n/**\n * Endian swap functions for converting big-endian data to host byte order.\n * FITS data is always stored in big-endian format.\n */\n/** 8-bit: no swap needed */\nconst swap8 = (value: number): number => value\n/** 16-bit endian swap */\nconst swap16 = (value: number): number => ((value & 0xff) << 8) | ((value >> 8) & 0xff)\n/** 32-bit endian swap */\nconst swap32 = (value: number): number =>\n ((value & 0xff) << 24) |\n ((value & 0xff00) << 8) |\n ((value >> 8) & 0xff00) |\n ((value >> 24) & 0xff)\n\nexport const swapEndian = {\n 8: swap8,\n B: swap8,\n 16: swap16,\n I: swap16,\n 32: swap32,\n J: swap32,\n} as Record<string | number, (value: number) => number>\n\n/** Shared TextDecoder instance for ASCII decoding. */\nconst textDecoder = new TextDecoder('ascii')\n\n/**\n * Convert a Uint8Array to a string (ASCII decoding).\n */\nexport function uint8ArrayToString(arr: Uint8Array): string {\n return textDecoder.decode(arr)\n}\n\n/**\n * Calculate the number of excess (padding) bytes needed to reach a FITS block boundary.\n */\nexport function excessBytes(length: number): number {\n return (BLOCK_LENGTH - (length % BLOCK_LENGTH)) % BLOCK_LENGTH\n}\n\n/**\n * Convert a byte to an array of 8 bits (MSB first).\n */\nexport function toBits(byte: number): number[] {\n const arr: number[] = []\n let i = 128\n while (i >= 1) {\n arr.push(byte & i ? 1 : 0)\n i >>= 1\n }\n return arr\n}\n","import { swapEndian } from './utils'\n\n/**\n * Base class for FITS data units (Image, BinaryTable, Table, CompressedImage).\n *\n * FITS data is always stored in big-endian format. This base class provides\n * shared infrastructure for endian swapping and buffer management.\n */\nexport class DataUnit {\n /** The ArrayBuffer containing raw data (available when loaded from buffer). */\n buffer?: ArrayBuffer\n /** The Blob containing raw data (available when loaded from file). */\n blob?: Blob\n\n /** Static endian swap functions keyed by type code or byte size. */\n static readonly swapEndian = swapEndian\n\n constructor(data: ArrayBuffer | Blob) {\n if (data instanceof ArrayBuffer) {\n this.buffer = data\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n this.blob = data\n }\n }\n}\n","import type { TypedArray } from './types'\n\n/**\n * Compute the minimum and maximum pixel values in a typed array,\n * ignoring NaN values.\n *\n * @returns A tuple [min, max], or [NaN, NaN] if all values are NaN.\n */\nexport function getExtent(arr: TypedArray | Float32Array): [number, number] {\n const len = arr.length\n let min: number | undefined\n let max: number | undefined\n let i = 0\n\n // Find first non-NaN value\n for (; i < len; i++) {\n const value = arr[i]!\n if (!isNaN(value)) {\n min = max = value\n i++\n break\n }\n }\n\n if (min === undefined || max === undefined) {\n return [NaN, NaN]\n }\n\n // Continue forward loop to find extent\n for (; i < len; i++) {\n const value = arr[i]!\n if (isNaN(value)) continue\n if (value < min) min = value\n else if (value > max) max = value\n }\n\n return [min, max]\n}\n\n/**\n * Get a single pixel value from a flat array given x, y coordinates and image width.\n */\nexport function getPixel(\n arr: TypedArray | Float32Array,\n x: number,\n y: number,\n width: number,\n): number {\n const index = y * width + x\n if (index < 0 || index >= arr.length) {\n return NaN\n }\n return arr[index]!\n}\n","import { DataUnit } from './data-unit'\nimport { getExtent, getPixel } from './image-utils'\nimport type { Header } from './header'\nimport type { TypedArray } from './types'\n\ninterface FrameOffset {\n begin: number\n buffers?: ArrayBuffer[]\n}\n\n/**\n * Represents a standard FITS image stored in the data unit of a FITS file.\n * Supports BITPIX values: 8, 16, 32, -32, -64\n * Supports data cubes (NAXIS > 2) with frame-by-frame reading.\n */\nexport class Image extends DataUnit {\n readonly bitpix: number\n readonly naxis: number[]\n readonly width: number\n readonly height: number\n readonly depth: number\n readonly bzero: number\n readonly bscale: number\n readonly bytes: number\n readonly length: number\n readonly frameLength: number\n readonly frameOffsets: FrameOffset[]\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(data)\n\n const naxisCount = header.getNumber('NAXIS')\n this.bitpix = header.getNumber('BITPIX')\n\n this.naxis = []\n for (let i = 1; i <= naxisCount; i++) {\n this.naxis.push(header.getNumber(`NAXIS${i}`))\n }\n\n this.width = header.getNumber('NAXIS1')\n this.height = header.getNumber('NAXIS2', 1)\n this.depth = header.getNumber('NAXIS3', 1)\n this.bzero = header.getNumber('BZERO')\n this.bscale = header.getNumber('BSCALE', 1)\n this.bytes = Math.abs(this.bitpix) / 8\n this.length = (this.naxis.reduce((a, b) => a * b, 1) * Math.abs(this.bitpix)) / 8\n\n this.frameOffsets = []\n this.frameLength = this.bytes * this.width * this.height\n\n for (let i = 0; i < this.depth; i++) {\n const begin = i * this.frameLength\n const info: FrameOffset = { begin }\n if (this.buffer) {\n info.buffers = [this.buffer.slice(begin, begin + this.frameLength)]\n }\n this.frameOffsets.push(info)\n }\n }\n\n /**\n * Convert raw buffer bytes into pixel values with endian handling and BZERO/BSCALE.\n */\n static computeFrame(\n buffer: ArrayBuffer,\n bitpix: number,\n bzero: number,\n bscale: number,\n ): TypedArray {\n const bytes = Math.abs(bitpix) / 8\n const nPixels = buffer.byteLength / bytes\n const identity = bzero === 0 && bscale === 1\n const view = new DataView(buffer)\n const needFloat = !(Number.isInteger(bzero) && Number.isInteger(bscale))\n\n if (bitpix === 8) {\n if (identity) return new Uint8Array(buffer.slice(0))\n const result = needFloat ? new Float32Array(nPixels) : new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getUint8(i)\n }\n return result\n }\n\n if (bitpix === 16) {\n if (identity) {\n const result = new Int16Array(nPixels)\n for (let i = 0; i < nPixels; i++) result[i] = view.getInt16(i * 2, false)\n return result\n }\n const result = needFloat ? new Float32Array(nPixels) : new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getInt16(i * 2, false)\n }\n return result\n }\n\n if (bitpix === 32) {\n if (identity) {\n const result = new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) result[i] = view.getInt32(i * 4, false)\n return result\n }\n const result = new Float64Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getInt32(i * 4, false)\n }\n return result\n }\n\n if (bitpix === -32) {\n const result = new Float32Array(nPixels)\n if (identity) {\n for (let i = 0; i < nPixels; i++) result[i] = view.getFloat32(i * 4, false)\n } else {\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getFloat32(i * 4, false)\n }\n }\n return result\n }\n\n // bitpix === -64\n const result = new Float64Array(nPixels)\n if (identity) {\n for (let i = 0; i < nPixels; i++) result[i] = view.getFloat64(i * 8, false)\n } else {\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getFloat64(i * 8, false)\n }\n }\n return result\n }\n\n /**\n * Read a single frame from the image. For 2D images, frame is always 0.\n * For data cubes, frame selects the z-slice.\n *\n * @returns Promise resolving to pixel data as a typed array.\n */\n async getFrame(frame: number = 0): Promise<TypedArray> {\n const frameInfo = this.frameOffsets[frame]!\n\n if (frameInfo.buffers && frameInfo.buffers.length > 0) {\n return Image.computeFrame(frameInfo.buffers[0]!, this.bitpix, this.bzero, this.bscale)\n }\n\n // Read from blob\n if (!this.blob) {\n throw new Error('No data source available for this image frame')\n }\n\n const begin = frameInfo.begin\n const blobFrame = this.blob.slice(begin, begin + this.frameLength)\n const arrayBuffer = await blobFrame.arrayBuffer()\n\n // Cache the buffer for future access\n frameInfo.buffers = [arrayBuffer]\n\n return Image.computeFrame(arrayBuffer, this.bitpix, this.bzero, this.bscale)\n }\n\n /**\n * Read multiple sequential frames from a data cube.\n *\n * @param startFrame - First frame index to read.\n * @param count - Number of frames to read.\n * @returns Promise resolving to an array of typed arrays, one per frame.\n */\n async getFrames(startFrame: number, count: number): Promise<TypedArray[]> {\n const indices = Array.from({ length: count }, (_, i) => startFrame + i)\n return Promise.all(indices.map((i) => this.getFrame(i)))\n }\n\n /** Check if the image is a data cube (more than 2 axes). */\n isDataCube(): boolean {\n return this.naxis.length > 2\n }\n\n /**\n * Async iterator for frame-by-frame reading of data cubes.\n * Yields each frame sequentially from index 0 to depth-1.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TypedArray> {\n for (let i = 0; i < this.depth; i++) {\n yield this.getFrame(i)\n }\n }\n\n /** Compute min/max pixel values of an array, ignoring NaN. */\n getExtent(arr: TypedArray): [number, number] {\n return getExtent(arr)\n }\n\n /** Get a single pixel value at (x, y) from a pixel array. */\n getPixel(arr: TypedArray, x: number, y: number): number {\n return getPixel(arr, x, y, this.width)\n }\n}\n","/**\n * FITS standard BITPIX values representing data types in image arrays.\n * Positive values are integer types, negative values are floating point.\n */\nexport type BitPix = 8 | 16 | 32 | -32 | -64\n\n/**\n * Extended BITPIX values used in compressed images (ZBITPIX).\n */\nexport type ZBitPix = 8 | 16 | 32 | 64 | -32 | -64\n\n/**\n * Possible value types stored in a FITS header card.\n */\nexport type CardValue = string | number | boolean | null\n\n/**\n * A single header card entry with its positional index, value, and optional comment.\n */\nexport interface HeaderCard {\n index: number\n value: CardValue\n comment: string\n}\n\n/**\n * Types of FITS data units.\n */\nexport type DataUnitType = 'Image' | 'BinaryTable' | 'Table' | 'CompressedImage'\n\n/**\n * FITS extension types as stored in the XTENSION keyword.\n */\nexport type ExtensionType = 'IMAGE' | 'BINTABLE' | 'TABLE'\n\n/**\n * Compression algorithms supported by the FITS tiled image convention.\n */\nexport type CompressionType = 'GZIP_1' | 'RICE_1' | 'PLIO_1' | 'HCOMPRESS_1'\n\n/**\n * Quantization methods for compressed images.\n */\nexport type QuantizationType = 'LINEAR_SCALING' | 'SUBTRACTIVE_DITHER_1' | 'SUBTRACTIVE_DITHER_2'\n\n/**\n * Binary table format type codes (single character descriptors).\n */\nexport type BinaryTableTypeCode =\n | 'L' // Logical\n | 'B' // Unsigned byte\n | 'I' // 16-bit integer\n | 'J' // 32-bit integer\n | 'K' // 64-bit integer\n | 'A' // Character\n | 'E' // Single-precision float\n | 'D' // Double-precision float\n | 'C' // Single-precision complex\n | 'M' // Double-precision complex\n | 'X' // Bit\n\n/**\n * ASCII table format type codes.\n */\nexport type AsciiTableTypeCode = 'A' | 'I' | 'F' | 'E' | 'D'\n\n/**\n * Byte sizes for each binary table type code.\n */\nexport const BINARY_TYPE_BYTE_SIZES: Record<string, number> = {\n L: 1,\n B: 1,\n I: 2,\n J: 4,\n K: 8,\n A: 1,\n E: 4,\n D: 8,\n C: 8,\n M: 16,\n}\n\n/**\n * A binary table accessor function reads a value from a DataView at the given offset\n * and returns the value plus the new offset.\n */\nexport type BinaryAccessor = (view: DataView, offset: number) => [value: unknown, newOffset: number]\n\n/**\n * An ASCII table accessor transforms a string value into the appropriate type.\n */\nexport type AsciiAccessor = (value: string) => CardValue\n\n/**\n * Typed array constructors mapped by binary type codes.\n */\nexport const TYPED_ARRAY_CONSTRUCTORS: Record<string, TypedArrayConstructor> = {\n B: Uint8Array,\n I: Int16Array,\n J: Int32Array,\n E: Float32Array,\n D: Float64Array,\n 1: Uint8Array,\n 2: Int16Array,\n 4: Int32Array,\n}\n\nexport type TypedArrayConstructor =\n | Uint8ArrayConstructor\n | Int8ArrayConstructor\n | Uint16ArrayConstructor\n | Int16ArrayConstructor\n | Uint32ArrayConstructor\n | Int32ArrayConstructor\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n\nexport type TypedArray =\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array\n\n/**\n * Warning callback type for non-fatal issues during parsing.\n */\nexport type WarningCallback = (message: string) => void\n\n/**\n * Options for reading FITS data.\n */\nexport interface ReadOptions {\n /** Maximum number of header lines to parse (default: 600) */\n maxHeaderLines?: number\n /** Callback for non-fatal warnings during parsing (default: console.warn) */\n onWarning?: WarningCallback\n}\n\n/**\n * Options for fetching remote FITS files.\n */\nexport interface FetchOptions extends ReadOptions {\n /** Additional fetch options (headers, signal, etc.) */\n requestInit?: RequestInit\n}\n\n/**\n * Row data from a table, keyed by column name.\n */\nexport type TableRow = Record<string, unknown>\n\n/**\n * Compression algorithm parameters (e.g., BLOCKSIZE, BYTEPIX).\n */\nexport type AlgorithmParameters = Record<string, number>\n","import { DataUnit } from './data-unit'\nimport type { Header } from './header'\nimport type { BinaryAccessor, TableRow, TypedArray } from './types'\nimport { TYPED_ARRAY_CONSTRUCTORS } from './types'\n\n/**\n * Abstract base class for tabular FITS extensions (TABLE and BINTABLE).\n *\n * Handles shared logic for row/column access, buffer management,\n * and accessor setup. Derived classes must implement `setAccessors` and `_getRows`.\n */\nexport abstract class Tabular extends DataUnit {\n /** Maximum memory (bytes) to hold when reading from blob. */\n protected maxMemory = 1048576\n\n readonly rowByteSize: number\n readonly rows: number\n readonly cols: number\n readonly length: number\n readonly heapLength: number\n readonly columns: string[] | null\n\n /** Accessor functions for each column. */\n protected accessors: BinaryAccessor[] = []\n /** Type descriptor for each column. */\n protected descriptors: string[] = []\n /** Byte length of each column element. */\n protected elementByteLengths: number[] = []\n /** TTYPE values for each column (used by subclasses to identify column roles). */\n protected columnTypes: string[] = []\n\n /** Heap data for variable-length arrays. */\n heap?: ArrayBuffer\n\n /** Typed array constructor map (used by BinaryTable). */\n protected typedArray: Record<string, new (length: number | ArrayBuffer) => TypedArray> =\n TYPED_ARRAY_CONSTRUCTORS as Record<string, new (length: number | ArrayBuffer) => TypedArray>\n\n // For blob-based reading\n private firstRowInBuffer = 0\n private lastRowInBuffer = 0\n private nRowsInBuffer = 0\n private cachedBuffer?: ArrayBuffer\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(data)\n\n this.rowByteSize = header.getNumber('NAXIS1')\n this.rows = header.getNumber('NAXIS2')\n this.cols = header.getNumber('TFIELDS')\n\n this.length = this.rowByteSize * this.rows\n this.heapLength = header.getNumber('PCOUNT')\n this.columns = this.getColumns(header)\n\n if (this.buffer) {\n // Keep separate buffer for heap\n this.heap = this.buffer.slice(this.length, this.length + this.heapLength)\n } else {\n this.firstRowInBuffer = 0\n this.lastRowInBuffer = 0\n this.nRowsInBuffer = Math.floor(this.maxMemory / this.rowByteSize)\n }\n\n // NOTE: Do NOT call setAccessors here.\n // Subclass field initializers run after super() returns,\n // which would overwrite values set by setAccessors.\n // Subclasses must call this.initAccessors(header) at the end of their own constructor.\n }\n\n /**\n * Subclasses must call this at the end of their constructor.\n */\n protected initAccessors(header: Header): void {\n this.resetAccessors()\n this.setAccessors(header)\n }\n\n /**\n * Clear all accessor arrays before re-initialization.\n */\n private resetAccessors(): void {\n this.accessors = []\n this.descriptors = []\n this.elementByteLengths = []\n this.columnTypes = []\n }\n\n /**\n * Derived classes must set up accessor functions for each column.\n */\n protected abstract setAccessors(header: Header): void\n\n /**\n * Derived classes must implement row parsing from a buffer.\n */\n protected abstract _getRows(buffer: ArrayBuffer, nRows: number): TableRow[] | Float32Array\n\n /**\n * Check if the specified row range is currently in memory.\n */\n private rowsInMemory(firstRow: number, lastRow: number): boolean {\n if (this.buffer && !this.blob) return true\n if (this.cachedBuffer) {\n if (firstRow < this.firstRowInBuffer) return false\n if (lastRow > this.lastRowInBuffer) return false\n return true\n }\n return false\n }\n\n /**\n * Get column names from the header.\n */\n private getColumns(header: Header): string[] | null {\n const columns: string[] = []\n for (let i = 1; i <= this.cols; i++) {\n const key = `TTYPE${i}`\n if (!header.contains(key)) return null\n columns.push(header.getString(key))\n }\n return columns\n }\n\n /**\n * Read a range of rows from the table.\n *\n * @param row - Starting row index (0-based).\n * @param number_ - Number of rows to read.\n */\n async getRows(\n row: number,\n number_: number,\n ): Promise<TableRow[] | Float32Array | ArrayLike<number>> {\n if (this.rowsInMemory(row, row + number_)) {\n let buf: ArrayBuffer\n if (this.cachedBuffer) {\n const offsetInCache = (row - this.firstRowInBuffer) * this.rowByteSize\n buf = this.cachedBuffer.slice(offsetInCache, offsetInCache + number_ * this.rowByteSize)\n } else if (this.buffer) {\n const begin = row * this.rowByteSize\n const end = begin + number_ * this.rowByteSize\n buf = this.buffer.slice(begin, end)\n } else {\n throw new Error('No data source available')\n }\n return this._getRows(buf, number_) as TableRow[] | Float32Array\n }\n\n // Read from blob\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const begin = row * this.rowByteSize\n const readRows = Math.max(this.nRowsInBuffer, number_)\n const end = begin + readRows * this.rowByteSize\n const blobSlice = this.blob.slice(begin, end)\n const arrayBuffer = await blobSlice.arrayBuffer()\n\n this.cachedBuffer = arrayBuffer\n this.firstRowInBuffer = row\n this.lastRowInBuffer = row + readRows\n\n return this._getRows(arrayBuffer, number_) as TableRow[] | Float32Array\n }\n\n /**\n * Read a table buffer for a range of rows.\n * Used internally for column-based reading from blob.\n */\n private async getTableBuffer(row: number, number_: number): Promise<ArrayBuffer> {\n const actualRows = Math.min(this.rows - row, number_)\n const begin = row * this.rowByteSize\n const end = begin + actualRows * this.rowByteSize\n\n if (this.buffer) {\n return this.buffer.slice(begin, end)\n }\n\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const blobSlice = this.blob.slice(begin, end)\n return blobSlice.arrayBuffer()\n }\n\n /**\n * Read all values from a single column.\n *\n * @param name - Column name.\n * @returns Array of column values.\n */\n async getColumn(name: string): Promise<unknown[]> {\n if (!this.columns) {\n throw new Error('Column names not available')\n }\n\n const colIndex = this.columns.indexOf(name)\n if (colIndex === -1) {\n throw new Error(`Column \"${name}\" not found`)\n }\n\n if (this.buffer && !this.blob) {\n // Table already in memory — use getRows\n const rows = (await this.getRows(0, this.rows)) as TableRow[]\n return rows.map((d) => d[name])\n }\n\n // Read column from blob in chunks\n const descriptor = this.descriptors[colIndex]\n const accessor = this.accessors[colIndex]!\n const elementByteOffset = this.elementByteLengths.slice(0, colIndex).reduce((a, b) => a + b, 0)\n\n const TypedArrayCtor =\n descriptor && this.typedArray[descriptor] ? this.typedArray[descriptor]! : null\n\n const column: unknown[] = TypedArrayCtor\n ? Array.from(new TypedArrayCtor(this.rows))\n : new Array(this.rows)\n\n const rowsPerIteration = Math.min(\n Math.max(1, Math.floor(this.maxMemory / this.rowByteSize)),\n this.rows,\n )\n\n const factor = this.rows / rowsPerIteration\n let iterations = Math.floor(factor) === factor ? factor : Math.floor(factor) + 1\n let i = 0\n let chunkIndex = 0\n\n while (iterations > 0) {\n const startRow = chunkIndex * rowsPerIteration\n const buffer = await this.getTableBuffer(startRow, rowsPerIteration)\n const nRows = buffer.byteLength / this.rowByteSize\n const view = new DataView(buffer)\n let offset = elementByteOffset\n\n for (let r = 0; r < nRows; r++) {\n column[i] = accessor(view, offset)[0]\n i++\n offset += this.rowByteSize\n }\n\n iterations--\n chunkIndex++\n }\n\n return column\n }\n}\n","import { Tabular } from './tabular'\nimport type { Header } from './header'\nimport type { TableRow } from './types'\nimport { uint8ArrayToString } from './utils'\n\n/**\n * ASCII table accessor functions keyed by format code.\n */\nconst ASCII_ACCESSORS: Record<string, (value: string) => string | number> = {\n A: (value: string) => value.trim(),\n I: (value: string) => parseInt(value, 10),\n F: (value: string) => parseFloat(value),\n E: (value: string) => parseFloat(value),\n D: (value: string) => parseFloat(value),\n}\n\n/**\n * Reads ASCII tables from FITS files (XTENSION = 'TABLE').\n *\n * ASCII tables store data as fixed-width text fields where each row\n * is a sequence of ASCII characters.\n */\nexport class Table extends Tabular {\n private asciiAccessors: ((value: string) => string | number)[] = []\n /** 0-based start positions for each column within a row. */\n private colStarts: number[] = []\n /** Character widths for each column. */\n private colWidths: number[] = []\n /** Whether TBCOL keywords were found in the header. */\n private hasTBCOL = false\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(header, data)\n this.initAccessors(header)\n }\n\n protected setAccessors(header: Header): void {\n this.asciiAccessors = []\n this.colStarts = []\n this.colWidths = []\n this.hasTBCOL = false\n const pattern = /([AIFED])(\\d+)\\.*(\\d+)*/\n\n // First pass: check if any TBCOL keywords exist\n for (let i = 1; i <= this.cols; i++) {\n if (header.contains(`TBCOL${i}`)) {\n this.hasTBCOL = true\n break\n }\n }\n\n for (let i = 1; i <= this.cols; i++) {\n const form = header.getString(`TFORM${i}`)\n const match = pattern.exec(form)\n if (!match) {\n this.asciiAccessors.push((v: string) => v.trim())\n this.colStarts.push(0)\n this.colWidths.push(0)\n continue\n }\n\n const descriptor = match[1]!\n const width = parseInt(match[2]!, 10)\n const fn = ASCII_ACCESSORS[descriptor] ?? ((v: string) => v.trim())\n this.asciiAccessors.push(fn)\n\n // TBCOL is 1-based per FITS standard\n const tbcol = header.contains(`TBCOL${i}`) ? header.getNumber(`TBCOL${i}`) - 1 : 0\n this.colStarts.push(tbcol)\n this.colWidths.push(width)\n }\n }\n\n protected override _getRows(buffer: ArrayBuffer, _nRows?: number): TableRow[] {\n const nRows = buffer.byteLength / this.rowByteSize\n const arr = new Uint8Array(buffer)\n const rows: TableRow[] = []\n const accessors = this.asciiAccessors ?? []\n\n for (let i = 0; i < nRows; i++) {\n const begin = i * this.rowByteSize\n const end = begin + this.rowByteSize\n const subarray = arr.subarray(begin, end)\n const line = uint8ArrayToString(subarray)\n\n const row: TableRow = {}\n if (this.hasTBCOL) {\n // Fixed-width extraction using TBCOL positions\n for (let j = 0; j < accessors.length; j++) {\n const start = this.colStarts[j]!\n const width = this.colWidths[j]!\n const value = line.substring(start, start + width).trim()\n if (this.columns) {\n row[this.columns[j]!] = accessors[j]!(value)\n }\n }\n } else {\n // Fallback: whitespace splitting (when TBCOL is not available)\n const fields = line.trim().split(/\\s+/)\n for (let j = 0; j < accessors.length; j++) {\n const value = fields[j] ?? ''\n if (this.columns) {\n row[this.columns[j]!] = accessors[j]!(value)\n }\n }\n }\n rows.push(row)\n }\n\n return rows\n }\n}\n","import { Tabular } from './tabular'\nimport { DecompressionError } from './errors'\nimport type { Header } from './header'\nimport type { BinaryAccessor, TableRow, TypedArray } from './types'\nimport { BINARY_TYPE_BYTE_SIZES, TYPED_ARRAY_CONSTRUCTORS } from './types'\nimport { swapEndian, toBits } from './utils'\n\n/**\n * Binary table data accessor functions keyed by type code.\n * Each returns [value, newOffset].\n */\nconst DATA_ACCESSORS: Record<string, (view: DataView, offset: number) => [unknown, number]> = {\n L(view, offset) {\n const x = view.getInt8(offset)\n return [x === 84, offset + 1]\n },\n B(view, offset) {\n return [view.getUint8(offset), offset + 1]\n },\n I(view, offset) {\n return [view.getInt16(offset, false), offset + 2]\n },\n J(view, offset) {\n return [view.getInt32(offset, false), offset + 4]\n },\n K(view, offset) {\n const val = view.getBigInt64(offset, false)\n return [Number(val), offset + 8]\n },\n A(view, offset) {\n const val = String.fromCharCode(view.getUint8(offset))\n return [val, offset + 1]\n },\n E(view, offset) {\n return [view.getFloat32(offset, false), offset + 4]\n },\n D(view, offset) {\n return [view.getFloat64(offset, false), offset + 8]\n },\n C(view, offset) {\n const val1 = view.getFloat32(offset, false)\n const val2 = view.getFloat32(offset + 4, false)\n return [[val1, val2], offset + 8]\n },\n M(view, offset) {\n const val1 = view.getFloat64(offset, false)\n const val2 = view.getFloat64(offset + 8, false)\n return [[val1, val2], offset + 16]\n },\n}\n\n/**\n * Reads binary tables from FITS files (XTENSION = 'BINTABLE').\n *\n * Binary tables support a rich set of data types including logical,\n * integer, float, complex, character, bit arrays, and variable-length\n * array descriptors pointing to a heap area.\n */\nexport class BinaryTable extends Tabular {\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(header, data)\n this.initAccessors(header)\n }\n\n protected setAccessors(header: Header): void {\n const pattern = /(\\d*)([PQ]*)([LXBIJKAEDCM])$/\n\n for (let i = 1; i <= this.cols; i++) {\n const form = header.getString(`TFORM${i}`)\n const type = header.getString(`TTYPE${i}`)\n const match = pattern.exec(form)\n if (!match) {\n throw new Error(`Unsupported or invalid TFORM${i} value: '${form}'`)\n }\n\n const count = parseInt(match[1]!, 10) || 1\n const isArray = match[2]!\n const descriptor = match[3]!\n\n this.descriptors.push(descriptor)\n this.columnTypes.push(type)\n this.elementByteLengths.push((BINARY_TYPE_BYTE_SIZES[descriptor] ?? 1) * count)\n\n if (isArray) {\n this.setupArrayAccessor(descriptor, type)\n } else if (count === 1) {\n this.setupSingleAccessor(descriptor)\n } else if (descriptor === 'X') {\n this.setupBitArrayAccessor(count)\n } else if (descriptor === 'A') {\n this.setupCharArrayAccessor(count)\n } else {\n this.setupMultiAccessor(descriptor, count)\n }\n }\n }\n\n /**\n * Read data from the heap area following the main table data.\n */\n protected getFromHeap(view: DataView, offset: number, descriptor: string): [TypedArray, number] {\n const length = view.getInt32(offset, false)\n offset += 4\n const heapOffset = view.getInt32(offset, false)\n offset += 4\n\n if (!this.heap) {\n throw new Error('Heap not available')\n }\n\n const bytesPerElement = BINARY_TYPE_BYTE_SIZES[descriptor] ?? 1\n const heapSlice = this.heap.slice(heapOffset, heapOffset + length * bytesPerElement)\n const Ctor = TYPED_ARRAY_CONSTRUCTORS[descriptor]\n if (!Ctor) {\n throw new Error(`No typed array constructor for descriptor: ${descriptor}`)\n }\n\n const arr = new Ctor(heapSlice) as TypedArray\n\n // Endian swap (byte arrays don't need swapping)\n const swapFn = swapEndian[descriptor]\n if (swapFn && descriptor !== 'B') {\n for (let j = 0; j < arr.length; j++) {\n ;(arr as Int32Array)[j] = swapFn(arr[j]!) as number\n }\n }\n\n return [arr, offset]\n }\n\n private setupArrayAccessor(descriptor: string, type: string): void {\n if (type === 'COMPRESSED_DATA') {\n const accessor: BinaryAccessor = (view, offset) => {\n const [arr, newOffset] = this.getFromHeap(view, offset, descriptor)\n // Rice decompression is handled by CompressedImage subclass\n return [arr, newOffset]\n }\n this.accessors.push(accessor)\n } else if (type === 'GZIP_COMPRESSED_DATA') {\n const accessor: BinaryAccessor = (_view, _offset) => {\n throw new DecompressionError('GZIP decompression is not yet implemented')\n }\n this.accessors.push(accessor)\n } else {\n const accessor: BinaryAccessor = (view, offset) => {\n return this.getFromHeap(view, offset, descriptor)\n }\n this.accessors.push(accessor)\n }\n }\n\n private setupSingleAccessor(descriptor: string): void {\n const dataAccessor = DATA_ACCESSORS[descriptor]\n if (!dataAccessor) {\n throw new Error(`Unknown binary table type code: ${descriptor}`)\n }\n const accessor: BinaryAccessor = (view, offset) => {\n return dataAccessor(view, offset)\n }\n this.accessors.push(accessor)\n }\n\n private setupBitArrayAccessor(count: number): void {\n const nBytes = Math.ceil(count / 8)\n const accessor: BinaryAccessor = (view, offset) => {\n const buffer = view.buffer.slice(offset, offset + nBytes)\n const bytes = new Uint8Array(buffer)\n let bits: number[] = []\n for (let b = 0; b < bytes.length; b++) {\n bits = bits.concat(toBits(bytes[b]!))\n }\n return [bits.slice(0, count), offset + nBytes]\n }\n this.accessors.push(accessor)\n }\n\n private setupCharArrayAccessor(count: number): void {\n const accessor: BinaryAccessor = (view, offset) => {\n const buffer = view.buffer.slice(offset, offset + count)\n const arr = new Uint8Array(buffer)\n let s = ''\n for (let c = 0; c < arr.length; c++) {\n s += String.fromCharCode(arr[c]!)\n }\n return [s.trim(), offset + count]\n }\n this.accessors.push(accessor)\n }\n\n private setupMultiAccessor(descriptor: string, count: number): void {\n const dataAccessor = DATA_ACCESSORS[descriptor]\n if (!dataAccessor) {\n throw new Error(`Unknown binary table type code: ${descriptor}`)\n }\n const accessor: BinaryAccessor = (view, offset) => {\n const data: unknown[] = []\n let off = offset\n for (let c = 0; c < count; c++) {\n const [value, newOff] = dataAccessor(view, off)\n data.push(value)\n off = newOff\n }\n return [data, off]\n }\n this.accessors.push(accessor)\n }\n\n protected override _getRows(buffer: ArrayBuffer, nRows: number): TableRow[] | Float32Array {\n const view = new DataView(buffer)\n let offset = 0\n const rows: TableRow[] = []\n\n for (let r = 0; r < nRows; r++) {\n const row: TableRow = {}\n for (let c = 0; c < this.accessors.length; c++) {\n const [value, newOffset] = this.accessors[c]!(view, offset)\n offset = newOffset\n if (this.columns) {\n row[this.columns[c]!] = value\n }\n }\n rows.push(row)\n }\n\n return rows\n }\n}\n\nexport { DATA_ACCESSORS }\n","import type { TypedArray } from './types'\n\n/**\n * Setup functions for Rice decompression, keyed by bytepix (1, 2, or 4).\n * Each returns [fsbits, fsmax, lastpix, pointer].\n */\nexport const RiceSetup: Record<number, (array: Uint8Array) => [number, number, number, number]> = {\n 1(array) {\n const pointer = 1\n const fsbits = 3\n const fsmax = 6\n const lastpix = array[0]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n\n 2(array) {\n const pointer = 2\n const fsbits = 4\n const fsmax = 14\n let lastpix = 0\n lastpix = lastpix | (array[0]! << 8)\n lastpix = lastpix | array[1]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n\n 4(array) {\n const pointer = 4\n const fsbits = 5\n const fsmax = 25\n let lastpix = 0\n lastpix = lastpix | (array[0]! << 24)\n lastpix = lastpix | (array[1]! << 16)\n lastpix = lastpix | (array[2]! << 8)\n lastpix = lastpix | array[3]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n}\n\n/**\n * Rice decompression algorithm.\n *\n * Decompresses a byte array that was compressed using the Rice algorithm,\n * as defined in the FITS tiled image compression convention.\n *\n * @param array - Compressed byte array.\n * @param blocksize - Number of pixels encoded in a block.\n * @param bytepix - Number of bytes per original pixel (1, 2, or 4).\n * @param pixels - Output array to fill with decompressed values.\n * @param nx - Number of output pixels (tile length).\n * @param setup - Setup function map (default: RiceSetup).\n * @returns The filled pixels array.\n */\nexport function riceDecompress(\n array: Uint8Array,\n blocksize: number,\n bytepix: number,\n pixels: TypedArray,\n nx: number,\n setup: Record<number, (array: Uint8Array) => [number, number, number, number]> = RiceSetup,\n): TypedArray {\n const setupFn = setup[bytepix]\n if (!setupFn) {\n throw new Error(`Unsupported bytepix value: ${bytepix}`)\n }\n\n const [fsbits, fsmax, initialLastpix, initialPointer] = setupFn(array)\n let lastpix = initialLastpix\n let pointer = initialPointer\n\n const bbits = 1 << fsbits\n\n // Build non-zero count lookup table\n const nonzeroCount = new Uint8Array(256)\n let nzero = 8\n let k = 128\n let idx = 255\n while (idx >= 0) {\n while (idx >= k) {\n nonzeroCount[idx] = nzero\n idx--\n }\n k = k / 2\n nzero--\n }\n nonzeroCount[0] = 0\n\n // Bit buffer\n let b = array[pointer++]!\n let nbits = 8\n\n let i = 0\n while (i < nx) {\n nbits -= fsbits\n\n while (nbits < 0) {\n b = (b << 8) | array[pointer++]!\n nbits += 8\n }\n\n const fs = (b >> nbits) - 1\n b &= (1 << nbits) - 1\n\n let imax = i + blocksize\n if (imax > nx) imax = nx\n\n if (fs < 0) {\n // All pixels in block have same value\n while (i < imax) {\n ;(pixels as Int32Array)[i] = lastpix\n i++\n }\n } else if (fs === fsmax) {\n // Uncompressed block\n while (i < imax) {\n k = bbits - nbits\n let diff = b << k\n k -= 8\n while (k >= 0) {\n b = array[pointer++]!\n diff |= b << k\n k -= 8\n }\n if (nbits > 0) {\n b = array[pointer++]!\n diff |= b >> -k\n b &= (1 << nbits) - 1\n } else {\n b = 0\n }\n if ((diff & 1) === 0) {\n diff = diff >> 1\n } else {\n diff = ~(diff >> 1)\n }\n ;(pixels as Int32Array)[i] = diff + lastpix\n lastpix = (pixels as Int32Array)[i]!\n i++\n }\n } else {\n // Normal compressed block\n while (i < imax) {\n while (b === 0) {\n nbits += 8\n b = array[pointer++]!\n }\n nzero = nbits - nonzeroCount[b]!\n nbits -= nzero + 1\n b ^= 1 << nbits\n nbits -= fs\n while (nbits < 0) {\n b = (b << 8) | array[pointer++]!\n nbits += 8\n }\n let diff = (nzero << fs) | (b >> nbits)\n b &= (1 << nbits) - 1\n if ((diff & 1) === 0) {\n diff = diff >> 1\n } else {\n diff = ~(diff >> 1)\n }\n ;(pixels as Int32Array)[i] = diff + lastpix\n lastpix = (pixels as Int32Array)[i]!\n i++\n }\n }\n }\n\n return pixels\n}\n","import { BinaryTable } from './binary-table'\nimport { getExtent, getPixel } from './image-utils'\nimport { riceDecompress, RiceSetup } from './decompress'\nimport { N_RANDOM, NULL_VALUE, ZERO_VALUE } from './constants'\nimport { DecompressionError } from './errors'\nimport { TYPED_ARRAY_CONSTRUCTORS } from './types'\nimport type { Header } from './header'\nimport type { TableRow, TypedArray, AlgorithmParameters } from './types'\n\n/**\n * Predefined random number generator from the FITS tiled image compression standard.\n * This is the same method used by fpack when dithering images during compression.\n * See: http://arxiv.org/pdf/1201.1336v1.pdf\n */\nfunction generateRandomSequence(): Float32Array {\n const a = 16807\n const m = 2147483647\n let seed = 1\n\n const random = new Float32Array(N_RANDOM)\n for (let i = 0; i < N_RANDOM; i++) {\n const temp = a * seed\n seed = temp - m * Math.floor(temp / m)\n random[i] = seed / m\n }\n return random\n}\n\n/** Pre-computed random dithering sequence. */\nconst RANDOM_SEQUENCE = generateRandomSequence()\n\n/**\n * Reads Rice-compressed FITS images stored as binary tables.\n *\n * Compressed images are stored in BINTABLE extensions with ZIMAGE=T.\n * Each row in the table represents one tile of the image.\n * This class decompresses tiles and reconstructs the full image,\n * applying subtractive dithering when appropriate.\n */\nexport class CompressedImage extends BinaryTable {\n readonly zcmptype: string\n readonly zbitpix: number\n readonly znaxis: number\n readonly zblank: number | null\n readonly blank: number | null\n readonly zdither: number\n readonly ztile: number[]\n readonly width: number\n readonly height: number\n readonly bzero: number\n readonly bscale: number\n readonly algorithmParameters: AlgorithmParameters\n readonly zquantiz: string\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(header, data)\n\n this.zcmptype = header.getString('ZCMPTYPE')\n this.zbitpix = header.getNumber('ZBITPIX')\n this.znaxis = header.getNumber('ZNAXIS')\n this.zblank = header.contains('ZBLANK') ? header.getNumber('ZBLANK') : null\n this.blank = header.contains('BLANK') ? header.getNumber('BLANK') : null\n this.zdither = header.getNumber('ZDITHER0')\n\n this.ztile = []\n for (let i = 1; i <= this.znaxis; i++) {\n const ztile = header.contains(`ZTILE${i}`)\n ? header.getNumber(`ZTILE${i}`)\n : i === 1\n ? header.getNumber('ZNAXIS1')\n : 1\n this.ztile.push(ztile)\n }\n\n this.width = header.getNumber('ZNAXIS1')\n this.height = header.getNumber('ZNAXIS2', 1)\n\n // Set default compression parameters\n this.algorithmParameters = {}\n if (this.zcmptype === 'RICE_1') {\n this.algorithmParameters['BLOCKSIZE'] = 32\n this.algorithmParameters['BYTEPIX'] = 4\n }\n\n // Override with header-specified parameters\n let paramIdx = 1\n while (header.contains(`ZNAME${paramIdx}`)) {\n const name = header.getString(`ZNAME${paramIdx}`)\n const value = header.getNumber(`ZVAL${paramIdx}`)\n this.algorithmParameters[name] = value\n paramIdx++\n }\n\n this.zquantiz = header.getString('ZQUANTIZ', 'LINEAR_SCALING')\n this.bzero = header.getNumber('BZERO')\n this.bscale = header.getNumber('BSCALE', 1)\n\n // Re-initialize accessors now that CompressedImage fields are set.\n // BinaryTable.constructor already called initAccessors, but CompressedImage\n // overrides setAccessors and needs its own fields (width, algorithmParameters, etc.)\n // to be initialized first.\n this.initAccessors(header)\n }\n\n /**\n * Override setAccessors to replace compressed data column accessors\n * with decompression-aware versions. Delegates base TFORM parsing to BinaryTable.\n */\n protected override setAccessors(header: Header): void {\n // Let BinaryTable handle all the TFORM parsing and standard accessor setup\n super.setAccessors(header)\n\n // Now replace accessors for compressed columns\n for (let c = 0; c < this.columnTypes.length; c++) {\n const type = this.columnTypes[c]\n const descriptor = this.descriptors[c]!\n\n if (type === 'COMPRESSED_DATA') {\n this.accessors[c] = (view, offset) => {\n const [arr, newOffset] = this.getFromHeap(view, offset, descriptor)\n\n // Rice decompression\n const bytepix = this.algorithmParameters['BYTEPIX'] ?? 4\n const blocksize = this.algorithmParameters['BLOCKSIZE'] ?? 32\n const Ctor = TYPED_ARRAY_CONSTRUCTORS[bytepix]\n if (!Ctor) {\n throw new Error(`No typed array for bytepix: ${bytepix}`)\n }\n const tileSize = this.ztile[0] ?? this.width\n const pixels = new Ctor(tileSize) as TypedArray\n riceDecompress(arr as Uint8Array, blocksize, bytepix, pixels, tileSize, RiceSetup)\n return [pixels, newOffset]\n }\n } else if (type === 'GZIP_COMPRESSED_DATA') {\n this.accessors[c] = (_view, _offset) => {\n throw new DecompressionError('GZIP decompression is not yet implemented')\n }\n }\n }\n }\n\n /**\n * Override _getRows to handle compressed image tile decompression\n * and subtractive dithering.\n */\n protected override _getRows(buffer: ArrayBuffer, nRows: number): Float32Array {\n const view = new DataView(buffer)\n let offset = 0\n const arr = new Float32Array(this.width * this.height)\n\n let tileIndex = 0\n let rowsRemaining = nRows\n while (rowsRemaining--) {\n tileIndex++\n const row: TableRow = {}\n for (let c = 0; c < this.accessors.length; c++) {\n const [value, newOffset] = this.accessors[c]!(view, offset)\n offset = newOffset\n if (this.columns) {\n row[this.columns[c]!] = value\n }\n }\n\n // Get compressed data and scaling parameters\n const data = (row['COMPRESSED_DATA'] ||\n row['UNCOMPRESSED_DATA'] ||\n row['GZIP_COMPRESSED_DATA']) as Int32Array | Float32Array\n const scale = (row['ZSCALE'] as number) || this.bscale\n const zero = (row['ZZERO'] as number) || this.bzero\n\n // Tile number (1-based)\n const nTile = tileIndex\n\n // Dequantize each pixel in the tile\n const useDither =\n this.zquantiz === 'SUBTRACTIVE_DITHER_1' || this.zquantiz === 'SUBTRACTIVE_DITHER_2'\n\n // Subtractive dithering setup (only when dithering is enabled)\n let rIndex = 0\n let seed1 = 0\n if (useDither) {\n const seed0 = nTile + this.zdither - 1\n const seed1Initial = (seed0 - 1) % N_RANDOM\n seed1 = seed1Initial < 0 ? seed1Initial + N_RANDOM : seed1Initial\n rIndex = Math.floor(RANDOM_SEQUENCE[seed1]! * 500)\n }\n\n for (let idx = 0; idx < data.length; idx++) {\n const pixelIndex = (nTile - 1) * this.width + idx\n const value = data[idx]!\n\n if (value === NULL_VALUE) {\n arr[pixelIndex] = NaN\n } else if (value === ZERO_VALUE) {\n arr[pixelIndex] = 0\n } else if (useDither) {\n const r = RANDOM_SEQUENCE[rIndex]!\n arr[pixelIndex] = (value - r + 0.5) * scale + zero\n } else {\n arr[pixelIndex] = value * scale + zero\n }\n\n // Update random index (only when dithering)\n if (useDither) {\n rIndex++\n if (rIndex === N_RANDOM) {\n seed1 = (seed1 + 1) % N_RANDOM\n rIndex = Math.floor(RANDOM_SEQUENCE[seed1]! * 500)\n }\n }\n }\n }\n\n return arr\n }\n\n /**\n * Read a frame from the compressed image.\n * Exposes the same API as Image.getFrame() for consistency.\n */\n async getFrame(_nFrame: number = 0): Promise<Float32Array> {\n if (this.heap) {\n const result = await this.getRows(0, this.rows)\n return result as Float32Array\n }\n\n // Need to read heap from blob first\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const heapBlob = this.blob.slice(this.length, this.length + this.heapLength)\n this.heap = await heapBlob.arrayBuffer()\n\n return this.getFrame(_nFrame)\n }\n\n /** Compute min/max pixel values, ignoring NaN. */\n getExtent(arr: Float32Array): [number, number] {\n return getExtent(arr)\n }\n\n /** Get a single pixel value at (x, y). */\n getPixel(arr: Float32Array, x: number, y: number): number {\n return getPixel(arr, x, y, this.width)\n }\n}\n","import { BLOCK_LENGTH, LINE_WIDTH } from './constants'\nimport { Header } from './header'\nimport { HDU } from './hdu'\nimport { Image } from './image'\nimport { Table } from './table'\nimport { BinaryTable } from './binary-table'\nimport { CompressedImage } from './compressed-image'\nimport { excessBytes, uint8ArrayToString } from './utils'\nimport type { DataUnit } from './data-unit'\nimport type { DataUnitType, ReadOptions } from './types'\n\n/**\n * Data unit factory: creates the appropriate data unit subclass based on header info.\n */\nfunction createDataUnit(header: Header, data: ArrayBuffer | Blob): DataUnit | undefined {\n const type: DataUnitType | null = header.getDataType()\n if (!type) return undefined\n\n switch (type) {\n case 'Image':\n return new Image(header, data)\n case 'BinaryTable':\n return new BinaryTable(header, data)\n case 'Table':\n return new Table(header, data)\n case 'CompressedImage':\n return new CompressedImage(header, data)\n default:\n return undefined\n }\n}\n\n/**\n * Parse a FITS file from an ArrayBuffer.\n *\n * Reads 2880-byte blocks sequentially, looking for the END keyword\n * to delimit headers. After each header, the corresponding data unit\n * is sliced from the buffer and an HDU is created.\n *\n * @param buffer - The complete FITS file as an ArrayBuffer.\n * @returns Array of parsed HDUs.\n */\nexport function parseBuffer(buffer: ArrayBuffer, options?: ReadOptions): HDU[] {\n const hdus: HDU[] = []\n const totalLength = buffer.byteLength\n let offset = 0\n\n while (offset < totalLength) {\n // --- Read header blocks ---\n let blockCount = 0\n let headerStorage = new Uint8Array(0)\n let headerFound = false\n\n while (!headerFound && offset + blockCount * BLOCK_LENGTH + BLOCK_LENGTH <= totalLength) {\n const blockStart = offset + blockCount * BLOCK_LENGTH\n const blockBytes = new Uint8Array(buffer, blockStart, BLOCK_LENGTH)\n\n // Expand header storage\n const newStorage = new Uint8Array(headerStorage.length + BLOCK_LENGTH)\n newStorage.set(headerStorage, 0)\n newStorage.set(blockBytes, headerStorage.length)\n headerStorage = newStorage\n\n // Check block for END keyword (scanning rows bottom-up)\n const rows = BLOCK_LENGTH / LINE_WIDTH\n for (let row = rows - 1; row >= 0; row--) {\n const rowIndex = row * LINE_WIDTH\n const b = blockBytes[rowIndex]!\n\n // Skip whitespace rows\n if (b === 32) continue\n\n // Check for 'E' 'N' 'D' ' ' (69, 78, 68, 32)\n if (\n b === 69 &&\n blockBytes[rowIndex + 1] === 78 &&\n blockBytes[rowIndex + 2] === 68 &&\n blockBytes[rowIndex + 3] === 32\n ) {\n headerFound = true\n break\n }\n\n // If we hit a non-whitespace, non-END row, stop checking this block\n break\n }\n\n blockCount++\n\n if (!headerFound) {\n continue\n }\n\n // Parse header string\n const headerString = uint8ArrayToString(headerStorage)\n const header = new Header(headerString, options?.maxHeaderLines, options?.onWarning)\n\n // Calculate data unit position\n const headerEnd = offset + blockCount * BLOCK_LENGTH\n const dataLength = header.getDataLength()\n\n // Slice data unit bytes\n const dataSlice = buffer.slice(headerEnd, headerEnd + dataLength)\n\n // Create data unit if header indicates one\n let dataunit: DataUnit | undefined\n if (header.hasDataUnit()) {\n dataunit = createDataUnit(header, dataSlice)\n }\n\n // Store HDU\n hdus.push(new HDU(header, dataunit))\n\n // Advance offset past header + data + padding\n offset = headerEnd + dataLength + excessBytes(dataLength)\n\n // If we've reached the end of the file, stop\n if (offset >= totalLength) {\n break\n }\n }\n\n // Safety: if header was not found, break to avoid infinite loop\n if (!headerFound) {\n break\n }\n }\n\n return hdus\n}\n\n/**\n * Parse a FITS file from a Blob (File object) using streaming block reads.\n *\n * Reads header blocks incrementally (2880 bytes at a time) without loading\n * the entire file into memory. Data units are kept as Blob slices for\n * lazy on-demand reading, significantly reducing memory usage for large files.\n *\n * @param blob - The FITS file as a Blob or File object.\n * @returns Promise resolving to an array of parsed HDUs.\n */\nexport async function parseBlob(blob: Blob, options?: ReadOptions): Promise<HDU[]> {\n const hdus: HDU[] = []\n const totalLength = blob.size\n let offset = 0\n\n while (offset < totalLength) {\n // --- Read header blocks incrementally ---\n let blockCount = 0\n const headerChunks: Uint8Array[] = []\n let headerFound = false\n\n while (!headerFound && offset + blockCount * BLOCK_LENGTH + BLOCK_LENGTH <= totalLength) {\n const blockStart = offset + blockCount * BLOCK_LENGTH\n const blockBlob = blob.slice(blockStart, blockStart + BLOCK_LENGTH)\n const blockBuffer = await blockBlob.arrayBuffer()\n const blockBytes = new Uint8Array(blockBuffer)\n\n headerChunks.push(blockBytes)\n\n // Check block for END keyword (scanning rows bottom-up)\n const rows = BLOCK_LENGTH / LINE_WIDTH\n for (let row = rows - 1; row >= 0; row--) {\n const rowIndex = row * LINE_WIDTH\n const b = blockBytes[rowIndex]!\n\n if (b === 32) continue\n\n if (\n b === 69 &&\n blockBytes[rowIndex + 1] === 78 &&\n blockBytes[rowIndex + 2] === 68 &&\n blockBytes[rowIndex + 3] === 32\n ) {\n headerFound = true\n break\n }\n\n break\n }\n\n blockCount++\n\n if (!headerFound) {\n continue\n }\n\n // Assemble header string from chunks\n const totalHeaderBytes = headerChunks.reduce((sum, c) => sum + c.length, 0)\n const headerStorage = new Uint8Array(totalHeaderBytes)\n let pos = 0\n for (const chunk of headerChunks) {\n headerStorage.set(chunk, pos)\n pos += chunk.length\n }\n const headerString = uint8ArrayToString(headerStorage)\n const header = new Header(headerString, options?.maxHeaderLines, options?.onWarning)\n\n // Calculate data unit position\n const headerEnd = offset + blockCount * BLOCK_LENGTH\n const dataLength = header.getDataLength()\n\n // Create data unit using Blob slice (lazy — no data loaded yet)\n let dataunit: DataUnit | undefined\n if (header.hasDataUnit()) {\n const dataBlob = blob.slice(headerEnd, headerEnd + dataLength)\n dataunit = createDataUnit(header, dataBlob)\n }\n\n hdus.push(new HDU(header, dataunit))\n\n // Advance past header + data + padding\n offset = headerEnd + dataLength + excessBytes(dataLength)\n\n if (offset >= totalLength) {\n break\n }\n }\n\n if (!headerFound) {\n break\n }\n }\n\n return hdus\n}\n","import { parseBuffer, parseBlob } from './parser'\nimport { HDU } from './hdu'\nimport type { Header } from './header'\nimport type { DataUnit } from './data-unit'\nimport type { ReadOptions, FetchOptions } from './types'\n\n/**\n * Main FITS class — the primary entry point for reading FITS files.\n *\n * Provides static factory methods for creating FITS instances from\n * various data sources (ArrayBuffer, Blob/File, URL, Node.js Buffer).\n *\n * @example\n * ```ts\n * // From URL (browser)\n * const fits = await FITS.fromURL('https://example.com/image.fits');\n *\n * // From ArrayBuffer\n * const fits = FITS.fromArrayBuffer(buffer);\n *\n * // From File object (browser)\n * const fits = await FITS.fromBlob(fileInput.files[0]);\n *\n * // Access data\n * const header = fits.getHeader();\n * const image = fits.getDataUnit();\n * ```\n */\nexport class FITS {\n /** All Header Data Units in this FITS file. */\n readonly hdus: HDU[]\n\n private constructor(hdus: HDU[]) {\n this.hdus = hdus\n }\n\n // --- Static factory methods ---\n\n /**\n * Parse a FITS file from an ArrayBuffer (synchronous).\n */\n static fromArrayBuffer(buffer: ArrayBuffer, options?: ReadOptions): FITS {\n const hdus = parseBuffer(buffer, options)\n return new FITS(hdus)\n }\n\n /**\n * Parse a FITS file from a Blob or File object (async).\n */\n static async fromBlob(blob: Blob, options?: ReadOptions): Promise<FITS> {\n const hdus = await parseBlob(blob, options)\n return new FITS(hdus)\n }\n\n /**\n * Fetch a remote FITS file and parse it (async, browser or Node 18+).\n *\n * @param url - URL of the FITS file.\n * @param init - Optional fetch RequestInit (headers, signal, etc.).\n */\n static async fromURL(url: string, options?: FetchOptions): Promise<FITS> {\n const response = await fetch(url, options?.requestInit)\n if (!response.ok) {\n throw new Error(`Failed to fetch FITS file: ${response.status} ${response.statusText}`)\n }\n const buffer = await response.arrayBuffer()\n return FITS.fromArrayBuffer(buffer, options)\n }\n\n /**\n * Parse a FITS file from a Node.js Buffer.\n * The buffer is converted to an ArrayBuffer internally.\n */\n static fromNodeBuffer(\n nodeBuffer: { buffer: ArrayBuffer; byteOffset: number; byteLength: number },\n options?: ReadOptions,\n ): FITS {\n const arrayBuffer = nodeBuffer.buffer.slice(\n nodeBuffer.byteOffset,\n nodeBuffer.byteOffset + nodeBuffer.byteLength,\n )\n return FITS.fromArrayBuffer(arrayBuffer, options)\n }\n\n // --- Public API ---\n\n /**\n * Returns the first HDU containing a data unit.\n * If `index` is provided, returns that specific HDU.\n */\n getHDU(index?: number): HDU | undefined {\n if (index !== undefined) {\n return index >= 0 && index < this.hdus.length ? this.hdus[index] : undefined\n }\n for (const hdu of this.hdus) {\n if (hdu.hasData()) return hdu\n }\n return undefined\n }\n\n /**\n * Returns the header associated with the first HDU containing a data unit.\n * If `index` is provided, returns the header of that specific HDU.\n */\n getHeader(index?: number): Header | undefined {\n return this.getHDU(index)?.header\n }\n\n /**\n * Returns the data unit associated with the first HDU containing a data unit.\n * If `index` is provided, returns the data unit of that specific HDU.\n */\n getDataUnit(index?: number): DataUnit | undefined {\n return this.getHDU(index)?.data\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/constants.ts","../src/core/errors.ts","../src/fits/header-verify.ts","../src/fits/header.ts","../src/fits/hdu.ts","../src/core/utils.ts","../src/fits/data-unit.ts","../src/fits/image-utils.ts","../src/fits/image.ts","../src/core/types.ts","../src/fits/tabular.ts","../src/fits/table.ts","../src/fits/binary-table.ts","../src/fits/decompress.ts","../src/fits/hcompress-decode.ts","../src/fits/compressed-image.ts","../src/fits/parser.ts","../src/fits/index.ts","../src/xisf/xisf-errors.ts","../src/xisf/xisf-container.ts","../src/xisf/xisf-xml.ts","../src/xisf/xisf-location.ts","../src/xisf/xisf-property.ts","../src/xisf/xisf-table.ts","../src/xisf/xisf-image.ts","../src/xisf/xisf-codec.ts","../src/core/runtime.ts","../src/xisf/xisf-resolver.ts","../src/xisf/xisb-index.ts","../src/xisf/xisf-checksum.ts","../src/core/base64.ts","../src/xisf/xisf-signature.ts","../src/xisf/index.ts","../src/xisf/xisf-writer.ts","../src/fits/fits-writer.ts","../src/xisf/convert.ts","../src/ser/ser-errors.ts","../src/ser/ser-types.ts","../src/ser/ser-parser.ts","../src/ser/index.ts","../src/ser/ser-writer.ts","../src/ser/ser-convert.ts","../src/hips/hips-path.ts","../src/hips/hips-properties.ts","../src/hips/hips-wcs.ts","../src/hips/hips-tile.ts","../src/hips/index.ts","../src/hips/hips-reproject.ts","../src/hips/hips-build.ts","../src/hips/hips-remote.ts","../src/hips/hips-export.ts","../src/hips/hips-xisf-convert.ts","../src/hips/storage-target.ts","../src/validation/hips-lint.ts"],"names":["LINE_WIDTH","BLOCK_LENGTH","LINES_PER_BLOCK","DEFAULT_MAX_HEADER_LINES","NULL_VALUE","ZERO_VALUE","N_RANDOM","VERSION","FITSError","message","HeaderError","DataError","DecompressionError","verifyOrder","ctx","keyword","order","verifyBetween","value","lower","upper","verifyBoolean","VerifyFns","v","isArray","_ctx","bitpix","_isArray","index","tfields","Header","_Header","block","maxLines","onWarning","key","fallback","comment","a","b","card","naxis","i","naxisValues","length","nLinesRaw","nLines","line","indicator","rawValue","fullValue","valueStr","openQuote","closeQuote","pos","q","afterQuote","slashIdx","baseKey","match","HDU","header","data","swap8","swap16","swap32","swapEndian","textDecoder","uint8ArrayToString","arr","excessBytes","toBits","byte","DataUnit","isBigIntTypedArray","getExtent","min","max","len","getPixel","x","y","width","Image","_Image","naxisCount","begin","info","buffer","bzero","bscale","bytes","nPixels","identity","view","needFloat","result","zero","frame","frameInfo","arrayBuffer","pixels","out","startFrame","count","indices","_","BINARY_TYPE_BYTE_SIZES","TYPED_ARRAY_CONSTRUCTORS","Tabular","firstRow","lastRow","columns","row","number_","buf","offsetInCache","end","readRows","actualRows","name","colIndex","d","accessor","elementByteOffset","column","rowsPerIteration","factor","iterations","chunkIndex","startRow","nRows","offset","r","ASCII_ACCESSORS","Table","pattern","form","descriptor","fn","tbcol","_nRows","rows","accessors","subarray","j","start","fields","DATA_ACCESSORS","val1","val2","BinaryTable","type","heapOffset","bytesPerElement","heapSlice","Ctor","swapFn","newOffset","_view","_offset","dataAccessor","nBytes","bits","s","c","off","newOff","RiceSetup","array","lastpix","riceDecompress","blocksize","bytepix","nx","setup","setupFn","fsbits","fsmax","initialLastpix","initialPointer","pointer","bbits","nonzeroCount","nzero","k","idx","nbits","fs","imax","diff","HCOMPRESS_MAGIC0","HCOMPRESS_MAGIC1","BitReader","b0","b1","b2","b3","n","inputHuffman","reader","code","qtreeBitins","source","ny","target","rowStride","bit","planeValue","s00","qtreeCopy","nx2","ny2","s10","qtreeExpand","readBdirect","nqx","nqy","scratch","qtreeDecode","nBitplanes","nqmax","log2n","nqx2","nqy2","formatCode","nfx","nfy","unshuffle","values","n2","tmp","nhalf","pt","p1","p2","hsmooth","nxTop","nyTop","scale","smax","hm","h0","hp","dmax","dmin","hmm","hpm","hmp","hpp","hx2","hy2","m1","m2","undigitize","hinv","smooth","nmax","shift","bit0","bit1","bit2","mask0","mask1","mask2","prnd0","prnd1","prnd2","nrnd0","nrnd1","nrnd2","nxf","nyf","oddx","oddy","hx","hy","hc","lowbit0","lowbit1","decodeCore","magic0","magic1","sumAll","hDecompressInt32","input","globalCompressedImageDecoderProvider","setCompressedImageDecoderProvider","decoderProvider","getCompressedImageDecoderProvider","generateRandomSequence","seed","random","temp","RANDOM_SEQUENCE","decodePLIOWordsToPixels","lineList","tileSize","word","index1Based","lineLength","lineFirst","xs","xe","skipNextWord","outputPosition","x1","previousValue","ip","instruction","opcode","x2","i1","i2","outputTop","decodePLIOData","words","toByteView","decodeBigEndianTileValues","compressedBytes","zbitpix","CompressedImage","options","ztile","paramIdx","compressedData","raw","gunzipSync","decoded","provider","tileIndex1Based","nominalTileWidth","nominalTileHeight","tilesX","tileIndex0","tileXIndex","tileYIndex","height","tileIndex","rowsRemaining","nTile","tilePlacement","useDither","rIndex","seed1","seed1Initial","decodeLength","localX","localY","pixelIndex","_nFrame","heapBlob","createDataUnit","parseBuffer","hdus","totalLength","blockCount","headerStorage","headerFound","blockStart","blockBytes","newStorage","rowIndex","headerString","headerEnd","dataLength","dataSlice","dataunit","parseBlob","blob","headerChunks","blockBuffer","totalHeaderBytes","sum","chunk","dataBlob","FITS","_FITS","url","response","nodeBuffer","hdu","XISFError","XISFParseError","XISFValidationError","XISFResourceError","XISFCompressionError","XISFChecksumError","XISFSignatureError","XISFConversionError","XISF_SIGNATURE","SIGNATURE_LENGTH","HEADER_LENGTH_OFFSET","RESERVED_LENGTH","HEADER_OFFSET","readAscii","isMonolithicXISF","parseMonolithicContainer","signature","headerLength","headerBegin","headerBytes","headerXml","reserved","payload","extractAttachmentBytes","position","size","buildMonolithicContainer","attachments","total","attachment","XML_NS","nodeName","node","anyNode","local","isElementNode","parseXISFXML","xml","doc","DOMParser","parseErrors","root","version","getElementChildren","parent","getChildrenByName","e","getFirstChildByName","children","getNodeName","serializeXML","XMLSerializer","createDocument","URL_OR_PATH","parseIndexId","parseXISFLocation","location","trimmed","encoding","parts","kind","spec","indexId","parseCompressionSubblocks","entry","compressedSize","uncompressedSize","parseChecksumSpec","parseCompressionSpec","codec","itemSize","resolveHeaderRelativePath","pathSpec","headerDir","rel","SCALAR_ALIASES","VECTOR_BASE","MATRIX_BASE","normalizeScalarType","parseBoolean","lowered","parseComplexText","normalized","parseScalarValue","dataBlockByteOrder","scalarByteSize","decodeScalarFromBytes","byteOrder","little","decodePrimitiveArray","parseDataBlockAttributes","element","locationRaw","checksumRaw","compressionRaw","byteOrderRaw","subblocksRaw","dataBlock","checksum","compression","dataElement","embeddedCompressionRaw","parseVectorData","baseType","parsePropertyElement","readDataBlock","strict","id","format","property","valueAttr","lengthAttr","rowsAttr","columnsAttr","scalarType","itemCount","matrix","parseField","cloneCellAsProperty","field","propertyLike","parseRow","cells","cell","propertyNode","parseTableElement","resolveReference","caption","structureElement","ref","refId","rowElements","dataRows","rowElement","SAMPLE_FORMATS","COLOR_SPACES","PIXEL_STORAGES","ORIENTATIONS","CFA_PATTERN","parseNumberList","part","parseGeometry","channels","parseBounds","parseRGBWorkingSpace","gamma","Y","parseDisplayFunction","parseColorFilterArray","strictValidation","parseResolution","unit","horizontal","vertical","parseFITSKeyword","parseImageElement","decodeImageData","isThumbnail","geometryRaw","sampleFormat","dimensions","pixelStorage","colorSpace","orientation","offsetRaw","bounds","image","inlinedChildren","all","materialized","child","refElement","SHUFFLE_SUFFIX","ZLIB_LEVELS","LZ4_CODEC_NAMES","ZSTD_CODEC_NAMES","encodeUncompressedLz4Block","literalLength","extraLengthBytes","remaining","compressLz4","compressBound","hashTable","encodedSize","compressBlock","decompressLz4","written","decompressBlock","actualSize","DefaultXISFCodecProvider","canonical","baseCodec","level","normalizedLevel","zlibSync","outputBuffer","zstdDecompress","unzlibSync","shuffleBytes","trailing","dst","unshuffleBytes","src","splitBySubblocks","subblocks","blocks","decodeCompressedBlock","usesShuffle","decodeSingle","chunks","cursor","expected","encodeCompressedBlock","toCompress","dynamicImport","specifier","hasProcessObject","isReactNativeRuntime","isNodeRuntime","versions","runtimeLabel","importNodeModule","moduleName","context","hint","suffix","error","toUint8Array","resolveWithNodeFS","path","DefaultXISFResourceResolver","XISB_SIGNATURE","toNumber","parseXISBIndex","elements","nodeOffset","visited","nextNode","elementOffset","uniqueId","blockPosition","blockLength","uncompressedBlockLength","byId","item","sliceXISBBlock","buildXISBFile","ids","headerSize","nodeHeaderSize","elementSize","indexSize","sha3_256","sha3Module","sha3_512","toHex","digestSubtle","algorithm","digestInput","digest","h","computeChecksum","verifyChecksum","BASE64_ALPHABET","BASE64_LOOKUP","bytesToBinaryString","binaryStringToBytes","text","lookupBase64","normalizeBase64","remainder","encodeBase64Fallback","triple","decodeBase64Fallback","padding","oi","c0","c1","c2","c3","v0","v1","v2","v3","sextet2","sextet3","bytesToBase64","base64ToBytes","DSIG_NS","C14N_10","C14N_10_WITH_COMMENTS","C14N_11","C14N_11_WITH_COMMENTS","EXC_C14N","EXC_C14N_WITH_COMMENTS","ENVELOPED_SIGNATURE","BASE64_TRANSFORM","nodeLocalName","isElement","isComment","isTextLike","getChildrenByLocalName","localName","namespace","getFirstChildByLocalName","getDirectSignatureElement","hasDetachedSignature","toBase64Url","decodeBase64","encodeUtf8","toArrayBuffer","copy","escapeText","escapeAttribute","qName","prefix","declaredNamespaces","attr","copyNamespaceScope","removeEnvelopedSignatures","clone","walk","parseCanonicalizationMode","elementUsesPrefix","attributeUsesPrefix","attribute","canonicalizeElement","parentScope","mode","elementPrefix","elementNamespace","declared","activeScope","uri","namespacesToEmit","usedPrefixes","attrPrefix","parentValue","activeValue","defaultInScope","namespaceAttributes","normalAttributes","ans","bns","attributesText","opening","body","canonicalizeNode","closing","namespaceScope","pi","canonicalize","getTransformAlgorithms","reference","transforms","transform","findElementById","stack","current","resolveReferenceTarget","readNodeText","digestAlgorithmUriToSubtle","computeDigest","algorithmUri","subtleAlgorithm","cryptoModule","hashName","hash","signatureMethodSpec","trimBigEndianInteger","first","loadNodeCryptoKeyFromKeyInfo","keyInfo","x509","certNode","certBytes","keyValue","rsa","modulusNode","exponentNode","modulus","exponent","jwk","loadWebCryptoKeyFromKeyInfo","method","loadPublicKey","signatureElement","nodeError","webError","hashNameForNode","hashByteLength","verifySignatureValue","signedInfoBytes","signatureValueBytes","verifier","referenceToOctets","state","verifyReferences","signedInfo","references","digestMethod","digestValue","digestAlgorithm","expectedDigest","referencedData","computedDigest","normalizeResultFailure","reason","verifyDetachedSignature","canonicalizationMethod","canonicalizationAlgorithm","signatureMethodElement","signatureMethodUri","signatureValueElement","verified","withDefaults","decodeInlineData","warn","warning","maybeThrow","decodeInlineOrEmbedded","XISF","_XISF","readOptions","monolithicBuffer","detachedSignaturePresent","forceSignedChecksumValidation","byUid","uid","isExternalOrAttached","metadataProperties","standaloneProperties","standaloneTables","metadataElement","properties","images","imageNode","signatureResult","parsed","slash","dirPath","PROPERTY_VECTOR_BASE","PROPERTY_MATRIX_BASE","IMAGE_SAMPLE_FORMATS","IMAGE_COLOR_SPACES","IMAGE_PIXEL_STORAGES","imageSampleByteSize","propertyByteOrderRelevant","base","setScalar","normalizeComplexValue","record","flattenPropertyValue","encodeStructuredPropertyValue","encode","flatValues","componentSize","complex","baseOffset","vectorBase","flat","matrixBase","matrixLike","rawValues","validateImageForWrite","maybeApplyCompressionAndChecksum","compressed","compressionAttr","appendPropertyElement","pendingAttachments","maxInlineSize","encodeBase64","encoded","appendTableElement","table","tableElement","fieldElement","cellElement","addImageChildren","imageElement","assignAttachmentPositions","previousHeaderLength","aligned","resolved","XISFWriter","writeOptions","standaloneProperty","standaloneTable","storedData","positioned","blockRefs","attachExternalBlock","xisbBytes","padCard","formatValue","formatCard","valueText","padBlockLength","buildHeader","cards","withEnd","padded","writeFITS","headerBlocks","dataBlocks","paddedLength","createImageBytesFromArray","bytesPerSample","createImageHDU","params","U16_BZERO","U32_BZERO","U64_BZERO","FITS_PRESERVED_LAYOUT_PROPERTY","product","readViewValue","sampleSize","decodeXISFImageValues","scalarFormat","scalarSize","deinterleaved","di","p","encodeLittleEndian","encodeComplexLittleEndian","bytesPerComponent","normalizeInputToArrayBuffer","buildXISFMetaJSON","xisf","geometryFromImage","extraDepth","isStrict","isHeaderTrue","fits","parseHeaderValuePortion","getRawHeaderValue","parseStrictIntegerLiteral","isCanonicalUInt64BITPIX64","bscaleRaw","bzeroRaw","formatFITSKeywordValue","upsertMetadataString","metadata","readPreservedLayoutFromMetadata","toFITSWriteHDU","preserved","toPreservedHDU","convertXisfToFits","imageHDUs","depth","additionalCards","kw","rowSize","rowCount","preservedLayout","preservedHDUs","ordered","byIndex","maxIndex","metaJson","collectImageFrames","collectCanonicalUInt64Frames","frameIndex","frameBuffer","imageSampleFormatFromFITS","convertFitsToXisf","imageSourceIndices","preservedNonImageHDUs","restoredMeta","extname","channelCount","rowObjects","complexColumn","components","pair","fitsKeywords","geometry","SERError","SERParseError","SERValidationError","SERConversionError","SER_FILE_ID","SER_SUPPORTED_COLOR_IDS","SER_COLOR_CHANNELS","SER_BAYER_OR_CMY_PATTERN","SER_TICKS_AT_UNIX_EPOCH","NOOP_WARNING","_warning","readFixedAscii","isSupportedColorId","deriveByteOrderFromFlag","littleEndianFlag","policy","frameBytes","compat","score","endian","sampleCount","multiplesOf256","prev","smoothness","seenLowBytes","uniqueness","nonMultipleRatio","smoothRatio","compatScore","specScore","resolveFrameCountRelaxed","declaredFrameCount","availablePayloadBytes","frameByteLength","byFrameOnly","byFrameAndTs","parseFromArrayBuffer","sourceBlob","cfg","fileId","luId","colorIdRaw","pixelDepth","observer","instrument","telescope","startTime","startTimeUtc","colorId","frameCount","fixedFrameCount","firstFrameBytes","dataPayloadLength","trailerStart","trailerLength","timestampsPresent","timestamps","tsView","frameInfos","parseSERBuffer","parseSERBlob","decodeFrameSamples","samples","getCfaPattern","sampleAt","rgbChannelsForSymbol","symbol","decodeCfaToRGB","symbolAt","nearest","channel","radius","minX","maxX","minY","maxY","yy","xx","hasR","hasG","hasB","SER","_SER","ts","unixTicks","ms","last","ticks","duration","framePixels","frameSamples","frames","encodeFixedAscii","asBigInt","encodeLittleEndianFlag","littleEndian","normalizeFrameData","expectedLength","writeSER","expectedFrameLength","normalizedFrames","payloadSize","trailerSize","totalSize","SER_COLOR_CARD","SER_PIXEL_DEPTH_CARD","SER_FRAME_COUNT_CARD","SER_CHANNELS_CARD","SER_CHANNEL_ORDER_CARD","SER_LUID_CARD","SER_BYTE_ORDER_CARD","SER_OBSERVER_CARD","SER_INSTRUMENT_CARD","SER_TELESCOPE_CARD","SER_START_TIME_CARD","SER_START_TIME_UTC_CARD","SER_CFA_CARD","SER_FRAME_CARD","SER_TS_EXTNAME","toArrayBufferLike","asSER","asFits","toBigInt","getMetadata","getImageProperty","getSerMetadataScalar","imageProperty","getSerMetadataBigIntArray","emitConversionWarning","pushSERMetadataProperties","unitMetadata","ser","vec","frameSamplesToU8","frameSamplesToU16","buildTimestampExtension","inferColorIdFromXisf","parseHeaderCardBigInt","parseHeaderCardNumber","num","parseHeaderCardString","buildSerMetadataCards","cfaPattern","toPlanarFrameValues","ch","applyU16FitsOffset","getImageHDUs","inferFitsSourceLayout","metadataFrameCount","normalizeMultiHduImages","compatible","extractMonoFrameBytes","pixelsPerFrame","extractRgbFrameBytesFromCube","channelFrames","extractRgbFrameBytesFromHduTriplet","rImage","gImage","bImage","rFrame","gFrame","bFrame","convertSerToFits","layout","baseValues","mapped","imageData","convertFitsToSer","imageHDU","sourceLayout","layoutImageHDUs","allDepth3","allDepth1","frameHduCount","tsHdu","colName","sampleFormatFromSerBytes","buildSerImageDataForXisf","totalSamples","outView","sampleOffset","convertSerToXisf","extractImageBytes","decodeXisfImageFramesToSer","littleEndianOut","outFrameBytes","inputLittle","f","planeSize","baseIn","baseOut","g","convertXisfToSer","imageIndex","metaColor","color","pixelDepthMeta","littleEndianMeta","FORMAT_EXTENSION","formatToExtension","extensionToFormat","extension","hipsDirIndex","ipix","hipsTilePath","meta","sOrder","sIndex","dir","hipsAllskyPath","parseHiPSTilePath","cube","REQUIRED_KEYS","CUBE_REQUIRED_KEYS","VALID_FRAMES","VALID_DATAPRODUCT_TYPES","VALID_FORMATS","normalizeValue","HiPSProperties","_HiPSProperties","eq","missing","invalid","warnings","dataproduct","formats","fmt","orderValue","tileWidthValue","minOrderRaw","minOrderValue","versionValue","firstFrame","createDefaultHiPSProperties","props","wrap360","wrapped","clamp","frameCTypes","createLinearWCS","definition","crpix1","crpix2","crval1","crval2","cd11","cd12","cd21","cd22","cdelt1","cdelt2","theta","cos","sin","det","inv11","inv12","inv21","inv22","dx","dy","lon","lat","dlon","dlat","readLinearWCSFromHeader","readWCSFromCards","getNumber","getString","estimateOrderFromImageResolution","tileWidth","maxDim","tilePixelLonLat","nside","order2nside","ne","nw","vx","vy","vz","pixcoord2vec_nest","phi","vec2ang","tileCenterLonLat","pix2ang_nest","createHiPSTileHeader","ctype1","ctype2","res","center","finiteExtent","floatToBytePlane","ensureUint8","rgbaToGray","decodeHiPSTile","tileData","combined","z","decodePng","gray","decodeJpeg","encodeHiPSTile","planeLength","bytePlane","encodePng","rgba","encodeJpeg","isUrlLike","ensureNodeModules","HiPS","_HiPS","hips","pathApi","content","propertiesPath","preferredFormats","lastError","tileMeta","getValue","plane","blankValue","nearestSample","bilinearSample","x0","y0","y1","tx","ty","v00","v10","v01","v11","acc","wsum","pairs","weight","cubic1D","p0","p3","t","bicubicSample","xBase","yBase","m","samplePlane","interpolation","reprojectToHiPSTile","output","inPixel","downsampleTile","outWidth","srcPlaneLen","dstPlaneLen","srcBase","dstBase","sx","sy","degToRad","angularDistanceDeg","aLon","aLat","bLon","bLat","aLonRad","aLatRad","bLonRad","bLatRad","cosD","clamped","asArrayBuffer","parseInputFITS","normalizeBuildOptions","asFloat64","reduceToAllskyTile","tile","targetWidth","currentWidth","createMocFitsFromTileCenters","coordsDeg","makeIndexHtml","title","assertImageDataUnit","buildHiPSFromFITS","sourceWCS","planes","autoOrder","maxOrder","minOrder","firstOrder","corners","radiusDeg","corner","tileCentersForMoc","order3AllskyTiles","generatedTiles","radiusRad","max_pixrad","centerVec","ang2vec","candidates","query_disc_inclusive_nest","tileMetaBase","npix","totalTiles","cols","planeLen","allskyData","col","mocFits","convertFitsToHiPS","DEFAULT_ENDPOINT","DEFAULT_ENDPOINT_FALLBACK","appendCutoutParams","hipsId","cutout","fetchWithTimeout","timeoutMs","controller","timer","requestHiPS2FITS","endpoints","endpoint","frameToCoordSys","wrap","modulo","clip","lonLatToNestedTileSample","tRaw","uRaw","za2tu","pi4","u","pp","ppi","qq","qqi","xFloat","yFloat","xInt","yInt","bit_combine","buildCutoutWCS","projection","half","cdelt","exportTileFITS","toFloat32Values","encodeFloat32BigEndian","createPrimaryNoDataHDU","toFloat64Values","exportMapFITS","ordering","nside2npix","targetIpix","nest2ring","bintableHDU","sampleHiPS","cache","sample","exportCutoutLocal","wcs","world","convertHiPSToFITS","backend","localError","cloneImage","normalizeXisfInput","convertXisfToHiPS","xisfReadOptions","hipsOptions","selected","selectedXisf","convertHiPSToXisf","distributed","conversionOptions","normalizePath","NodeFSTarget","relativePath","targetPath","BrowserZipTarget","files","zipped","zipSync","blobPayload","hasOPFS","BrowserOPFSTarget","baseDir","create","segments","filename","segment","writable","file","isUrl","lintLocalStructure","issues","entries","full","relative","lintLocalStructureWithProperties","maxOrderRaw","allowedFormats","tileCount","allsky","lintHiPS","validation","issue","hasMoc"],"mappings":"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","file":"index.js","sourcesContent":["/** Width of a single FITS header card in bytes (characters). */\nexport const LINE_WIDTH = 80\n\n/** Size of a FITS block in bytes. All FITS structures are padded to this boundary. */\nexport const BLOCK_LENGTH = 2880\n\n/** Number of header card lines per FITS block. */\nexport const LINES_PER_BLOCK = BLOCK_LENGTH / LINE_WIDTH // 36\n\n/** Default maximum number of header lines to parse. */\nexport const DEFAULT_MAX_HEADER_LINES = 600\n\n/** FITS special integer value representing a NULL pixel in compressed images. */\nexport const NULL_VALUE = -2147483647\n\n/** FITS special integer value representing a 0.0 pixel in compressed images. */\nexport const ZERO_VALUE = -2147483646\n\n/** Number of random values in the dithering sequence. */\nexport const N_RANDOM = 10000\n\n/** Library version. */\nexport const VERSION = __VERSION__\n","/**\n * Base error class for all FITS-related errors.\n */\nexport class FITSError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FITSError'\n }\n}\n\n/**\n * Error thrown during header parsing or validation.\n */\nexport class HeaderError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'HeaderError'\n }\n}\n\n/**\n * Error thrown during data unit reading or interpretation.\n */\nexport class DataError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'DataError'\n }\n}\n\n/**\n * Error thrown when decompression fails.\n */\nexport class DecompressionError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'DecompressionError'\n }\n}\n","import type { CardValue, ExtensionType, WarningCallback } from '../core/types'\nimport { HeaderError } from '../core/errors'\n\n/**\n * Context interface for verification functions — represents the header state\n * during parsing so verification functions can access current parse state.\n */\nexport interface VerifyContext {\n cardIndex: number\n primary: boolean\n extension: boolean\n extensionType?: ExtensionType\n warn: WarningCallback\n get(key: string): CardValue\n isPrimary(): boolean\n isExtension(): boolean\n}\n\nfunction verifyOrder(ctx: VerifyContext, keyword: string, order: number): void {\n if (order !== ctx.cardIndex) {\n ctx.warn(`${keyword} should appear at index ${order} in the FITS header`)\n }\n}\n\nfunction verifyBetween(keyword: string, value: number, lower: number, upper: number): void {\n if (value < lower || value > upper) {\n throw new HeaderError(`The ${keyword} value of ${value} is not between ${lower} and ${upper}`)\n }\n}\n\nfunction verifyBoolean(value: CardValue): boolean {\n return value === 'T' ? true : false\n}\n\n/**\n * Verification functions for reserved FITS header keywords.\n * Each function receives (ctx, value, isArray, index?) and returns the validated value.\n */\nexport const VerifyFns: Record<\n string,\n (ctx: VerifyContext, value: CardValue, isArray: boolean, index?: string) => CardValue\n> = {\n SIMPLE(ctx, value) {\n ctx.primary = true\n verifyOrder(ctx, 'SIMPLE', 0)\n return verifyBoolean(value)\n },\n\n XTENSION(ctx, value) {\n ctx.extension = true\n ctx.extensionType = value as ExtensionType\n verifyOrder(ctx, 'XTENSION', 0)\n return ctx.extensionType\n },\n\n BITPIX(ctx, value) {\n const v = parseInt(String(value), 10)\n verifyOrder(ctx, 'BITPIX', 1)\n if (![8, 16, 32, 64, -32, -64].includes(v)) {\n throw new HeaderError(`BITPIX value ${v} is not permitted`)\n }\n return v\n },\n\n NAXIS(ctx, value, isArray) {\n const v = parseInt(String(value), 10)\n if (!isArray) {\n verifyOrder(ctx, 'NAXIS', 2)\n verifyBetween('NAXIS', v, 0, 999)\n if (ctx.isExtension()) {\n if (ctx.extensionType === 'TABLE' || ctx.extensionType === 'BINTABLE') {\n if (v !== 2) {\n throw new HeaderError(`NAXIS must be 2 for TABLE and BINTABLE extensions`)\n }\n }\n }\n }\n return v\n },\n\n PCOUNT(ctx, value) {\n const v = parseInt(String(value), 10)\n const naxis = ctx.get('NAXIS') as number\n const order = 1 + 1 + 1 + naxis\n verifyOrder(ctx, 'PCOUNT', order)\n if (ctx.isExtension()) {\n if (ctx.extensionType === 'IMAGE' || ctx.extensionType === 'TABLE') {\n if (v !== 0) {\n throw new HeaderError(`PCOUNT must be 0 for the ${ctx.extensionType} extensions`)\n }\n }\n }\n return v\n },\n\n GCOUNT(ctx, value) {\n const v = parseInt(String(value), 10)\n const naxis = ctx.get('NAXIS') as number\n const order = 1 + 1 + 1 + naxis + 1\n verifyOrder(ctx, 'GCOUNT', order)\n if (ctx.isExtension()) {\n if (\n ctx.extensionType === 'IMAGE' ||\n ctx.extensionType === 'TABLE' ||\n ctx.extensionType === 'BINTABLE'\n ) {\n if (v !== 1) {\n throw new HeaderError(`GCOUNT must be 1 for the ${ctx.extensionType} extensions`)\n }\n }\n }\n return v\n },\n\n EXTEND(ctx, value) {\n if (!ctx.isPrimary()) {\n throw new HeaderError('EXTEND must only appear in the primary header')\n }\n return verifyBoolean(value)\n },\n\n BSCALE(_ctx, value) {\n return parseFloat(String(value))\n },\n\n BZERO(_ctx, value) {\n return parseFloat(String(value))\n },\n\n BLANK(ctx, value) {\n const bitpix = ctx.get('BITPIX') as number\n if (bitpix <= 0) {\n ctx.warn(`BLANK is not to be used for BITPIX = ${bitpix}`)\n }\n return parseInt(String(value), 10)\n },\n\n DATAMIN(_ctx, value) {\n return parseFloat(String(value))\n },\n\n DATAMAX(_ctx, value) {\n return parseFloat(String(value))\n },\n\n EXTVER(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n EXTLEVEL(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n TFIELDS(_ctx, value) {\n const v = parseInt(String(value), 10)\n verifyBetween('TFIELDS', v, 0, 999)\n return v\n },\n\n TBCOL(ctx, value, _isArray, index) {\n const tfields = ctx.get('TFIELDS') as number\n if (index !== undefined) {\n verifyBetween('TBCOL', parseInt(index, 10), 0, tfields)\n }\n return value\n },\n\n ZIMAGE(_ctx, value) {\n return verifyBoolean(value)\n },\n\n ZCMPTYPE(_ctx, value) {\n const v = String(value)\n if (!['GZIP_1', 'RICE_1', 'PLIO_1', 'HCOMPRESS_1'].includes(v)) {\n throw new HeaderError(`ZCMPTYPE value ${v} is not permitted`)\n }\n return v\n },\n\n ZBITPIX(_ctx, value) {\n const v = parseInt(String(value), 10)\n if (![8, 16, 32, 64, -32, -64].includes(v)) {\n throw new HeaderError(`ZBITPIX value ${v} is not permitted`)\n }\n return v\n },\n\n ZNAXIS(_ctx, value, isArray) {\n const v = parseInt(String(value), 10)\n if (!isArray) {\n verifyBetween('ZNAXIS', v, 0, 999)\n }\n return v\n },\n\n ZTILE(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZSIMPLE(_ctx, value) {\n return value === 'T' ? true : false\n },\n\n ZPCOUNT(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZGCOUNT(_ctx, value) {\n return parseInt(String(value), 10)\n },\n\n ZDITHER0(_ctx, value) {\n return parseInt(String(value), 10)\n },\n}\n","import type {\n CardValue,\n HeaderCard,\n DataUnitType,\n ExtensionType,\n WarningCallback,\n} from '../core/types'\nimport { DEFAULT_MAX_HEADER_LINES } from '../core/constants'\nimport { HeaderError } from '../core/errors'\nimport { VerifyFns, type VerifyContext } from './header-verify'\n\n/**\n * Represents a parsed FITS header.\n *\n * A FITS header consists of 80-character card images containing\n * keyword = value / comment triplets.\n */\nexport class Header implements VerifyContext {\n private static readonly ARRAY_PATTERN = /(\\D+)(\\d+)/\n\n /** Whether this is a primary header (contains SIMPLE keyword). */\n primary = false\n /** Whether this is an extension header (contains XTENSION keyword). */\n extension = false\n /** The extension type if this is an extension header. */\n extensionType?: ExtensionType\n\n /** Storage for parsed header cards, keyed by keyword. */\n private cards: Map<string, HeaderCard> = new Map()\n /** Storage for COMMENT cards. */\n private comments: string[] = []\n /** Storage for HISTORY cards. */\n private history: string[] = []\n /** Running index of the current card being parsed. */\n cardIndex = 0\n\n /** Warning callback for non-fatal issues during parsing. */\n warn: WarningCallback\n\n /** Maximum number of header lines to parse. */\n private maxLines: number\n\n /** The raw header block string, preserved for reference. */\n readonly block: string\n\n constructor(\n block: string,\n maxLines: number = DEFAULT_MAX_HEADER_LINES,\n onWarning?: WarningCallback,\n ) {\n this.maxLines = maxLines\n this.warn = onWarning ?? console.warn\n this.block = block\n this.readBlock(block)\n }\n\n /**\n * Get the value for a header keyword.\n * Returns `null` if the keyword is not present.\n */\n get(key: string): CardValue {\n if (this.contains(key)) {\n return this.cards.get(key)!.value\n }\n return null\n }\n\n /**\n * Get a numeric value for a header keyword.\n * Returns the `fallback` (default `0`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a number.\n */\n getNumber(key: string, fallback?: number): number {\n const value = this.get(key)\n if (value === null) return fallback ?? 0\n if (typeof value === 'number') return value\n throw new HeaderError(`Expected number for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Get a string value for a header keyword.\n * Returns the `fallback` (default `''`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a string.\n */\n getString(key: string, fallback?: string): string {\n const value = this.get(key)\n if (value === null) return fallback ?? ''\n if (typeof value === 'string') return value\n throw new HeaderError(`Expected string for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Get a boolean value for a header keyword.\n * Returns the `fallback` (default `false`) if the keyword is missing.\n * Throws `HeaderError` if the value is present but not a boolean.\n */\n getBoolean(key: string, fallback?: boolean): boolean {\n const value = this.get(key)\n if (value === null) return fallback ?? false\n if (typeof value === 'boolean') return value\n throw new HeaderError(`Expected boolean for keyword ${key}, got ${typeof value}`)\n }\n\n /**\n * Set a keyword with a value and optional comment.\n */\n set(key: string, value: CardValue, comment: string = ''): void {\n this.cards.set(key, {\n index: this.cardIndex,\n value,\n comment,\n })\n this.cardIndex += 1\n }\n\n /**\n * Check if the header contains a specific keyword.\n */\n contains(key: string): boolean {\n return this.cards.has(key)\n }\n\n /**\n * Get all COMMENT card values.\n */\n getComments(): string[] {\n return this.comments\n }\n\n /**\n * Get all HISTORY card values.\n */\n getHistory(): string[] {\n return this.history\n }\n\n /**\n * Returns all keyword names in insertion order.\n */\n keys(): string[] {\n return Array.from(this.cards.keys())\n }\n\n /**\n * Returns parsed keyword cards in original insertion order, with comments.\n */\n getCards(): Array<{ key: string; value: CardValue; comment: string }> {\n return [...this.cards.entries()]\n .sort((a, b) => a[1].index - b[1].index)\n .map(([key, card]) => ({\n key,\n value: card.value,\n comment: card.comment,\n }))\n }\n\n /**\n * Determine if this header has an associated data unit based on NAXIS.\n */\n hasDataUnit(): boolean {\n const naxis = this.getNumber('NAXIS')\n if (naxis === 0) return false\n for (let i = 1; i <= naxis; i++) {\n if (this.getNumber(`NAXIS${i}`) !== 0) return true\n }\n return false\n }\n\n /**\n * Calculate the byte length of the associated data unit.\n */\n getDataLength(): number {\n if (!this.hasDataUnit()) {\n return 0\n }\n\n const naxis = this.getNumber('NAXIS')\n const naxisValues: number[] = []\n for (let i = 1; i <= naxis; i++) {\n naxisValues.push(this.getNumber(`NAXIS${i}`))\n }\n\n const bitpix = this.getNumber('BITPIX')\n let length = (naxisValues.reduce((a, b) => a * b, 1) * Math.abs(bitpix)) / 8\n length += this.getNumber('PCOUNT')\n\n return length\n }\n\n /**\n * Determine the data unit type from header keywords.\n */\n getDataType(): DataUnitType | null {\n switch (this.extensionType) {\n case 'BINTABLE':\n if (this.contains('ZIMAGE')) return 'CompressedImage'\n return 'BinaryTable'\n case 'TABLE':\n return 'Table'\n case 'IMAGE':\n if (this.hasDataUnit()) return 'Image'\n return null\n default:\n if (this.hasDataUnit()) return 'Image'\n return null\n }\n }\n\n /** Check if this is a primary header. */\n isPrimary(): boolean {\n return this.primary\n }\n\n /** Check if this is an extension header. */\n isExtension(): boolean {\n return this.extension\n }\n\n // --- Private parsing methods ---\n\n private readBlock(block: string): void {\n const lineWidth = 80\n const nLinesRaw = block.length / lineWidth\n const nLines = Math.min(nLinesRaw, this.maxLines)\n\n for (let i = 0; i < nLines; i++) {\n const line = block.slice(i * lineWidth, (i + 1) * lineWidth)\n this.readLine(line)\n }\n }\n\n private readLine(line: string): void {\n // Check bytes 1 to 8 for key or whitespace\n const key = line.slice(0, 8).trim()\n if (key === '') return\n\n // Get indicator and value portion\n const indicator = line.slice(8, 10)\n const rawValue = line.slice(10)\n\n // Check the indicator\n if (indicator !== '= ') {\n // Key will be either COMMENT, HISTORY, or END\n // For COMMENT/HISTORY, the value is everything after the keyword (pos 8)\n const fullValue = line.slice(8).trim()\n if (key === 'COMMENT') {\n this.comments.push(fullValue)\n } else if (key === 'HISTORY') {\n this.history.push(fullValue)\n }\n return\n }\n\n // Split value from comment (comment starts with ' /')\n // Must not match ' /' inside quoted string values\n let valueStr: string\n let comment: string\n if (rawValue.trimStart().startsWith(\"'\")) {\n // String value — find closing quote, skipping escaped quotes ('')\n const openQuote = rawValue.indexOf(\"'\")\n let closeQuote = -1\n let pos = openQuote + 1\n while (pos < rawValue.length) {\n const q = rawValue.indexOf(\"'\", pos)\n if (q === -1) break\n // Check if this is an escaped quote (followed by another quote)\n if (q + 1 < rawValue.length && rawValue[q + 1] === \"'\") {\n pos = q + 2 // Skip the escaped pair\n continue\n }\n closeQuote = q\n break\n }\n if (closeQuote !== -1) {\n const afterQuote = rawValue.slice(closeQuote + 1)\n const slashIdx = afterQuote.indexOf(' /')\n if (slashIdx !== -1) {\n valueStr = rawValue.slice(0, closeQuote + 1).trim()\n comment = afterQuote.slice(slashIdx + 2).trim()\n } else {\n valueStr = rawValue.slice(0, closeQuote + 1).trim()\n comment = ''\n }\n } else {\n valueStr = rawValue.trim()\n comment = ''\n }\n } else {\n const slashIdx = rawValue.indexOf(' /')\n if (slashIdx !== -1) {\n valueStr = rawValue.slice(0, slashIdx).trim()\n comment = rawValue.slice(slashIdx + 2).trim()\n } else {\n valueStr = rawValue.trim()\n comment = ''\n }\n }\n\n // Parse the value\n let value: CardValue\n if (valueStr.startsWith(\"'\")) {\n // String data type — strip surrounding quotes and unescape doubled quotes\n value = valueStr.slice(1, -1).replaceAll(\"''\", \"'\").trim()\n } else if (valueStr === 'T' || valueStr === 'F') {\n // Boolean — leave as string for verification functions to handle\n value = valueStr\n } else {\n // Numeric\n value = parseFloat(valueStr)\n }\n\n // Validate against reserved keyword rules\n value = this.validate(key, value)\n\n this.set(key, value, comment)\n }\n\n private validate(key: string, value: CardValue): CardValue {\n let baseKey = key\n let isArray = false\n let index: string | undefined\n\n const match = Header.ARRAY_PATTERN.exec(key)\n if (match) {\n isArray = true\n baseKey = match[1]!\n index = match[2]\n }\n\n if (baseKey in VerifyFns) {\n value = VerifyFns[baseKey]!(this, value, isArray, index)\n }\n\n return value\n }\n}\n","import type { Header } from './header'\nimport type { DataUnit } from './data-unit'\n\n/**\n * Header Data Unit — the fundamental building block of a FITS file.\n *\n * Each HDU contains a header and an optional data unit. The header\n * describes the structure and metadata of the data unit.\n */\nexport class HDU {\n readonly header: Header\n readonly data?: DataUnit\n\n constructor(header: Header, data?: DataUnit) {\n this.header = header\n this.data = data\n }\n\n /**\n * Check if this HDU has an associated data unit.\n */\n hasData(): boolean {\n return this.data !== undefined\n }\n}\n","import { BLOCK_LENGTH } from './constants'\n\n/**\n * Endian swap functions for converting big-endian data to host byte order.\n * FITS data is always stored in big-endian format.\n */\n/** 8-bit: no swap needed */\nconst swap8 = (value: number): number => value\n/** 16-bit endian swap */\nconst swap16 = (value: number): number => ((value & 0xff) << 8) | ((value >> 8) & 0xff)\n/** 32-bit endian swap */\nconst swap32 = (value: number): number =>\n ((value & 0xff) << 24) |\n ((value & 0xff00) << 8) |\n ((value >> 8) & 0xff00) |\n ((value >> 24) & 0xff)\n\nexport const swapEndian = {\n 8: swap8,\n B: swap8,\n 16: swap16,\n I: swap16,\n 32: swap32,\n J: swap32,\n} as Record<string | number, (value: number) => number>\n\n/** Shared TextDecoder instance for ASCII decoding. */\nconst textDecoder = new TextDecoder('ascii')\n\n/**\n * Convert a Uint8Array to a string (ASCII decoding).\n */\nexport function uint8ArrayToString(arr: Uint8Array): string {\n return textDecoder.decode(arr)\n}\n\n/**\n * Calculate the number of excess (padding) bytes needed to reach a FITS block boundary.\n */\nexport function excessBytes(length: number): number {\n return (BLOCK_LENGTH - (length % BLOCK_LENGTH)) % BLOCK_LENGTH\n}\n\n/**\n * Convert a byte to an array of 8 bits (MSB first).\n */\nexport function toBits(byte: number): number[] {\n const arr: number[] = []\n let i = 128\n while (i >= 1) {\n arr.push(byte & i ? 1 : 0)\n i >>= 1\n }\n return arr\n}\n","import { swapEndian } from '../core/utils'\n\n/**\n * Base class for FITS data units (Image, BinaryTable, Table, CompressedImage).\n *\n * FITS data is always stored in big-endian format. This base class provides\n * shared infrastructure for endian swapping and buffer management.\n */\nexport class DataUnit {\n /** The ArrayBuffer containing raw data (available when loaded from buffer). */\n buffer?: ArrayBuffer\n /** The Blob containing raw data (available when loaded from file). */\n blob?: Blob\n\n /** Static endian swap functions keyed by type code or byte size. */\n static readonly swapEndian = swapEndian\n\n constructor(data: ArrayBuffer | Blob) {\n if (data instanceof ArrayBuffer) {\n this.buffer = data\n } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n this.blob = data\n }\n }\n}\n","import type { TypedArray } from '../core/types'\n\nfunction isBigIntTypedArray(arr: TypedArray | Float32Array): arr is BigInt64Array | BigUint64Array {\n return arr instanceof BigInt64Array || arr instanceof BigUint64Array\n}\n\n/**\n * Compute the minimum and maximum pixel values in a typed array,\n * ignoring NaN values.\n *\n * @returns A tuple [min, max], or [NaN, NaN] if all values are NaN.\n */\nexport function getExtent(arr: TypedArray | Float32Array): [number | bigint, number | bigint] {\n if (isBigIntTypedArray(arr)) {\n if (arr.length === 0) return [NaN, NaN]\n let min = arr[0]!\n let max = arr[0]!\n for (let i = 1; i < arr.length; i++) {\n const value = arr[i]!\n if (value < min) min = value\n else if (value > max) max = value\n }\n return [min, max]\n }\n\n const len = arr.length\n let min: number | undefined\n let max: number | undefined\n let i = 0\n\n // Find first non-NaN value\n for (; i < len; i++) {\n const value = arr[i]!\n if (!isNaN(value)) {\n min = max = value\n i++\n break\n }\n }\n\n if (min === undefined || max === undefined) {\n return [NaN, NaN]\n }\n\n // Continue forward loop to find extent\n for (; i < len; i++) {\n const value = arr[i]!\n if (isNaN(value)) continue\n if (value < min) min = value\n else if (value > max) max = value\n }\n\n return [min, max]\n}\n\n/**\n * Get a single pixel value from a flat array given x, y coordinates and image width.\n */\nexport function getPixel(\n arr: TypedArray | Float32Array,\n x: number,\n y: number,\n width: number,\n): number | bigint {\n const index = y * width + x\n if (index < 0 || index >= arr.length) {\n return NaN\n }\n return arr[index]!\n}\n","import { DataUnit } from './data-unit'\nimport { getExtent, getPixel } from './image-utils'\nimport type { Header } from './header'\nimport type { TypedArray } from '../core/types'\n\ninterface FrameOffset {\n begin: number\n buffers?: ArrayBuffer[]\n}\n\n/**\n * Represents a standard FITS image stored in the data unit of a FITS file.\n * Supports BITPIX values: 8, 16, 32, 64, -32, -64\n * Supports data cubes (NAXIS > 2) with frame-by-frame reading.\n */\nexport class Image extends DataUnit {\n readonly bitpix: number\n readonly naxis: number[]\n readonly width: number\n readonly height: number\n readonly depth: number\n readonly bzero: number\n readonly bscale: number\n readonly bytes: number\n readonly length: number\n readonly frameLength: number\n readonly frameOffsets: FrameOffset[]\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(data)\n\n const naxisCount = header.getNumber('NAXIS')\n this.bitpix = header.getNumber('BITPIX')\n\n this.naxis = []\n for (let i = 1; i <= naxisCount; i++) {\n this.naxis.push(header.getNumber(`NAXIS${i}`))\n }\n\n this.width = header.getNumber('NAXIS1')\n this.height = header.getNumber('NAXIS2', 1)\n this.depth = header.getNumber('NAXIS3', 1)\n this.bzero = header.getNumber('BZERO')\n this.bscale = header.getNumber('BSCALE', 1)\n this.bytes = Math.abs(this.bitpix) / 8\n this.length = (this.naxis.reduce((a, b) => a * b, 1) * Math.abs(this.bitpix)) / 8\n\n this.frameOffsets = []\n this.frameLength = this.bytes * this.width * this.height\n\n for (let i = 0; i < this.depth; i++) {\n const begin = i * this.frameLength\n const info: FrameOffset = { begin }\n if (this.buffer) {\n info.buffers = [this.buffer.slice(begin, begin + this.frameLength)]\n }\n this.frameOffsets.push(info)\n }\n }\n\n /**\n * Convert raw buffer bytes into pixel values with endian handling and BZERO/BSCALE.\n */\n static computeFrame(\n buffer: ArrayBuffer,\n bitpix: number,\n bzero: number,\n bscale: number,\n ): TypedArray {\n const bytes = Math.abs(bitpix) / 8\n const nPixels = buffer.byteLength / bytes\n const identity = bzero === 0 && bscale === 1\n const view = new DataView(buffer)\n const needFloat = !(Number.isInteger(bzero) && Number.isInteger(bscale))\n\n if (bitpix === 8) {\n if (identity) return new Uint8Array(buffer.slice(0))\n const result = needFloat ? new Float32Array(nPixels) : new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getUint8(i)\n }\n return result\n }\n\n if (bitpix === 16) {\n if (identity) {\n const result = new Int16Array(nPixels)\n for (let i = 0; i < nPixels; i++) result[i] = view.getInt16(i * 2, false)\n return result\n }\n const result = needFloat ? new Float32Array(nPixels) : new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getInt16(i * 2, false)\n }\n return result\n }\n\n if (bitpix === 32) {\n if (identity) {\n const result = new Int32Array(nPixels)\n for (let i = 0; i < nPixels; i++) result[i] = view.getInt32(i * 4, false)\n return result\n }\n const result = new Float64Array(nPixels)\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getInt32(i * 4, false)\n }\n return result\n }\n\n if (bitpix === 64) {\n const canKeepBigInt = bscale === 1 && Number.isInteger(bzero) && Number.isSafeInteger(bzero)\n if (canKeepBigInt) {\n const result = new BigInt64Array(nPixels)\n const zero = BigInt(bzero)\n for (let i = 0; i < nPixels; i++) {\n result[i] = view.getBigInt64(i * 8, false) + zero\n }\n return result\n }\n\n const result = new Float64Array(nPixels)\n if (identity) {\n for (let i = 0; i < nPixels; i++) {\n result[i] = Number(view.getBigInt64(i * 8, false))\n }\n } else {\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * Number(view.getBigInt64(i * 8, false))\n }\n }\n return result\n }\n\n if (bitpix === -32) {\n const result = new Float32Array(nPixels)\n if (identity) {\n for (let i = 0; i < nPixels; i++) result[i] = view.getFloat32(i * 4, false)\n } else {\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getFloat32(i * 4, false)\n }\n }\n return result\n }\n\n // bitpix === -64\n const result = new Float64Array(nPixels)\n if (identity) {\n for (let i = 0; i < nPixels; i++) result[i] = view.getFloat64(i * 8, false)\n } else {\n for (let i = 0; i < nPixels; i++) {\n result[i] = bzero + bscale * view.getFloat64(i * 8, false)\n }\n }\n return result\n }\n\n /**\n * Read a single frame from the image. For 2D images, frame is always 0.\n * For data cubes, frame selects the z-slice.\n *\n * @returns Promise resolving to pixel data as a typed array.\n */\n async getFrame(frame: number = 0): Promise<TypedArray> {\n const frameInfo = this.frameOffsets[frame]!\n\n if (frameInfo.buffers && frameInfo.buffers.length > 0) {\n return Image.computeFrame(frameInfo.buffers[0]!, this.bitpix, this.bzero, this.bscale)\n }\n\n // Read from blob\n if (!this.blob) {\n throw new Error('No data source available for this image frame')\n }\n\n const begin = frameInfo.begin\n const blobFrame = this.blob.slice(begin, begin + this.frameLength)\n const arrayBuffer = await blobFrame.arrayBuffer()\n\n // Cache the buffer for future access\n frameInfo.buffers = [arrayBuffer]\n\n return Image.computeFrame(arrayBuffer, this.bitpix, this.bzero, this.bscale)\n }\n\n /**\n * Read a frame as numbers, explicitly allowing precision loss for int64 images.\n */\n async getFrameAsNumber(frame: number = 0): Promise<Float64Array> {\n const pixels = await this.getFrame(frame)\n if (pixels instanceof Float64Array) {\n return pixels\n }\n const out = new Float64Array(pixels.length)\n for (let i = 0; i < pixels.length; i++) {\n out[i] = Number(pixels[i]!)\n }\n return out\n }\n\n /**\n * Read multiple sequential frames from a data cube.\n *\n * @param startFrame - First frame index to read.\n * @param count - Number of frames to read.\n * @returns Promise resolving to an array of typed arrays, one per frame.\n */\n async getFrames(startFrame: number, count: number): Promise<TypedArray[]> {\n const indices = Array.from({ length: count }, (_, i) => startFrame + i)\n return Promise.all(indices.map((i) => this.getFrame(i)))\n }\n\n /** Check if the image is a data cube (more than 2 axes). */\n isDataCube(): boolean {\n return this.naxis.length > 2\n }\n\n /**\n * Async iterator for frame-by-frame reading of data cubes.\n * Yields each frame sequentially from index 0 to depth-1.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<TypedArray> {\n for (let i = 0; i < this.depth; i++) {\n yield this.getFrame(i)\n }\n }\n\n /** Compute min/max pixel values of an array, ignoring NaN. */\n getExtent(arr: TypedArray): [number | bigint, number | bigint] {\n return getExtent(arr)\n }\n\n /** Get a single pixel value at (x, y) from a pixel array. */\n getPixel(arr: TypedArray, x: number, y: number): number | bigint {\n return getPixel(arr, x, y, this.width)\n }\n}\n","/**\n * FITS standard BITPIX values representing data types in image arrays.\n * Positive values are integer types, negative values are floating point.\n */\nexport type BitPix = 8 | 16 | 32 | 64 | -32 | -64\n\n/**\n * Extended BITPIX values used in compressed images (ZBITPIX).\n */\nexport type ZBitPix = 8 | 16 | 32 | 64 | -32 | -64\n\n/**\n * Possible value types stored in a FITS header card.\n */\nexport type CardValue = string | number | boolean | null\n\n/**\n * A single header card entry with its positional index, value, and optional comment.\n */\nexport interface HeaderCard {\n index: number\n value: CardValue\n comment: string\n}\n\n/**\n * Types of FITS data units.\n */\nexport type DataUnitType = 'Image' | 'BinaryTable' | 'Table' | 'CompressedImage'\n\n/**\n * FITS extension types as stored in the XTENSION keyword.\n */\nexport type ExtensionType = 'IMAGE' | 'BINTABLE' | 'TABLE'\n\n/**\n * Compression algorithms supported by the FITS tiled image convention.\n */\nexport type CompressionType = 'GZIP_1' | 'RICE_1' | 'PLIO_1' | 'HCOMPRESS_1'\n\n/**\n * Quantization methods for compressed images.\n */\nexport type QuantizationType = 'LINEAR_SCALING' | 'SUBTRACTIVE_DITHER_1' | 'SUBTRACTIVE_DITHER_2'\n\n/**\n * Binary table format type codes (single character descriptors).\n */\nexport type BinaryTableTypeCode =\n | 'L' // Logical\n | 'B' // Unsigned byte\n | 'I' // 16-bit integer\n | 'J' // 32-bit integer\n | 'K' // 64-bit integer\n | 'A' // Character\n | 'E' // Single-precision float\n | 'D' // Double-precision float\n | 'C' // Single-precision complex\n | 'M' // Double-precision complex\n | 'X' // Bit\n\n/**\n * ASCII table format type codes.\n */\nexport type AsciiTableTypeCode = 'A' | 'I' | 'F' | 'E' | 'D'\n\n/**\n * Byte sizes for each binary table type code.\n */\nexport const BINARY_TYPE_BYTE_SIZES: Record<string, number> = {\n L: 1,\n B: 1,\n I: 2,\n J: 4,\n K: 8,\n A: 1,\n E: 4,\n D: 8,\n C: 8,\n M: 16,\n}\n\n/**\n * A binary table accessor function reads a value from a DataView at the given offset\n * and returns the value plus the new offset.\n */\nexport type BinaryAccessor = (view: DataView, offset: number) => [value: unknown, newOffset: number]\n\n/**\n * An ASCII table accessor transforms a string value into the appropriate type.\n */\nexport type AsciiAccessor = (value: string) => CardValue\n\n/**\n * Typed array constructors mapped by binary type codes.\n */\nexport const TYPED_ARRAY_CONSTRUCTORS: Record<string, TypedArrayConstructor> = {\n B: Uint8Array,\n I: Int16Array,\n J: Int32Array,\n K: BigInt64Array,\n E: Float32Array,\n D: Float64Array,\n 1: Uint8Array,\n 2: Int16Array,\n 4: Int32Array,\n}\n\nexport type TypedArrayConstructor =\n | Uint8ArrayConstructor\n | Int8ArrayConstructor\n | Uint16ArrayConstructor\n | Int16ArrayConstructor\n | Uint32ArrayConstructor\n | Int32ArrayConstructor\n | BigInt64ArrayConstructor\n | BigUint64ArrayConstructor\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n\nexport type TypedArray =\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | BigInt64Array\n | BigUint64Array\n | Float32Array\n | Float64Array\n\n/**\n * Warning callback type for non-fatal issues during parsing.\n */\nexport type WarningCallback = (message: string) => void\n\n/**\n * Options for reading FITS data.\n */\nexport interface ReadOptions {\n /** Maximum number of header lines to parse (default: 600) */\n maxHeaderLines?: number\n /** Callback for non-fatal warnings during parsing (default: console.warn) */\n onWarning?: WarningCallback\n}\n\n/**\n * Options for fetching remote FITS files.\n */\nexport interface FetchOptions extends ReadOptions {\n /** Additional fetch options (headers, signal, etc.) */\n requestInit?: RequestInit\n}\n\n/**\n * Row data from a table, keyed by column name.\n */\nexport type TableRow = Record<string, unknown>\n\n/**\n * Compression algorithm parameters (e.g., BLOCKSIZE, BYTEPIX).\n */\nexport type AlgorithmParameters = Record<string, number>\n","import { DataUnit } from './data-unit'\nimport type { Header } from './header'\nimport type { BinaryAccessor, TableRow, TypedArray } from '../core/types'\nimport { TYPED_ARRAY_CONSTRUCTORS } from '../core/types'\n\n/**\n * Abstract base class for tabular FITS extensions (TABLE and BINTABLE).\n *\n * Handles shared logic for row/column access, buffer management,\n * and accessor setup. Derived classes must implement `setAccessors` and `_getRows`.\n */\nexport abstract class Tabular extends DataUnit {\n /** Maximum memory (bytes) to hold when reading from blob. */\n protected maxMemory = 1048576\n\n readonly rowByteSize: number\n readonly rows: number\n readonly cols: number\n readonly length: number\n readonly heapLength: number\n readonly columns: string[] | null\n\n /** Accessor functions for each column. */\n protected accessors: BinaryAccessor[] = []\n /** Type descriptor for each column. */\n protected descriptors: string[] = []\n /** Byte length of each column element. */\n protected elementByteLengths: number[] = []\n /** TTYPE values for each column (used by subclasses to identify column roles). */\n protected columnTypes: string[] = []\n\n /** Heap data for variable-length arrays. */\n heap?: ArrayBuffer\n\n /** Typed array constructor map (used by BinaryTable). */\n protected typedArray: Record<string, new (length: number | ArrayBuffer) => TypedArray> =\n TYPED_ARRAY_CONSTRUCTORS as Record<string, new (length: number | ArrayBuffer) => TypedArray>\n\n // For blob-based reading\n private firstRowInBuffer = 0\n private lastRowInBuffer = 0\n private nRowsInBuffer = 0\n private cachedBuffer?: ArrayBuffer\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(data)\n\n this.rowByteSize = header.getNumber('NAXIS1')\n this.rows = header.getNumber('NAXIS2')\n this.cols = header.getNumber('TFIELDS')\n\n this.length = this.rowByteSize * this.rows\n this.heapLength = header.getNumber('PCOUNT')\n this.columns = this.getColumns(header)\n\n if (this.buffer) {\n // Keep separate buffer for heap\n this.heap = this.buffer.slice(this.length, this.length + this.heapLength)\n } else {\n this.firstRowInBuffer = 0\n this.lastRowInBuffer = 0\n this.nRowsInBuffer = Math.floor(this.maxMemory / this.rowByteSize)\n }\n\n // NOTE: Do NOT call setAccessors here.\n // Subclass field initializers run after super() returns,\n // which would overwrite values set by setAccessors.\n // Subclasses must call this.initAccessors(header) at the end of their own constructor.\n }\n\n /**\n * Subclasses must call this at the end of their constructor.\n */\n protected initAccessors(header: Header): void {\n this.resetAccessors()\n this.setAccessors(header)\n }\n\n /**\n * Clear all accessor arrays before re-initialization.\n */\n private resetAccessors(): void {\n this.accessors = []\n this.descriptors = []\n this.elementByteLengths = []\n this.columnTypes = []\n }\n\n /**\n * Derived classes must set up accessor functions for each column.\n */\n protected abstract setAccessors(header: Header): void\n\n /**\n * Derived classes must implement row parsing from a buffer.\n */\n protected abstract _getRows(buffer: ArrayBuffer, nRows: number): TableRow[] | Float32Array\n\n /**\n * Check if the specified row range is currently in memory.\n */\n private rowsInMemory(firstRow: number, lastRow: number): boolean {\n if (this.buffer && !this.blob) return true\n if (this.cachedBuffer) {\n if (firstRow < this.firstRowInBuffer) return false\n if (lastRow > this.lastRowInBuffer) return false\n return true\n }\n return false\n }\n\n /**\n * Get column names from the header.\n */\n private getColumns(header: Header): string[] | null {\n const columns: string[] = []\n for (let i = 1; i <= this.cols; i++) {\n const key = `TTYPE${i}`\n if (!header.contains(key)) return null\n columns.push(header.getString(key))\n }\n return columns\n }\n\n /**\n * Read a range of rows from the table.\n *\n * @param row - Starting row index (0-based).\n * @param number_ - Number of rows to read.\n */\n async getRows(\n row: number,\n number_: number,\n ): Promise<TableRow[] | Float32Array | ArrayLike<number>> {\n if (this.rowsInMemory(row, row + number_)) {\n let buf: ArrayBuffer\n if (this.cachedBuffer) {\n const offsetInCache = (row - this.firstRowInBuffer) * this.rowByteSize\n buf = this.cachedBuffer.slice(offsetInCache, offsetInCache + number_ * this.rowByteSize)\n } else if (this.buffer) {\n const begin = row * this.rowByteSize\n const end = begin + number_ * this.rowByteSize\n buf = this.buffer.slice(begin, end)\n } else {\n throw new Error('No data source available')\n }\n return this._getRows(buf, number_) as TableRow[] | Float32Array\n }\n\n // Read from blob\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const begin = row * this.rowByteSize\n const readRows = Math.max(this.nRowsInBuffer, number_)\n const end = begin + readRows * this.rowByteSize\n const blobSlice = this.blob.slice(begin, end)\n const arrayBuffer = await blobSlice.arrayBuffer()\n\n this.cachedBuffer = arrayBuffer\n this.firstRowInBuffer = row\n this.lastRowInBuffer = row + readRows\n\n return this._getRows(arrayBuffer, number_) as TableRow[] | Float32Array\n }\n\n /**\n * Read a table buffer for a range of rows.\n * Used internally for column-based reading from blob.\n */\n private async getTableBuffer(row: number, number_: number): Promise<ArrayBuffer> {\n const actualRows = Math.min(this.rows - row, number_)\n const begin = row * this.rowByteSize\n const end = begin + actualRows * this.rowByteSize\n\n if (this.buffer) {\n return this.buffer.slice(begin, end)\n }\n\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const blobSlice = this.blob.slice(begin, end)\n return blobSlice.arrayBuffer()\n }\n\n /**\n * Read all values from a single column.\n *\n * @param name - Column name.\n * @returns Array of column values.\n */\n async getColumn(name: string): Promise<unknown[]> {\n if (!this.columns) {\n throw new Error('Column names not available')\n }\n\n const colIndex = this.columns.indexOf(name)\n if (colIndex === -1) {\n throw new Error(`Column \"${name}\" not found`)\n }\n\n if (this.buffer && !this.blob) {\n // Table already in memory — use getRows\n const rows = (await this.getRows(0, this.rows)) as TableRow[]\n return rows.map((d) => d[name])\n }\n\n // Read column from blob in chunks\n const accessor = this.accessors[colIndex]!\n const elementByteOffset = this.elementByteLengths.slice(0, colIndex).reduce((a, b) => a + b, 0)\n\n const column: unknown[] = new Array(this.rows)\n\n const rowsPerIteration = Math.min(\n Math.max(1, Math.floor(this.maxMemory / this.rowByteSize)),\n this.rows,\n )\n\n const factor = this.rows / rowsPerIteration\n let iterations = Math.floor(factor) === factor ? factor : Math.floor(factor) + 1\n let i = 0\n let chunkIndex = 0\n\n while (iterations > 0) {\n const startRow = chunkIndex * rowsPerIteration\n const buffer = await this.getTableBuffer(startRow, rowsPerIteration)\n const nRows = buffer.byteLength / this.rowByteSize\n const view = new DataView(buffer)\n let offset = elementByteOffset\n\n for (let r = 0; r < nRows; r++) {\n column[i] = accessor(view, offset)[0]\n i++\n offset += this.rowByteSize\n }\n\n iterations--\n chunkIndex++\n }\n\n return column\n }\n}\n","import { Tabular } from './tabular'\nimport type { Header } from './header'\nimport type { TableRow } from '../core/types'\nimport { uint8ArrayToString } from '../core/utils'\n\n/**\n * ASCII table accessor functions keyed by format code.\n */\nconst ASCII_ACCESSORS: Record<string, (value: string) => string | number> = {\n A: (value: string) => value.trim(),\n I: (value: string) => parseInt(value, 10),\n F: (value: string) => parseFloat(value),\n E: (value: string) => parseFloat(value),\n D: (value: string) => parseFloat(value),\n}\n\n/**\n * Reads ASCII tables from FITS files (XTENSION = 'TABLE').\n *\n * ASCII tables store data as fixed-width text fields where each row\n * is a sequence of ASCII characters.\n */\nexport class Table extends Tabular {\n private asciiAccessors: ((value: string) => string | number)[] = []\n /** 0-based start positions for each column within a row. */\n private colStarts: number[] = []\n /** Character widths for each column. */\n private colWidths: number[] = []\n /** Whether TBCOL keywords were found in the header. */\n private hasTBCOL = false\n\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(header, data)\n this.initAccessors(header)\n }\n\n protected setAccessors(header: Header): void {\n this.asciiAccessors = []\n this.colStarts = []\n this.colWidths = []\n this.hasTBCOL = false\n const pattern = /([AIFED])(\\d+)\\.*(\\d+)*/\n\n // First pass: check if any TBCOL keywords exist\n for (let i = 1; i <= this.cols; i++) {\n if (header.contains(`TBCOL${i}`)) {\n this.hasTBCOL = true\n break\n }\n }\n\n for (let i = 1; i <= this.cols; i++) {\n const form = header.getString(`TFORM${i}`)\n const match = pattern.exec(form)\n if (!match) {\n this.asciiAccessors.push((v: string) => v.trim())\n this.colStarts.push(0)\n this.colWidths.push(0)\n continue\n }\n\n const descriptor = match[1]!\n const width = parseInt(match[2]!, 10)\n const fn = ASCII_ACCESSORS[descriptor] ?? ((v: string) => v.trim())\n this.asciiAccessors.push(fn)\n\n // TBCOL is 1-based per FITS standard\n const tbcol = header.contains(`TBCOL${i}`) ? header.getNumber(`TBCOL${i}`) - 1 : 0\n this.colStarts.push(tbcol)\n this.colWidths.push(width)\n }\n }\n\n protected override _getRows(buffer: ArrayBuffer, _nRows?: number): TableRow[] {\n const nRows = buffer.byteLength / this.rowByteSize\n const arr = new Uint8Array(buffer)\n const rows: TableRow[] = []\n const accessors = this.asciiAccessors ?? []\n\n for (let i = 0; i < nRows; i++) {\n const begin = i * this.rowByteSize\n const end = begin + this.rowByteSize\n const subarray = arr.subarray(begin, end)\n const line = uint8ArrayToString(subarray)\n\n const row: TableRow = {}\n if (this.hasTBCOL) {\n // Fixed-width extraction using TBCOL positions\n for (let j = 0; j < accessors.length; j++) {\n const start = this.colStarts[j]!\n const width = this.colWidths[j]!\n const value = line.substring(start, start + width).trim()\n if (this.columns) {\n row[this.columns[j]!] = accessors[j]!(value)\n }\n }\n } else {\n // Fallback: whitespace splitting (when TBCOL is not available)\n const fields = line.trim().split(/\\s+/)\n for (let j = 0; j < accessors.length; j++) {\n const value = fields[j] ?? ''\n if (this.columns) {\n row[this.columns[j]!] = accessors[j]!(value)\n }\n }\n }\n rows.push(row)\n }\n\n return rows\n }\n}\n","import { Tabular } from './tabular'\nimport { DecompressionError } from '../core/errors'\nimport type { Header } from './header'\nimport type { BinaryAccessor, TableRow, TypedArray } from '../core/types'\nimport { BINARY_TYPE_BYTE_SIZES, TYPED_ARRAY_CONSTRUCTORS } from '../core/types'\nimport { swapEndian, toBits } from '../core/utils'\n\n/**\n * Binary table data accessor functions keyed by type code.\n * Each returns [value, newOffset].\n */\nconst DATA_ACCESSORS: Record<string, (view: DataView, offset: number) => [unknown, number]> = {\n L(view, offset) {\n const x = view.getInt8(offset)\n return [x === 84, offset + 1]\n },\n B(view, offset) {\n return [view.getUint8(offset), offset + 1]\n },\n I(view, offset) {\n return [view.getInt16(offset, false), offset + 2]\n },\n J(view, offset) {\n return [view.getInt32(offset, false), offset + 4]\n },\n K(view, offset) {\n const val = view.getBigInt64(offset, false)\n return [val, offset + 8]\n },\n A(view, offset) {\n const val = String.fromCharCode(view.getUint8(offset))\n return [val, offset + 1]\n },\n E(view, offset) {\n return [view.getFloat32(offset, false), offset + 4]\n },\n D(view, offset) {\n return [view.getFloat64(offset, false), offset + 8]\n },\n C(view, offset) {\n const val1 = view.getFloat32(offset, false)\n const val2 = view.getFloat32(offset + 4, false)\n return [[val1, val2], offset + 8]\n },\n M(view, offset) {\n const val1 = view.getFloat64(offset, false)\n const val2 = view.getFloat64(offset + 8, false)\n return [[val1, val2], offset + 16]\n },\n}\n\n/**\n * Reads binary tables from FITS files (XTENSION = 'BINTABLE').\n *\n * Binary tables support a rich set of data types including logical,\n * integer, float, complex, character, bit arrays, and variable-length\n * array descriptors pointing to a heap area.\n */\nexport class BinaryTable extends Tabular {\n constructor(header: Header, data: ArrayBuffer | Blob) {\n super(header, data)\n this.initAccessors(header)\n }\n\n protected setAccessors(header: Header): void {\n const pattern = /(\\d*)([PQ]?)([LXBIJKAEDCM])(?:\\(\\d+\\))?$/\n\n for (let i = 1; i <= this.cols; i++) {\n const form = header.getString(`TFORM${i}`)\n const type = header.getString(`TTYPE${i}`)\n const match = pattern.exec(form)\n if (!match) {\n throw new Error(`Unsupported or invalid TFORM${i} value: '${form}'`)\n }\n\n const count = parseInt(match[1]!, 10) || 1\n const isArray = match[2]!\n const descriptor = match[3]!\n\n this.descriptors.push(descriptor)\n this.columnTypes.push(type)\n this.elementByteLengths.push((BINARY_TYPE_BYTE_SIZES[descriptor] ?? 1) * count)\n\n if (isArray) {\n this.setupArrayAccessor(descriptor, type)\n } else if (count === 1) {\n this.setupSingleAccessor(descriptor)\n } else if (descriptor === 'X') {\n this.setupBitArrayAccessor(count)\n } else if (descriptor === 'A') {\n this.setupCharArrayAccessor(count)\n } else {\n this.setupMultiAccessor(descriptor, count)\n }\n }\n }\n\n /**\n * Read data from the heap area following the main table data.\n */\n protected getFromHeap(view: DataView, offset: number, descriptor: string): [TypedArray, number] {\n const length = view.getInt32(offset, false)\n offset += 4\n const heapOffset = view.getInt32(offset, false)\n offset += 4\n\n if (!this.heap) {\n throw new Error('Heap not available')\n }\n\n const bytesPerElement = BINARY_TYPE_BYTE_SIZES[descriptor] ?? 1\n const heapSlice = this.heap.slice(heapOffset, heapOffset + length * bytesPerElement)\n const Ctor = TYPED_ARRAY_CONSTRUCTORS[descriptor]\n if (!Ctor) {\n throw new Error(`No typed array constructor for descriptor: ${descriptor}`)\n }\n\n const arr = new Ctor(heapSlice) as TypedArray\n\n // Endian swap (byte arrays don't need swapping)\n const swapFn = swapEndian[descriptor]\n if (swapFn && descriptor !== 'B') {\n for (let j = 0; j < arr.length; j++) {\n const value = arr[j]\n if (typeof value === 'number') {\n ;(arr as Float64Array)[j] = swapFn(value)\n }\n }\n }\n\n return [arr, offset]\n }\n\n private setupArrayAccessor(descriptor: string, type: string): void {\n if (type === 'COMPRESSED_DATA') {\n const accessor: BinaryAccessor = (view, offset) => {\n const [arr, newOffset] = this.getFromHeap(view, offset, descriptor)\n // Rice decompression is handled by CompressedImage subclass\n return [arr, newOffset]\n }\n this.accessors.push(accessor)\n } else if (type === 'GZIP_COMPRESSED_DATA') {\n const accessor: BinaryAccessor = (_view, _offset) => {\n throw new DecompressionError('GZIP decompression is not yet implemented')\n }\n this.accessors.push(accessor)\n } else {\n const accessor: BinaryAccessor = (view, offset) => {\n return this.getFromHeap(view, offset, descriptor)\n }\n this.accessors.push(accessor)\n }\n }\n\n private setupSingleAccessor(descriptor: string): void {\n const dataAccessor = DATA_ACCESSORS[descriptor]\n if (!dataAccessor) {\n throw new Error(`Unknown binary table type code: ${descriptor}`)\n }\n const accessor: BinaryAccessor = (view, offset) => {\n return dataAccessor(view, offset)\n }\n this.accessors.push(accessor)\n }\n\n private setupBitArrayAccessor(count: number): void {\n const nBytes = Math.ceil(count / 8)\n const accessor: BinaryAccessor = (view, offset) => {\n const buffer = view.buffer.slice(offset, offset + nBytes)\n const bytes = new Uint8Array(buffer)\n let bits: number[] = []\n for (let b = 0; b < bytes.length; b++) {\n bits = bits.concat(toBits(bytes[b]!))\n }\n return [bits.slice(0, count), offset + nBytes]\n }\n this.accessors.push(accessor)\n }\n\n private setupCharArrayAccessor(count: number): void {\n const accessor: BinaryAccessor = (view, offset) => {\n const buffer = view.buffer.slice(offset, offset + count)\n const arr = new Uint8Array(buffer)\n let s = ''\n for (let c = 0; c < arr.length; c++) {\n s += String.fromCharCode(arr[c]!)\n }\n return [s.trim(), offset + count]\n }\n this.accessors.push(accessor)\n }\n\n private setupMultiAccessor(descriptor: string, count: number): void {\n const dataAccessor = DATA_ACCESSORS[descriptor]\n if (!dataAccessor) {\n throw new Error(`Unknown binary table type code: ${descriptor}`)\n }\n const accessor: BinaryAccessor = (view, offset) => {\n const data: unknown[] = []\n let off = offset\n for (let c = 0; c < count; c++) {\n const [value, newOff] = dataAccessor(view, off)\n data.push(value)\n off = newOff\n }\n return [data, off]\n }\n this.accessors.push(accessor)\n }\n\n protected override _getRows(buffer: ArrayBuffer, nRows: number): TableRow[] | Float32Array {\n const view = new DataView(buffer)\n let offset = 0\n const rows: TableRow[] = []\n\n for (let r = 0; r < nRows; r++) {\n const row: TableRow = {}\n for (let c = 0; c < this.accessors.length; c++) {\n const [value, newOffset] = this.accessors[c]!(view, offset)\n offset = newOffset\n if (this.columns) {\n row[this.columns[c]!] = value\n }\n }\n rows.push(row)\n }\n\n return rows\n }\n}\n\nexport { DATA_ACCESSORS }\n","import type { TypedArray } from '../core/types'\n\n/**\n * Setup functions for Rice decompression, keyed by bytepix (1, 2, or 4).\n * Each returns [fsbits, fsmax, lastpix, pointer].\n */\nexport const RiceSetup: Record<number, (array: Uint8Array) => [number, number, number, number]> = {\n 1(array) {\n const pointer = 1\n const fsbits = 3\n const fsmax = 6\n const lastpix = array[0]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n\n 2(array) {\n const pointer = 2\n const fsbits = 4\n const fsmax = 14\n let lastpix = 0\n lastpix = lastpix | (array[0]! << 8)\n lastpix = lastpix | array[1]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n\n 4(array) {\n const pointer = 4\n const fsbits = 5\n const fsmax = 25\n let lastpix = 0\n lastpix = lastpix | (array[0]! << 24)\n lastpix = lastpix | (array[1]! << 16)\n lastpix = lastpix | (array[2]! << 8)\n lastpix = lastpix | array[3]!\n return [fsbits, fsmax, lastpix, pointer]\n },\n}\n\n/**\n * Rice decompression algorithm.\n *\n * Decompresses a byte array that was compressed using the Rice algorithm,\n * as defined in the FITS tiled image compression convention.\n *\n * @param array - Compressed byte array.\n * @param blocksize - Number of pixels encoded in a block.\n * @param bytepix - Number of bytes per original pixel (1, 2, or 4).\n * @param pixels - Output array to fill with decompressed values.\n * @param nx - Number of output pixels (tile length).\n * @param setup - Setup function map (default: RiceSetup).\n * @returns The filled pixels array.\n */\nexport function riceDecompress(\n array: Uint8Array,\n blocksize: number,\n bytepix: number,\n pixels: TypedArray,\n nx: number,\n setup: Record<number, (array: Uint8Array) => [number, number, number, number]> = RiceSetup,\n): TypedArray {\n const setupFn = setup[bytepix]\n if (!setupFn) {\n throw new Error(`Unsupported bytepix value: ${bytepix}`)\n }\n\n const [fsbits, fsmax, initialLastpix, initialPointer] = setupFn(array)\n let lastpix = initialLastpix\n let pointer = initialPointer\n\n const bbits = 1 << fsbits\n\n // Build non-zero count lookup table\n const nonzeroCount = new Uint8Array(256)\n let nzero = 8\n let k = 128\n let idx = 255\n while (idx >= 0) {\n while (idx >= k) {\n nonzeroCount[idx] = nzero\n idx--\n }\n k = k / 2\n nzero--\n }\n nonzeroCount[0] = 0\n\n // Bit buffer\n let b = array[pointer++]!\n let nbits = 8\n\n let i = 0\n while (i < nx) {\n nbits -= fsbits\n\n while (nbits < 0) {\n b = (b << 8) | array[pointer++]!\n nbits += 8\n }\n\n const fs = (b >> nbits) - 1\n b &= (1 << nbits) - 1\n\n let imax = i + blocksize\n if (imax > nx) imax = nx\n\n if (fs < 0) {\n // All pixels in block have same value\n while (i < imax) {\n ;(pixels as Int32Array)[i] = lastpix\n i++\n }\n } else if (fs === fsmax) {\n // Uncompressed block\n while (i < imax) {\n k = bbits - nbits\n let diff = b << k\n k -= 8\n while (k >= 0) {\n b = array[pointer++]!\n diff |= b << k\n k -= 8\n }\n if (nbits > 0) {\n b = array[pointer++]!\n diff |= b >> -k\n b &= (1 << nbits) - 1\n } else {\n b = 0\n }\n if ((diff & 1) === 0) {\n diff = diff >> 1\n } else {\n diff = ~(diff >> 1)\n }\n ;(pixels as Int32Array)[i] = diff + lastpix\n lastpix = (pixels as Int32Array)[i]!\n i++\n }\n } else {\n // Normal compressed block\n while (i < imax) {\n while (b === 0) {\n nbits += 8\n b = array[pointer++]!\n }\n nzero = nbits - nonzeroCount[b]!\n nbits -= nzero + 1\n b ^= 1 << nbits\n nbits -= fs\n while (nbits < 0) {\n b = (b << 8) | array[pointer++]!\n nbits += 8\n }\n let diff = (nzero << fs) | (b >> nbits)\n b &= (1 << nbits) - 1\n if ((diff & 1) === 0) {\n diff = diff >> 1\n } else {\n diff = ~(diff >> 1)\n }\n ;(pixels as Int32Array)[i] = diff + lastpix\n lastpix = (pixels as Int32Array)[i]!\n i++\n }\n }\n }\n\n return pixels\n}\n","import { DecompressionError } from '../core/errors'\n\nconst HCOMPRESS_MAGIC0 = 0xdd\nconst HCOMPRESS_MAGIC1 = 0x99\n\nclass BitReader {\n private nextChar = 0\n private bitBuffer = 0\n private bitsToGo = 0\n\n constructor(private readonly bytes: Uint8Array) {}\n\n readInt32BE(): number {\n const b0 = this.readByte()\n const b1 = this.readByte()\n const b2 = this.readByte()\n const b3 = this.readByte()\n return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3 | 0\n }\n\n readInt64BE(): bigint {\n let value = 0n\n for (let i = 0; i < 8; i++) {\n value = (value << 8n) + BigInt(this.readByte())\n }\n if ((value & (1n << 63n)) !== 0n) {\n value -= 1n << 64n\n }\n return value\n }\n\n readByte(): number {\n if (this.nextChar >= this.bytes.byteLength) {\n throw new DecompressionError('Unexpected end of HCOMPRESS stream')\n }\n const value = this.bytes[this.nextChar]\n this.nextChar += 1\n return value!\n }\n\n startBitInput(): void {\n this.bitsToGo = 0\n }\n\n inputBit(): number {\n if (this.bitsToGo === 0) {\n this.bitBuffer = this.readByte()\n this.bitsToGo = 8\n }\n this.bitsToGo -= 1\n return (this.bitBuffer >> this.bitsToGo) & 1\n }\n\n inputNBits(n: number): number {\n if (this.bitsToGo < n) {\n this.bitBuffer = (this.bitBuffer << 8) | this.readByte()\n this.bitsToGo += 8\n }\n this.bitsToGo -= n\n return (this.bitBuffer >> this.bitsToGo) & ((1 << n) - 1)\n }\n\n inputNybble(): number {\n if (this.bitsToGo < 4) {\n this.bitBuffer = (this.bitBuffer << 8) | this.readByte()\n this.bitsToGo += 8\n }\n this.bitsToGo -= 4\n return (this.bitBuffer >> this.bitsToGo) & 0x0f\n }\n\n inputNNybble(n: number, out: Uint8Array): void {\n for (let i = 0; i < n; i++) {\n out[i] = this.inputNybble()\n }\n }\n}\n\nfunction inputHuffman(reader: BitReader): number {\n let code = reader.inputNBits(3)\n if (code < 4) {\n return 1 << code\n }\n\n code = reader.inputBit() | (code << 1)\n if (code < 13) {\n switch (code) {\n case 8:\n return 3\n case 9:\n return 5\n case 10:\n return 10\n case 11:\n return 12\n case 12:\n return 15\n }\n }\n\n code = reader.inputBit() | (code << 1)\n if (code < 31) {\n switch (code) {\n case 26:\n return 6\n case 27:\n return 7\n case 28:\n return 9\n case 29:\n return 11\n case 30:\n return 13\n }\n }\n\n code = reader.inputBit() | (code << 1)\n return code === 62 ? 0 : 14\n}\n\nfunction qtreeBitins(\n source: Uint8Array,\n nx: number,\n ny: number,\n target: Int32Array,\n rowStride: number,\n bit: number,\n): void {\n const planeValue = 1 << bit\n let k = 0\n let i = 0\n for (; i < nx - 1; i += 2) {\n let s00 = rowStride * i\n let j = 0\n for (; j < ny - 1; j += 2) {\n const value = source[k]!\n if ((value & 1) !== 0) target[s00 + rowStride + 1] = target[s00 + rowStride + 1]! | planeValue\n if ((value & 2) !== 0) target[s00 + rowStride] = target[s00 + rowStride]! | planeValue\n if ((value & 4) !== 0) target[s00 + 1] = target[s00 + 1]! | planeValue\n if ((value & 8) !== 0) target[s00] = target[s00]! | planeValue\n s00 += 2\n k += 1\n }\n if (j < ny) {\n const value = source[k]!\n if ((value & 2) !== 0) target[s00 + rowStride] = target[s00 + rowStride]! | planeValue\n if ((value & 8) !== 0) target[s00] = target[s00]! | planeValue\n k += 1\n }\n }\n if (i < nx) {\n let s00 = rowStride * i\n let j = 0\n for (; j < ny - 1; j += 2) {\n const value = source[k]!\n if ((value & 4) !== 0) target[s00 + 1] = target[s00 + 1]! | planeValue\n if ((value & 8) !== 0) target[s00] = target[s00]! | planeValue\n s00 += 2\n k += 1\n }\n if (j < ny) {\n const value = source[k]!\n if ((value & 8) !== 0) target[s00] = target[s00]! | planeValue\n k += 1\n }\n }\n}\n\nfunction qtreeCopy(\n source: Uint8Array,\n nx: number,\n ny: number,\n target: Uint8Array,\n rowStride: number,\n): void {\n const nx2 = (nx + 1) >> 1\n const ny2 = (ny + 1) >> 1\n\n let k = ny2 * (nx2 - 1) + ny2 - 1\n for (let i = nx2 - 1; i >= 0; i--) {\n let s00 = 2 * (rowStride * i + ny2 - 1)\n for (let j = ny2 - 1; j >= 0; j--) {\n target[s00] = source[k]!\n k -= 1\n s00 -= 2\n }\n }\n\n let i = 0\n for (; i < nx - 1; i += 2) {\n let s00 = rowStride * i\n let s10 = s00 + rowStride\n let j = 0\n for (; j < ny - 1; j += 2) {\n const value = target[s00]!\n target[s10 + 1] = value & 1\n target[s10] = (value >> 1) & 1\n target[s00 + 1] = (value >> 2) & 1\n target[s00] = (value >> 3) & 1\n s00 += 2\n s10 += 2\n }\n if (j < ny) {\n const value = target[s00]!\n target[s10] = (value >> 1) & 1\n target[s00] = (value >> 3) & 1\n }\n }\n\n if (i < nx) {\n let s00 = rowStride * i\n let j = 0\n for (; j < ny - 1; j += 2) {\n const value = target[s00]!\n target[s00 + 1] = (value >> 2) & 1\n target[s00] = (value >> 3) & 1\n s00 += 2\n }\n if (j < ny) {\n target[s00] = (target[s00]! >> 3) & 1\n }\n }\n}\n\nfunction qtreeExpand(\n reader: BitReader,\n source: Uint8Array,\n nx: number,\n ny: number,\n target: Uint8Array,\n): void {\n qtreeCopy(source, nx, ny, target, ny)\n for (let i = nx * ny - 1; i >= 0; i--) {\n if (target[i] !== 0) {\n target[i] = inputHuffman(reader)\n }\n }\n}\n\nfunction readBdirect(\n reader: BitReader,\n target: Int32Array,\n rowStride: number,\n nqx: number,\n nqy: number,\n scratch: Uint8Array,\n bit: number,\n): void {\n const count = ((nqx + 1) >> 1) * ((nqy + 1) >> 1)\n reader.inputNNybble(count, scratch)\n qtreeBitins(scratch, nqx, nqy, target, rowStride, bit)\n}\n\nfunction qtreeDecode(\n reader: BitReader,\n target: Int32Array,\n rowStride: number,\n nqx: number,\n nqy: number,\n nBitplanes: number,\n): void {\n if (nBitplanes <= 0 || nqx <= 0 || nqy <= 0) {\n return\n }\n\n const nqmax = nqx > nqy ? nqx : nqy\n let log2n = Math.floor(Math.log(nqmax) / Math.log(2) + 0.5)\n if (nqmax > 1 << log2n) {\n log2n += 1\n }\n\n const nqx2 = (nqx + 1) >> 1\n const nqy2 = (nqy + 1) >> 1\n const scratch = new Uint8Array(nqx2 * nqy2)\n\n for (let bit = nBitplanes - 1; bit >= 0; bit--) {\n const formatCode = reader.inputNybble()\n if (formatCode === 0) {\n readBdirect(reader, target, rowStride, nqx, nqy, scratch, bit)\n continue\n }\n if (formatCode !== 0x0f) {\n throw new DecompressionError('Invalid HCOMPRESS bitplane format code')\n }\n\n scratch[0] = inputHuffman(reader)\n let nx = 1\n let ny = 1\n let nfx = nqx\n let nfy = nqy\n let c = 1 << log2n\n for (let k = 1; k < log2n; k++) {\n c >>= 1\n nx <<= 1\n ny <<= 1\n if (nfx <= c) {\n nx -= 1\n } else {\n nfx -= c\n }\n if (nfy <= c) {\n ny -= 1\n } else {\n nfy -= c\n }\n qtreeExpand(reader, scratch, nx, ny, scratch)\n }\n qtreeBitins(scratch, nqx, nqy, target, rowStride, bit)\n }\n}\n\nfunction unshuffle(\n values: Int32Array,\n start: number,\n n: number,\n n2: number,\n tmp: Int32Array,\n): void {\n const nhalf = (n + 1) >> 1\n let pt = 0\n let p1 = start + n2 * nhalf\n for (let i = nhalf; i < n; i++) {\n tmp[pt++] = values[p1]!\n p1 += n2\n }\n\n let p2 = start + n2 * (nhalf - 1)\n p1 = start + ((n2 * (nhalf - 1)) << 1)\n for (let i = nhalf - 1; i >= 0; i--) {\n values[p1] = values[p2]!\n p2 -= n2\n p1 -= n2 + n2\n }\n\n pt = 0\n p1 = start + n2\n for (let i = 1; i < n; i += 2) {\n values[p1] = tmp[pt++]!\n p1 += n2 + n2\n }\n}\n\nfunction hsmooth(\n values: Int32Array,\n nxTop: number,\n nyTop: number,\n ny: number,\n scale: number,\n): void {\n const smax = scale >> 1\n if (smax <= 0) return\n const ny2 = ny << 1\n\n for (let i = 2; i < nxTop - 2; i += 2) {\n let s00 = ny * i\n let s10 = s00 + ny\n for (let j = 0; j < nyTop; j += 2) {\n const hm = values[s00 - ny2]!\n const h0 = values[s00]!\n const hp = values[s00 + ny2]!\n let diff = hp - hm\n const dmax = Math.max(Math.min(hp - h0, h0 - hm), 0) << 2\n const dmin = Math.min(Math.max(hp - h0, h0 - hm), 0) << 2\n if (dmin < dmax) {\n diff = Math.max(Math.min(diff, dmax), dmin)\n let s = diff - (values[s10]! << 3)\n s = s >= 0 ? s >> 3 : (s + 7) >> 3\n s = Math.max(Math.min(s, smax), -smax)\n values[s10] = (values[s10]! + s) | 0\n }\n s00 += 2\n s10 += 2\n }\n }\n\n for (let i = 0; i < nxTop; i += 2) {\n let s00 = ny * i + 2\n for (let j = 2; j < nyTop - 2; j += 2) {\n const hm = values[s00 - 2]!\n const h0 = values[s00]!\n const hp = values[s00 + 2]!\n let diff = hp - hm\n const dmax = Math.max(Math.min(hp - h0, h0 - hm), 0) << 2\n const dmin = Math.min(Math.max(hp - h0, h0 - hm), 0) << 2\n if (dmin < dmax) {\n diff = Math.max(Math.min(diff, dmax), dmin)\n let s = diff - (values[s00 + 1]! << 3)\n s = s >= 0 ? s >> 3 : (s + 7) >> 3\n s = Math.max(Math.min(s, smax), -smax)\n values[s00 + 1] = (values[s00 + 1]! + s) | 0\n }\n s00 += 2\n }\n }\n\n for (let i = 2; i < nxTop - 2; i += 2) {\n let s00 = ny * i + 2\n let s10 = s00 + ny\n for (let j = 2; j < nyTop - 2; j += 2) {\n const hmm = values[s00 - ny2 - 2]!\n const hpm = values[s00 + ny2 - 2]!\n const hmp = values[s00 - ny2 + 2]!\n const hpp = values[s00 + ny2 + 2]!\n const h0 = values[s00]!\n let diff = hpp + hmm - hmp - hpm\n const hx2 = values[s10]! << 1\n const hy2 = values[s00 + 1]! << 1\n let m1 = Math.min(Math.max(hpp - h0, 0) - hx2 - hy2, Math.max(h0 - hpm, 0) + hx2 - hy2)\n let m2 = Math.min(Math.max(h0 - hmp, 0) - hx2 + hy2, Math.max(hmm - h0, 0) + hx2 + hy2)\n const dmax = Math.min(m1, m2) << 4\n m1 = Math.max(Math.min(hpp - h0, 0) - hx2 - hy2, Math.min(h0 - hpm, 0) + hx2 - hy2)\n m2 = Math.max(Math.min(h0 - hmp, 0) - hx2 + hy2, Math.min(hmm - h0, 0) + hx2 + hy2)\n const dmin = Math.max(m1, m2) << 4\n if (dmin < dmax) {\n diff = Math.max(Math.min(diff, dmax), dmin)\n let s = diff - (values[s10 + 1]! << 6)\n s = s >= 0 ? s >> 6 : (s + 63) >> 6\n s = Math.max(Math.min(s, smax), -smax)\n values[s10 + 1] = (values[s10 + 1]! + s) | 0\n }\n s00 += 2\n s10 += 2\n }\n }\n}\n\nfunction undigitize(values: Int32Array, scale: number): void {\n if (scale <= 1) return\n for (let i = 0; i < values.length; i++) {\n values[i] = Math.imul(values[i]!, scale)\n }\n}\n\nfunction hinv(values: Int32Array, nx: number, ny: number, smooth: boolean, scale: number): void {\n const nmax = nx > ny ? nx : ny\n let log2n = Math.floor(Math.log(nmax) / Math.log(2) + 0.5)\n if (nmax > 1 << log2n) {\n log2n += 1\n }\n\n const tmp = new Int32Array((nmax + 1) >> 1)\n\n let shift = 1\n let bit0 = 1 << (log2n - 1)\n let bit1 = bit0 << 1\n let bit2 = bit0 << 2\n let mask0 = -bit0\n let mask1 = mask0 << 1\n const mask2 = mask0 << 2\n let prnd0 = bit0 >> 1\n let prnd1 = bit1 >> 1\n const prnd2 = bit2 >> 1\n let nrnd0 = prnd0 - 1\n let nrnd1 = prnd1 - 1\n const nrnd2 = prnd2 - 1\n\n values[0] = (values[0]! + (values[0]! >= 0 ? prnd2 : nrnd2)) & mask2\n\n let nxTop = 1\n let nyTop = 1\n let nxf = nx\n let nyf = ny\n let c = 1 << log2n\n\n for (let k = log2n - 1; k >= 0; k--) {\n c >>= 1\n nxTop <<= 1\n nyTop <<= 1\n if (nxf <= c) {\n nxTop -= 1\n } else {\n nxf -= c\n }\n if (nyf <= c) {\n nyTop -= 1\n } else {\n nyf -= c\n }\n\n if (k === 0) {\n nrnd0 = 0\n shift = 2\n }\n\n for (let i = 0; i < nxTop; i++) {\n unshuffle(values, ny * i, nyTop, 1, tmp)\n }\n for (let j = 0; j < nyTop; j++) {\n unshuffle(values, j, nxTop, ny, tmp)\n }\n\n if (smooth) {\n hsmooth(values, nxTop, nyTop, ny, scale)\n }\n\n const oddx = nxTop % 2\n const oddy = nyTop % 2\n let i = 0\n for (; i < nxTop - oddx; i += 2) {\n let s00 = ny * i\n let s10 = s00 + ny\n let j = 0\n for (; j < nyTop - oddy; j += 2) {\n let h0 = values[s00]!\n let hx = values[s10]!\n let hy = values[s00 + 1]!\n let hc = values[s10 + 1]!\n hx = (hx + (hx >= 0 ? prnd1 : nrnd1)) & mask1\n hy = (hy + (hy >= 0 ? prnd1 : nrnd1)) & mask1\n hc = (hc + (hc >= 0 ? prnd0 : nrnd0)) & mask0\n const lowbit0 = hc & bit0\n hx = hx >= 0 ? hx - lowbit0 : hx + lowbit0\n hy = hy >= 0 ? hy - lowbit0 : hy + lowbit0\n const lowbit1 = (hc ^ hx ^ hy) & bit1\n h0 = h0 >= 0 ? h0 + lowbit0 - lowbit1 : h0 + (lowbit0 === 0 ? lowbit1 : lowbit0 - lowbit1)\n\n values[s10 + 1] = (h0 + hx + hy + hc) >> shift\n values[s10] = (h0 + hx - hy - hc) >> shift\n values[s00 + 1] = (h0 - hx + hy - hc) >> shift\n values[s00] = (h0 - hx - hy + hc) >> shift\n s00 += 2\n s10 += 2\n }\n if (oddy) {\n let h0 = values[s00]!\n let hx = values[s10]!\n hx = (hx + (hx >= 0 ? prnd1 : nrnd1)) & mask1\n const lowbit1 = hx & bit1\n h0 = h0 >= 0 ? h0 - lowbit1 : h0 + lowbit1\n values[s10] = (h0 + hx) >> shift\n values[s00] = (h0 - hx) >> shift\n }\n }\n\n if (oddx) {\n let s00 = ny * i\n let j = 0\n for (; j < nyTop - oddy; j += 2) {\n let h0 = values[s00]!\n let hy = values[s00 + 1]!\n hy = (hy + (hy >= 0 ? prnd1 : nrnd1)) & mask1\n const lowbit1 = hy & bit1\n h0 = h0 >= 0 ? h0 - lowbit1 : h0 + lowbit1\n values[s00 + 1] = (h0 + hy) >> shift\n values[s00] = (h0 - hy) >> shift\n s00 += 2\n }\n if (oddy) {\n values[s00] = values[s00]! >> shift\n }\n }\n\n bit2 = bit1\n bit1 = bit0\n bit0 >>= 1\n mask1 = mask0\n mask0 >>= 1\n prnd1 = prnd0\n prnd0 >>= 1\n nrnd1 = nrnd0\n nrnd0 = prnd0 - 1\n }\n}\n\ninterface DecodeResult {\n pixels: Int32Array\n nx: number\n ny: number\n}\n\nfunction decodeCore(reader: BitReader, smooth: boolean): DecodeResult {\n const magic0 = reader.readByte()\n const magic1 = reader.readByte()\n if (magic0 !== HCOMPRESS_MAGIC0 || magic1 !== HCOMPRESS_MAGIC1) {\n throw new DecompressionError('Invalid HCOMPRESS stream magic')\n }\n\n const nx = reader.readInt32BE()\n const ny = reader.readInt32BE()\n const scale = reader.readInt32BE()\n const sumAll = Number(reader.readInt64BE())\n const nBitplanes = Uint8Array.from([reader.readByte(), reader.readByte(), reader.readByte()])\n\n const values = new Int32Array(nx * ny)\n const nx2 = (nx + 1) >> 1\n const ny2 = (ny + 1) >> 1\n\n reader.startBitInput()\n qtreeDecode(reader, values.subarray(0), ny, nx2, ny2, nBitplanes[0]!)\n qtreeDecode(reader, values.subarray(ny2), ny, nx2, Math.floor(ny / 2), nBitplanes[1]!)\n qtreeDecode(reader, values.subarray(ny * nx2), ny, Math.floor(nx / 2), ny2, nBitplanes[1]!)\n qtreeDecode(\n reader,\n values.subarray(ny * nx2 + ny2),\n ny,\n Math.floor(nx / 2),\n Math.floor(ny / 2),\n nBitplanes[2]!,\n )\n\n if (reader.inputNybble() !== 0) {\n throw new DecompressionError('Invalid HCOMPRESS bit-plane termination marker')\n }\n\n reader.startBitInput()\n for (let i = 0; i < values.length; i++) {\n if (values[i] !== 0 && reader.inputBit() !== 0) {\n values[i] = -values[i]!\n }\n }\n\n values[0] = sumAll | 0\n undigitize(values, scale)\n hinv(values, nx, ny, smooth, scale)\n return { pixels: values, nx, ny }\n}\n\nexport function hDecompressInt32(input: Uint8Array, smooth: boolean = false): DecodeResult {\n const reader = new BitReader(input)\n return decodeCore(reader, smooth)\n}\n","import { BinaryTable } from './binary-table'\nimport { getExtent, getPixel } from './image-utils'\nimport { riceDecompress, RiceSetup } from './decompress'\nimport { hDecompressInt32 } from './hcompress-decode'\nimport { N_RANDOM, NULL_VALUE, ZERO_VALUE } from '../core/constants'\nimport { DecompressionError } from '../core/errors'\nimport { TYPED_ARRAY_CONSTRUCTORS } from '../core/types'\nimport { gunzipSync } from 'fflate'\nimport type { Header } from './header'\nimport type { TableRow, TypedArray, AlgorithmParameters } from '../core/types'\n\nexport interface CompressedImageDecodeContext {\n algorithm: string\n compressedBytes: Uint8Array\n compressedData: TypedArray\n descriptor: string\n zbitpix: number\n tileSize: number\n ztile: readonly number[]\n algorithmParameters: Readonly<AlgorithmParameters>\n}\n\nexport interface CompressedImageDecoderProvider {\n decodeTile(context: CompressedImageDecodeContext): ArrayLike<number> | null | undefined\n}\n\nexport interface CompressedImageOptions {\n decoderProvider?: CompressedImageDecoderProvider\n}\n\nlet globalCompressedImageDecoderProvider: CompressedImageDecoderProvider | undefined\n\nexport function setCompressedImageDecoderProvider(\n decoderProvider: CompressedImageDecoderProvider | undefined,\n): void {\n globalCompressedImageDecoderProvider = decoderProvider\n}\n\nexport function getCompressedImageDecoderProvider(): CompressedImageDecoderProvider | undefined {\n return globalCompressedImageDecoderProvider\n}\n\n/**\n * Predefined random number generator from the FITS tiled image compression standard.\n * This is the same method used by fpack when dithering images during compression.\n * See: http://arxiv.org/pdf/1201.1336v1.pdf\n */\nfunction generateRandomSequence(): Float32Array {\n const a = 16807\n const m = 2147483647\n let seed = 1\n\n const random = new Float32Array(N_RANDOM)\n for (let i = 0; i < N_RANDOM; i++) {\n const temp = a * seed\n seed = temp - m * Math.floor(temp / m)\n random[i] = seed / m\n }\n return random\n}\n\n/** Pre-computed random dithering sequence. */\nconst RANDOM_SEQUENCE = generateRandomSequence()\n\nfunction decodePLIOWordsToPixels(lineList: Int16Array, tileSize: number): Int32Array {\n const word = (index1Based: number): number => lineList[index1Based - 1] ?? 0\n\n let lineLength: number\n let lineFirst: number\n if (word(3) > 0) {\n lineLength = word(3)\n lineFirst = 4\n } else {\n lineLength = (word(5) << 15) + (word(4) & 0x7fff)\n lineFirst = word(2) + 1\n }\n\n const pixels = new Int32Array(tileSize)\n if (tileSize <= 0 || lineLength <= 0) {\n return pixels\n }\n\n const xs = 1\n const xe = xs + tileSize - 1\n let skipNextWord = false\n let outputPosition = 1\n let x1 = 1\n let previousValue = 1\n\n for (let ip = lineFirst; ip <= lineLength; ip++) {\n if (skipNextWord) {\n skipNextWord = false\n continue\n }\n\n const instruction = word(ip)\n const opcode = Math.trunc(instruction / 4096)\n const data = instruction & 4095\n\n if (opcode === 0 || opcode === 4 || opcode === 5) {\n const x2 = x1 + data - 1\n const i1 = Math.max(x1, xs)\n const i2 = Math.min(x2, xe)\n const count = i2 - i1 + 1\n if (count > 0) {\n const outputTop = outputPosition + count - 1\n if (opcode === 4) {\n for (let i = outputPosition; i <= outputTop; i++) {\n pixels[i - 1] = previousValue\n }\n } else {\n for (let i = outputPosition; i <= outputTop; i++) {\n pixels[i - 1] = 0\n }\n if (opcode === 5 && i2 === x2) {\n pixels[outputTop - 1] = previousValue\n }\n }\n outputPosition = outputTop + 1\n }\n x1 = x2 + 1\n } else if (opcode === 1) {\n previousValue = (word(ip + 1) << 12) + data\n skipNextWord = true\n } else if (opcode === 2) {\n previousValue += data\n } else if (opcode === 3) {\n previousValue -= data\n } else if (opcode === 6 || opcode === 7) {\n previousValue += opcode === 6 ? data : -data\n if (x1 >= xs && x1 <= xe) {\n pixels[outputPosition - 1] = previousValue\n outputPosition++\n }\n x1++\n }\n\n if (x1 > xe) {\n break\n }\n }\n\n for (let i = outputPosition; i <= tileSize; i++) {\n pixels[i - 1] = 0\n }\n return pixels\n}\n\nfunction decodePLIOData(data: TypedArray): Int16Array {\n if (data instanceof Int16Array) {\n return data\n }\n if (data instanceof Uint8Array) {\n if (data.byteLength % 2 !== 0) {\n throw new DecompressionError('PLIO_1 compressed stream must contain 16-bit words')\n }\n const words = new Int16Array(data.byteLength / 2)\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength)\n for (let i = 0; i < words.length; i++) {\n words[i] = view.getInt16(i * 2, false)\n }\n return words\n }\n\n if (data instanceof Uint16Array) {\n const words = new Int16Array(data.length)\n for (let i = 0; i < data.length; i++) {\n words[i] = (data[i]! << 16) >> 16\n }\n return words\n }\n\n throw new DecompressionError(\n `PLIO_1 requires Int16Array/Uint16Array/Uint8Array compressed payload, got ${data.constructor.name}`,\n )\n}\n\nfunction toByteView(data: TypedArray): Uint8Array {\n if (data instanceof Uint8Array) {\n return data\n }\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n}\n\nfunction decodeBigEndianTileValues(\n compressedBytes: Uint8Array,\n zbitpix: number,\n tileSize: number,\n): ArrayLike<number> {\n const view = new DataView(\n compressedBytes.buffer,\n compressedBytes.byteOffset,\n compressedBytes.byteLength,\n )\n if (zbitpix === 8) {\n if (compressedBytes.byteLength < tileSize) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=8')\n }\n const out = new Int32Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = compressedBytes[i]!\n return out\n }\n if (zbitpix === 16) {\n if (compressedBytes.byteLength < tileSize * 2) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=16')\n }\n const out = new Int32Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = view.getInt16(i * 2, false)\n return out\n }\n if (zbitpix === 32) {\n if (compressedBytes.byteLength < tileSize * 4) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=32')\n }\n const out = new Int32Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = view.getInt32(i * 4, false)\n return out\n }\n if (zbitpix === 64) {\n if (compressedBytes.byteLength < tileSize * 8) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=64')\n }\n const out = new Float64Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = Number(view.getBigInt64(i * 8, false))\n return out\n }\n if (zbitpix === -32) {\n if (compressedBytes.byteLength < tileSize * 4) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=-32')\n }\n const out = new Float32Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = view.getFloat32(i * 4, false)\n return out\n }\n if (zbitpix === -64) {\n if (compressedBytes.byteLength < tileSize * 8) {\n throw new DecompressionError('Decoded GZIP tile is smaller than expected for BITPIX=-64')\n }\n const out = new Float64Array(tileSize)\n for (let i = 0; i < tileSize; i++) out[i] = view.getFloat64(i * 8, false)\n return out\n }\n throw new DecompressionError(`Unsupported ZBITPIX for GZIP_1: ${zbitpix}`)\n}\n\n/**\n * Reads Rice-compressed FITS images stored as binary tables.\n *\n * Compressed images are stored in BINTABLE extensions with ZIMAGE=T.\n * Each row in the table represents one tile of the image.\n * This class decompresses tiles and reconstructs the full image,\n * applying subtractive dithering when appropriate.\n */\nexport class CompressedImage extends BinaryTable {\n readonly zcmptype: string\n readonly zbitpix: number\n readonly znaxis: number\n readonly zblank: number | null\n readonly blank: number | null\n readonly zdither: number\n readonly ztile: number[]\n readonly width: number\n readonly height: number\n readonly bzero: number\n readonly bscale: number\n readonly algorithmParameters: AlgorithmParameters\n readonly zquantiz: string\n readonly decoderProvider?: CompressedImageDecoderProvider\n private currentTilePixelCount?: number\n\n constructor(header: Header, data: ArrayBuffer | Blob, options: CompressedImageOptions = {}) {\n super(header, data)\n\n this.zcmptype = header.getString('ZCMPTYPE')\n this.zbitpix = header.getNumber('ZBITPIX')\n this.znaxis = header.getNumber('ZNAXIS')\n this.zblank = header.contains('ZBLANK') ? header.getNumber('ZBLANK') : null\n this.blank = header.contains('BLANK') ? header.getNumber('BLANK') : null\n this.zdither = header.getNumber('ZDITHER0')\n\n this.ztile = []\n for (let i = 1; i <= this.znaxis; i++) {\n const ztile = header.contains(`ZTILE${i}`)\n ? header.getNumber(`ZTILE${i}`)\n : i === 1\n ? header.getNumber('ZNAXIS1')\n : 1\n this.ztile.push(ztile)\n }\n\n this.width = header.getNumber('ZNAXIS1')\n this.height = header.getNumber('ZNAXIS2', 1)\n\n // Set default compression parameters\n this.algorithmParameters = {}\n if (this.zcmptype === 'RICE_1') {\n this.algorithmParameters['BLOCKSIZE'] = 32\n this.algorithmParameters['BYTEPIX'] = 4\n }\n\n // Override with header-specified parameters\n let paramIdx = 1\n while (header.contains(`ZNAME${paramIdx}`)) {\n const name = header.getString(`ZNAME${paramIdx}`)\n const value = header.getNumber(`ZVAL${paramIdx}`)\n this.algorithmParameters[name] = value\n paramIdx++\n }\n\n this.zquantiz = header.getString('ZQUANTIZ', 'LINEAR_SCALING')\n this.bzero = header.getNumber('BZERO')\n this.bscale = header.getNumber('BSCALE', 1)\n this.decoderProvider = options.decoderProvider\n\n // Re-initialize accessors now that CompressedImage fields are set.\n // BinaryTable.constructor already called initAccessors, but CompressedImage\n // overrides setAccessors and needs its own fields (width, algorithmParameters, etc.)\n // to be initialized first.\n this.initAccessors(header)\n }\n\n private decodeCompressedTile(\n compressedData: TypedArray,\n descriptor: string,\n tileSize: number,\n ): ArrayLike<number> {\n const compressedBytes = toByteView(compressedData)\n\n if (this.zcmptype === 'RICE_1') {\n const bytepix = this.algorithmParameters['BYTEPIX'] ?? 4\n const blocksize = this.algorithmParameters['BLOCKSIZE'] ?? 32\n const Ctor = TYPED_ARRAY_CONSTRUCTORS[bytepix]\n if (!Ctor) {\n throw new Error(`No typed array for bytepix: ${bytepix}`)\n }\n const pixels = new Ctor(tileSize) as TypedArray\n riceDecompress(compressedBytes as Uint8Array, blocksize, bytepix, pixels, tileSize, RiceSetup)\n return pixels as unknown as ArrayLike<number>\n }\n\n if (this.zcmptype === 'GZIP_1') {\n const raw = gunzipSync(compressedBytes)\n return decodeBigEndianTileValues(raw, this.zbitpix, tileSize)\n }\n if (this.zcmptype === 'PLIO_1') {\n const words = decodePLIOData(compressedData)\n return decodePLIOWordsToPixels(words, tileSize)\n }\n if (this.zcmptype === 'HCOMPRESS_1') {\n const smooth = (this.algorithmParameters['SMOOTH'] ?? 0) !== 0\n const decoded = hDecompressInt32(compressedBytes, smooth).pixels\n if (decoded.length !== tileSize) {\n throw new DecompressionError(\n `HCOMPRESS_1 tile length mismatch (decoded=${decoded.length}, expected=${tileSize})`,\n )\n }\n return decoded\n }\n\n const provider = this.decoderProvider ?? globalCompressedImageDecoderProvider\n if (provider) {\n const decoded = provider.decodeTile({\n algorithm: this.zcmptype,\n compressedBytes,\n compressedData,\n descriptor,\n zbitpix: this.zbitpix,\n tileSize,\n ztile: this.ztile,\n algorithmParameters: this.algorithmParameters,\n })\n if (decoded !== undefined && decoded !== null) {\n return decoded\n }\n }\n\n throw new DecompressionError(`Unsupported compressed image algorithm: ${this.zcmptype}`)\n }\n\n private getNominalTileWidth(): number {\n return this.ztile?.[0] ?? this.width\n }\n\n private getNominalTileHeight(): number {\n return this.ztile?.[1] ?? 1\n }\n\n private getDefaultTilePixelCount(): number {\n return this.getNominalTileWidth() * this.getNominalTileHeight()\n }\n\n private getTilePlacement(tileIndex1Based: number): {\n x: number\n y: number\n width: number\n height: number\n pixelCount: number\n } {\n const nominalTileWidth = this.getNominalTileWidth()\n const nominalTileHeight = this.getNominalTileHeight()\n const tilesX = Math.max(1, Math.ceil(this.width / nominalTileWidth))\n\n const tileIndex0 = Math.max(0, tileIndex1Based - 1)\n const tileXIndex = tileIndex0 % tilesX\n const tileYIndex = Math.floor(tileIndex0 / tilesX)\n\n const x = tileXIndex * nominalTileWidth\n const y = tileYIndex * nominalTileHeight\n const width = Math.max(0, Math.min(nominalTileWidth, this.width - x))\n const height = Math.max(0, Math.min(nominalTileHeight, this.height - y))\n\n return {\n x,\n y,\n width,\n height,\n pixelCount: width * height,\n }\n }\n\n /**\n * Override setAccessors to replace compressed data column accessors\n * with decompression-aware versions. Delegates base TFORM parsing to BinaryTable.\n */\n protected override setAccessors(header: Header): void {\n // Let BinaryTable handle all the TFORM parsing and standard accessor setup\n super.setAccessors(header)\n\n // Now replace accessors for compressed columns\n for (let c = 0; c < this.columnTypes.length; c++) {\n const type = this.columnTypes[c]\n const descriptor = this.descriptors[c]!\n\n if (type === 'COMPRESSED_DATA') {\n this.accessors[c] = (view, offset) => {\n const [arr, newOffset] = this.getFromHeap(view, offset, descriptor)\n const tileSize = this.currentTilePixelCount ?? this.getDefaultTilePixelCount()\n return [this.decodeCompressedTile(arr, descriptor, tileSize), newOffset]\n }\n } else if (type === 'GZIP_COMPRESSED_DATA') {\n this.accessors[c] = (view, offset) => {\n const [arr, newOffset] = this.getFromHeap(view, offset, descriptor)\n const compressedBytes =\n arr instanceof Uint8Array\n ? arr\n : new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength)\n const tileSize = this.currentTilePixelCount ?? this.getDefaultTilePixelCount()\n const raw = gunzipSync(compressedBytes)\n return [decodeBigEndianTileValues(raw, this.zbitpix, tileSize), newOffset]\n }\n }\n }\n }\n\n /**\n * Override _getRows to handle compressed image tile decompression\n * and subtractive dithering.\n */\n protected override _getRows(buffer: ArrayBuffer, nRows: number): Float32Array {\n const view = new DataView(buffer)\n let offset = 0\n const arr = new Float32Array(this.width * this.height)\n\n let tileIndex = 0\n let rowsRemaining = nRows\n while (rowsRemaining--) {\n tileIndex++\n const nTile = tileIndex\n const tilePlacement = this.getTilePlacement(nTile)\n this.currentTilePixelCount = tilePlacement.pixelCount\n\n const row: TableRow = {}\n for (let c = 0; c < this.accessors.length; c++) {\n const [value, newOffset] = this.accessors[c]!(view, offset)\n offset = newOffset\n if (this.columns) {\n row[this.columns[c]!] = value\n }\n }\n\n // Get compressed data and scaling parameters\n const data = (row['COMPRESSED_DATA'] ||\n row['UNCOMPRESSED_DATA'] ||\n row['GZIP_COMPRESSED_DATA']) as ArrayLike<number>\n const scale = (row['ZSCALE'] as number) || this.bscale\n const zero = (row['ZZERO'] as number) || this.bzero\n\n // Dequantize each pixel in the tile\n const useDither =\n this.zquantiz === 'SUBTRACTIVE_DITHER_1' || this.zquantiz === 'SUBTRACTIVE_DITHER_2'\n\n // Subtractive dithering setup (only when dithering is enabled)\n let rIndex = 0\n let seed1 = 0\n if (useDither) {\n const seed0 = nTile + this.zdither - 1\n const seed1Initial = (seed0 - 1) % N_RANDOM\n seed1 = seed1Initial < 0 ? seed1Initial + N_RANDOM : seed1Initial\n rIndex = Math.floor(RANDOM_SEQUENCE[seed1]! * 500)\n }\n\n const decodeLength = Math.min(data.length, tilePlacement.pixelCount)\n for (let idx = 0; idx < decodeLength; idx++) {\n if (tilePlacement.width <= 0 || tilePlacement.height <= 0) {\n continue\n }\n\n const localX = idx % tilePlacement.width\n const localY = Math.floor(idx / tilePlacement.width)\n if (localY >= tilePlacement.height) {\n break\n }\n\n const pixelIndex = (tilePlacement.y + localY) * this.width + tilePlacement.x + localX\n const value = data[idx]!\n\n if (value === NULL_VALUE) {\n arr[pixelIndex] = NaN\n } else if (value === ZERO_VALUE) {\n arr[pixelIndex] = 0\n } else if (useDither) {\n const r = RANDOM_SEQUENCE[rIndex]!\n arr[pixelIndex] = (value - r + 0.5) * scale + zero\n } else {\n arr[pixelIndex] = value * scale + zero\n }\n\n // Update random index (only when dithering)\n if (useDither) {\n rIndex++\n if (rIndex === N_RANDOM) {\n seed1 = (seed1 + 1) % N_RANDOM\n rIndex = Math.floor(RANDOM_SEQUENCE[seed1]! * 500)\n }\n }\n }\n\n this.currentTilePixelCount = undefined\n }\n\n return arr\n }\n\n /**\n * Read a frame from the compressed image.\n * Exposes the same API as Image.getFrame() for consistency.\n */\n async getFrame(_nFrame: number = 0): Promise<Float32Array> {\n if (this.heap) {\n const result = await this.getRows(0, this.rows)\n return result as Float32Array\n }\n\n // Need to read heap from blob first\n if (!this.blob) {\n throw new Error('No data source available')\n }\n\n const heapBlob = this.blob.slice(this.length, this.length + this.heapLength)\n this.heap = await heapBlob.arrayBuffer()\n\n return this.getFrame(_nFrame)\n }\n\n /** Compute min/max pixel values, ignoring NaN. */\n getExtent(arr: Float32Array): [number, number] {\n const [min, max] = getExtent(arr)\n return [Number(min), Number(max)]\n }\n\n /** Get a single pixel value at (x, y). */\n getPixel(arr: Float32Array, x: number, y: number): number {\n return Number(getPixel(arr, x, y, this.width))\n }\n}\n","import { BLOCK_LENGTH, LINE_WIDTH } from '../core/constants'\nimport { Header } from './header'\nimport { HDU } from './hdu'\nimport { Image } from './image'\nimport { Table } from './table'\nimport { BinaryTable } from './binary-table'\nimport { CompressedImage } from './compressed-image'\nimport { excessBytes, uint8ArrayToString } from '../core/utils'\nimport type { DataUnit } from './data-unit'\nimport type { DataUnitType, ReadOptions } from '../core/types'\n\n/**\n * Data unit factory: creates the appropriate data unit subclass based on header info.\n */\nfunction createDataUnit(header: Header, data: ArrayBuffer | Blob): DataUnit | undefined {\n const type: DataUnitType | null = header.getDataType()\n if (!type) return undefined\n\n switch (type) {\n case 'Image':\n return new Image(header, data)\n case 'BinaryTable':\n return new BinaryTable(header, data)\n case 'Table':\n return new Table(header, data)\n case 'CompressedImage':\n return new CompressedImage(header, data)\n default:\n return undefined\n }\n}\n\n/**\n * Parse a FITS file from an ArrayBuffer.\n *\n * Reads 2880-byte blocks sequentially, looking for the END keyword\n * to delimit headers. After each header, the corresponding data unit\n * is sliced from the buffer and an HDU is created.\n *\n * @param buffer - The complete FITS file as an ArrayBuffer.\n * @returns Array of parsed HDUs.\n */\nexport function parseBuffer(buffer: ArrayBuffer, options?: ReadOptions): HDU[] {\n const hdus: HDU[] = []\n const totalLength = buffer.byteLength\n let offset = 0\n\n while (offset < totalLength) {\n // --- Read header blocks ---\n let blockCount = 0\n let headerStorage = new Uint8Array(0)\n let headerFound = false\n\n while (!headerFound && offset + blockCount * BLOCK_LENGTH + BLOCK_LENGTH <= totalLength) {\n const blockStart = offset + blockCount * BLOCK_LENGTH\n const blockBytes = new Uint8Array(buffer, blockStart, BLOCK_LENGTH)\n\n // Expand header storage\n const newStorage = new Uint8Array(headerStorage.length + BLOCK_LENGTH)\n newStorage.set(headerStorage, 0)\n newStorage.set(blockBytes, headerStorage.length)\n headerStorage = newStorage\n\n // Check block for END keyword (scanning rows bottom-up)\n const rows = BLOCK_LENGTH / LINE_WIDTH\n for (let row = rows - 1; row >= 0; row--) {\n const rowIndex = row * LINE_WIDTH\n const b = blockBytes[rowIndex]!\n\n // Skip whitespace rows\n if (b === 32) continue\n\n // Check for 'E' 'N' 'D' ' ' (69, 78, 68, 32)\n if (\n b === 69 &&\n blockBytes[rowIndex + 1] === 78 &&\n blockBytes[rowIndex + 2] === 68 &&\n blockBytes[rowIndex + 3] === 32\n ) {\n headerFound = true\n break\n }\n\n // If we hit a non-whitespace, non-END row, stop checking this block\n break\n }\n\n blockCount++\n\n if (!headerFound) {\n continue\n }\n\n // Parse header string\n const headerString = uint8ArrayToString(headerStorage)\n const header = new Header(headerString, options?.maxHeaderLines, options?.onWarning)\n\n // Calculate data unit position\n const headerEnd = offset + blockCount * BLOCK_LENGTH\n const dataLength = header.getDataLength()\n\n // Slice data unit bytes\n const dataSlice = buffer.slice(headerEnd, headerEnd + dataLength)\n\n // Create data unit if header indicates one\n let dataunit: DataUnit | undefined\n if (header.hasDataUnit()) {\n dataunit = createDataUnit(header, dataSlice)\n }\n\n // Store HDU\n hdus.push(new HDU(header, dataunit))\n\n // Advance offset past header + data + padding\n offset = headerEnd + dataLength + excessBytes(dataLength)\n\n // If we've reached the end of the file, stop\n if (offset >= totalLength) {\n break\n }\n }\n\n // Safety: if header was not found, break to avoid infinite loop\n if (!headerFound) {\n break\n }\n }\n\n return hdus\n}\n\n/**\n * Parse a FITS file from a Blob (File object) using streaming block reads.\n *\n * Reads header blocks incrementally (2880 bytes at a time) without loading\n * the entire file into memory. Data units are kept as Blob slices for\n * lazy on-demand reading, significantly reducing memory usage for large files.\n *\n * @param blob - The FITS file as a Blob or File object.\n * @returns Promise resolving to an array of parsed HDUs.\n */\nexport async function parseBlob(blob: Blob, options?: ReadOptions): Promise<HDU[]> {\n const hdus: HDU[] = []\n const totalLength = blob.size\n let offset = 0\n\n while (offset < totalLength) {\n // --- Read header blocks incrementally ---\n let blockCount = 0\n const headerChunks: Uint8Array[] = []\n let headerFound = false\n\n while (!headerFound && offset + blockCount * BLOCK_LENGTH + BLOCK_LENGTH <= totalLength) {\n const blockStart = offset + blockCount * BLOCK_LENGTH\n const blockBlob = blob.slice(blockStart, blockStart + BLOCK_LENGTH)\n const blockBuffer = await blockBlob.arrayBuffer()\n const blockBytes = new Uint8Array(blockBuffer)\n\n headerChunks.push(blockBytes)\n\n // Check block for END keyword (scanning rows bottom-up)\n const rows = BLOCK_LENGTH / LINE_WIDTH\n for (let row = rows - 1; row >= 0; row--) {\n const rowIndex = row * LINE_WIDTH\n const b = blockBytes[rowIndex]!\n\n if (b === 32) continue\n\n if (\n b === 69 &&\n blockBytes[rowIndex + 1] === 78 &&\n blockBytes[rowIndex + 2] === 68 &&\n blockBytes[rowIndex + 3] === 32\n ) {\n headerFound = true\n break\n }\n\n break\n }\n\n blockCount++\n\n if (!headerFound) {\n continue\n }\n\n // Assemble header string from chunks\n const totalHeaderBytes = headerChunks.reduce((sum, c) => sum + c.length, 0)\n const headerStorage = new Uint8Array(totalHeaderBytes)\n let pos = 0\n for (const chunk of headerChunks) {\n headerStorage.set(chunk, pos)\n pos += chunk.length\n }\n const headerString = uint8ArrayToString(headerStorage)\n const header = new Header(headerString, options?.maxHeaderLines, options?.onWarning)\n\n // Calculate data unit position\n const headerEnd = offset + blockCount * BLOCK_LENGTH\n const dataLength = header.getDataLength()\n\n // Create data unit using Blob slice (lazy — no data loaded yet)\n let dataunit: DataUnit | undefined\n if (header.hasDataUnit()) {\n const dataBlob = blob.slice(headerEnd, headerEnd + dataLength)\n dataunit = createDataUnit(header, dataBlob)\n }\n\n hdus.push(new HDU(header, dataunit))\n\n // Advance past header + data + padding\n offset = headerEnd + dataLength + excessBytes(dataLength)\n\n if (offset >= totalLength) {\n break\n }\n }\n\n if (!headerFound) {\n break\n }\n }\n\n return hdus\n}\n","import { parseBuffer, parseBlob } from './parser'\nimport { HDU } from './hdu'\nimport type { Header } from './header'\nimport type { DataUnit } from './data-unit'\nimport type { ReadOptions, FetchOptions } from '../core/types'\n\n/**\n * Main FITS class — the primary entry point for reading FITS files.\n *\n * Provides static factory methods for creating FITS instances from\n * various data sources (ArrayBuffer, Blob/File, URL, Node.js Buffer).\n *\n * @example\n * ```ts\n * // From URL (browser)\n * const fits = await FITS.fromURL('https://example.com/image.fits');\n *\n * // From ArrayBuffer\n * const fits = FITS.fromArrayBuffer(buffer);\n *\n * // From File object (browser)\n * const fits = await FITS.fromBlob(fileInput.files[0]);\n *\n * // Access data\n * const header = fits.getHeader();\n * const image = fits.getDataUnit();\n * ```\n */\nexport class FITS {\n /** All Header Data Units in this FITS file. */\n readonly hdus: HDU[]\n\n private constructor(hdus: HDU[]) {\n this.hdus = hdus\n }\n\n // --- Static factory methods ---\n\n /**\n * Parse a FITS file from an ArrayBuffer (synchronous).\n */\n static fromArrayBuffer(buffer: ArrayBuffer, options?: ReadOptions): FITS {\n const hdus = parseBuffer(buffer, options)\n return new FITS(hdus)\n }\n\n /**\n * Parse a FITS file from a Blob or File object (async).\n */\n static async fromBlob(blob: Blob, options?: ReadOptions): Promise<FITS> {\n const hdus = await parseBlob(blob, options)\n return new FITS(hdus)\n }\n\n /**\n * Fetch a remote FITS file and parse it (async, browser or Node 18+).\n *\n * @param url - URL of the FITS file.\n * @param init - Optional fetch RequestInit (headers, signal, etc.).\n */\n static async fromURL(url: string, options?: FetchOptions): Promise<FITS> {\n const response = await fetch(url, options?.requestInit)\n if (!response.ok) {\n throw new Error(`Failed to fetch FITS file: ${response.status} ${response.statusText}`)\n }\n const buffer = await response.arrayBuffer()\n return FITS.fromArrayBuffer(buffer, options)\n }\n\n /**\n * Parse a FITS file from a Node.js Buffer.\n * The buffer is converted to an ArrayBuffer internally.\n */\n static fromNodeBuffer(\n nodeBuffer: { buffer: ArrayBuffer; byteOffset: number; byteLength: number },\n options?: ReadOptions,\n ): FITS {\n const arrayBuffer = nodeBuffer.buffer.slice(\n nodeBuffer.byteOffset,\n nodeBuffer.byteOffset + nodeBuffer.byteLength,\n )\n return FITS.fromArrayBuffer(arrayBuffer, options)\n }\n\n // --- Public API ---\n\n /**\n * Returns the first HDU containing a data unit.\n * If `index` is provided, returns that specific HDU.\n */\n getHDU(index?: number): HDU | undefined {\n if (index !== undefined) {\n return index >= 0 && index < this.hdus.length ? this.hdus[index] : undefined\n }\n for (const hdu of this.hdus) {\n if (hdu.hasData()) return hdu\n }\n return undefined\n }\n\n /**\n * Returns the header associated with the first HDU containing a data unit.\n * If `index` is provided, returns the header of that specific HDU.\n */\n getHeader(index?: number): Header | undefined {\n return this.getHDU(index)?.header\n }\n\n /**\n * Returns the data unit associated with the first HDU containing a data unit.\n * If `index` is provided, returns the data unit of that specific HDU.\n */\n getDataUnit(index?: number): DataUnit | undefined {\n return this.getHDU(index)?.data\n }\n}\n","import { FITSError } from '../core/errors'\n\nexport class XISFError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFError'\n }\n}\n\nexport class XISFParseError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFParseError'\n }\n}\n\nexport class XISFValidationError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFValidationError'\n }\n}\n\nexport class XISFResourceError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFResourceError'\n }\n}\n\nexport class XISFCompressionError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFCompressionError'\n }\n}\n\nexport class XISFChecksumError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFChecksumError'\n }\n}\n\nexport class XISFSignatureError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFSignatureError'\n }\n}\n\nexport class XISFConversionError extends XISFError {\n constructor(message: string) {\n super(message)\n this.name = 'XISFConversionError'\n }\n}\n","import { XISFParseError } from './xisf-errors'\n\nconst XISF_SIGNATURE = 'XISF0100'\nconst SIGNATURE_LENGTH = 8\nconst HEADER_LENGTH_OFFSET = 8\nconst RESERVED_LENGTH = 4\nconst HEADER_OFFSET = SIGNATURE_LENGTH + 4 + RESERVED_LENGTH\n\nexport interface XISFMonolithicContainer {\n signature: string\n headerLength: number\n reserved: Uint8Array\n headerXml: string\n payload: Uint8Array\n}\n\nfunction readAscii(bytes: Uint8Array): string {\n return new TextDecoder('ascii').decode(bytes)\n}\n\nexport function isMonolithicXISF(buffer: ArrayBuffer): boolean {\n if (buffer.byteLength < HEADER_OFFSET) return false\n const signature = readAscii(new Uint8Array(buffer, 0, SIGNATURE_LENGTH))\n return signature === XISF_SIGNATURE\n}\n\nexport function parseMonolithicContainer(buffer: ArrayBuffer): XISFMonolithicContainer {\n if (buffer.byteLength < HEADER_OFFSET) {\n throw new XISFParseError('Invalid XISF file: too short')\n }\n\n const signature = readAscii(new Uint8Array(buffer, 0, SIGNATURE_LENGTH))\n if (signature !== XISF_SIGNATURE) {\n throw new XISFParseError(`Invalid XISF signature: ${signature}`)\n }\n\n const view = new DataView(buffer)\n const headerLength = view.getUint32(HEADER_LENGTH_OFFSET, true)\n const headerBegin = HEADER_OFFSET\n const headerEnd = headerBegin + headerLength\n\n if (headerEnd > buffer.byteLength) {\n throw new XISFParseError('Invalid XISF header length')\n }\n\n const headerBytes = new Uint8Array(buffer, headerBegin, headerLength)\n const headerXml = new TextDecoder('utf-8').decode(headerBytes)\n const reserved = new Uint8Array(buffer, SIGNATURE_LENGTH + 4, RESERVED_LENGTH)\n const payload = new Uint8Array(buffer, headerEnd)\n\n return {\n signature,\n headerLength,\n reserved,\n headerXml,\n payload,\n }\n}\n\nexport function extractAttachmentBytes(\n buffer: ArrayBuffer,\n position: number,\n size: number,\n): Uint8Array {\n if (position < 0 || size < 0 || position + size > buffer.byteLength) {\n throw new XISFParseError(`Attachment block out of bounds: position=${position}, size=${size}`)\n }\n return new Uint8Array(buffer, position, size)\n}\n\nexport function buildMonolithicContainer(\n headerXml: string,\n attachments: Array<{ position: number; data: Uint8Array }>,\n): Uint8Array {\n const headerBytes = new TextEncoder().encode(headerXml)\n const baseLength = HEADER_OFFSET + headerBytes.byteLength\n\n let total = baseLength\n for (const attachment of attachments) {\n const end = attachment.position + attachment.data.byteLength\n if (end > total) total = end\n }\n\n const out = new Uint8Array(total)\n out.set(new TextEncoder().encode(XISF_SIGNATURE), 0)\n const view = new DataView(out.buffer)\n view.setUint32(HEADER_LENGTH_OFFSET, headerBytes.byteLength, true)\n view.setUint32(SIGNATURE_LENGTH + 4, 0, true)\n out.set(headerBytes, HEADER_OFFSET)\n\n for (const attachment of attachments) {\n out.set(attachment.data, attachment.position)\n }\n\n return out\n}\n\nexport const XISF_CONSTANTS = {\n XISF_SIGNATURE,\n SIGNATURE_LENGTH,\n RESERVED_LENGTH,\n HEADER_OFFSET,\n}\n","import { DOMParser, XMLSerializer } from '@xmldom/xmldom'\nimport { XISFParseError, XISFValidationError } from './xisf-errors'\n\nconst XML_NS = 'http://www.pixinsight.com/xisf'\n\nfunction nodeName(node: Node): string {\n const anyNode = node as Node & { localName?: string; nodeName: string }\n const local = anyNode.localName\n if (local && local.length > 0) return local\n const raw = anyNode.nodeName\n const idx = raw.indexOf(':')\n return idx >= 0 ? raw.slice(idx + 1) : raw\n}\n\nfunction isElementNode(node: Node): node is Element {\n return node.nodeType === 1\n}\n\nexport function parseXISFXML(xml: string): Document {\n const doc = new DOMParser().parseFromString(xml, 'application/xml')\n const parseErrors = doc.getElementsByTagName('parsererror')\n if (parseErrors.length > 0) {\n throw new XISFParseError((parseErrors[0]?.textContent ?? 'Invalid XML').trim())\n }\n const root = doc.documentElement\n if (!root) {\n throw new XISFParseError('Empty XML document')\n }\n if (nodeName(root) !== 'xisf') {\n throw new XISFValidationError(`Invalid root element: ${root.nodeName}`)\n }\n const version = root.getAttribute('version')\n if (version !== '1.0') {\n throw new XISFValidationError(`Unsupported XISF version: ${version ?? 'none'}`)\n }\n return doc\n}\n\nexport function getXISFNamespace(): string {\n return XML_NS\n}\n\nexport function getElementChildren(parent: Element): Element[] {\n const out: Element[] = []\n for (let i = 0; i < parent.childNodes.length; i++) {\n const node = parent.childNodes.item(i)\n if (node && isElementNode(node)) {\n out.push(node)\n }\n }\n return out\n}\n\nexport function getChildrenByName(parent: Element, name: string): Element[] {\n return getElementChildren(parent).filter((e) => nodeName(e) === name)\n}\n\nexport function getFirstChildByName(parent: Element, name: string): Element | null {\n const children = getChildrenByName(parent, name)\n return children.length > 0 ? children[0]! : null\n}\n\nexport function getNodeName(node: Node): string {\n return nodeName(node)\n}\n\nexport function serializeXML(doc: Document): string {\n return new XMLSerializer().serializeToString(doc)\n}\n\nexport function createDocument(): Document {\n const doc = new DOMParser().parseFromString(\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?><xisf version=\"1.0\"/>',\n 'application/xml',\n )\n const root = doc.documentElement\n root.setAttribute('xmlns', XML_NS)\n root.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')\n root.setAttribute(\n 'xsi:schemaLocation',\n 'http://www.pixinsight.com/xisf http://pixinsight.com/xisf/xisf-1.0.xsd',\n )\n return doc\n}\n","import type { XISFLocation } from './xisf-types'\nimport { XISFParseError, XISFValidationError } from './xisf-errors'\n\nconst URL_OR_PATH = /^(url|path)\\((.*)\\)(?::(.*))?$/\n\nfunction parseIndexId(raw: string | undefined): bigint | undefined {\n if (!raw) return undefined\n const value = raw.trim()\n if (value.length === 0) return undefined\n if (value.startsWith('0x') || value.startsWith('0X')) return BigInt(value)\n return BigInt(value)\n}\n\nexport function parseXISFLocation(location: string): XISFLocation {\n const trimmed = location.trim()\n\n if (trimmed.startsWith('inline:')) {\n const encoding = trimmed.slice('inline:'.length)\n if (encoding !== 'base64' && encoding !== 'hex') {\n throw new XISFParseError(`Unsupported inline encoding: ${encoding}`)\n }\n return { type: 'inline', encoding }\n }\n\n if (trimmed === 'embedded') {\n return { type: 'embedded' }\n }\n\n if (trimmed.startsWith('attachment:') || trimmed.startsWith('attached:')) {\n const canonical = trimmed.startsWith('attached:')\n ? `attachment:${trimmed.slice('attached:'.length)}`\n : trimmed\n const parts = canonical.split(':')\n if (parts.length !== 3) {\n throw new XISFParseError(`Invalid attachment location: ${location}`)\n }\n const position = Number(parts[1])\n const size = Number(parts[2])\n if (!Number.isInteger(position) || !Number.isInteger(size) || position < 0 || size < 0) {\n throw new XISFParseError(`Invalid attachment numbers: ${location}`)\n }\n return { type: 'attachment', position, size }\n }\n\n const match = URL_OR_PATH.exec(trimmed)\n if (match) {\n const kind = match[1]!\n const spec = match[2]!\n const indexId = parseIndexId(match[3])\n if (kind === 'url') {\n return { type: 'url', url: spec, indexId }\n }\n return { type: 'path', path: spec, indexId }\n }\n\n throw new XISFParseError(`Unsupported location syntax: ${location}`)\n}\n\nexport function parseCompressionSubblocks(\n value: string,\n): Array<{ compressedSize: number; uncompressedSize: number }> {\n if (!value.trim()) return []\n return value.split(':').map((entry) => {\n const parts = entry.split(',')\n if (parts.length !== 2) {\n throw new XISFParseError(`Invalid subblocks entry: ${entry}`)\n }\n const compressedSize = Number(parts[0])\n const uncompressedSize = Number(parts[1])\n if (\n !Number.isInteger(compressedSize) ||\n !Number.isInteger(uncompressedSize) ||\n compressedSize < 0 ||\n uncompressedSize < 0\n ) {\n throw new XISFParseError(`Invalid subblocks values: ${entry}`)\n }\n return { compressedSize, uncompressedSize }\n })\n}\n\nexport function parseChecksumSpec(value: string): { algorithm: string; digest: string } {\n const idx = value.indexOf(':')\n if (idx <= 0) {\n throw new XISFParseError(`Invalid checksum format: ${value}`)\n }\n return {\n algorithm: value.slice(0, idx).toLowerCase(),\n digest: value.slice(idx + 1).toLowerCase(),\n }\n}\n\nexport function parseCompressionSpec(value: string): {\n codec: string\n uncompressedSize: number\n itemSize?: number\n} {\n const parts = value.split(':')\n if (parts.length < 2 || parts.length > 3) {\n throw new XISFParseError(`Invalid compression format: ${value}`)\n }\n const codec = parts[0]!.toLowerCase()\n const uncompressedSize = Number(parts[1])\n if (!Number.isInteger(uncompressedSize) || uncompressedSize < 0) {\n throw new XISFParseError(`Invalid uncompressed size: ${value}`)\n }\n if (parts.length === 3) {\n const itemSize = Number(parts[2])\n if (!Number.isInteger(itemSize) || itemSize <= 0) {\n throw new XISFParseError(`Invalid shuffle item size: ${value}`)\n }\n return { codec, uncompressedSize, itemSize }\n }\n return { codec, uncompressedSize }\n}\n\nexport function resolveHeaderRelativePath(pathSpec: string, headerDir?: string): string {\n if (pathSpec.startsWith('@header_dir/')) {\n if (!headerDir) {\n throw new XISFValidationError('Path uses @header_dir but no headerDir was provided')\n }\n const rel = pathSpec.slice('@header_dir/'.length)\n if (/^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//.test(headerDir)) {\n return new URL(rel, `${headerDir.replace(/\\/?$/, '/')}`).toString()\n }\n return `${headerDir.replace(/\\\\/g, '/').replace(/\\/$/, '')}/${rel}`\n }\n return pathSpec\n}\n","import type { XISFDataBlock, XISFProperty } from './xisf-types'\nimport {\n parseChecksumSpec,\n parseCompressionSpec,\n parseCompressionSubblocks,\n parseXISFLocation,\n} from './xisf-location'\nimport { getFirstChildByName } from './xisf-xml'\nimport { XISFValidationError } from './xisf-errors'\n\nexport type ReadDataBlock = (element: Element, block: XISFDataBlock) => Promise<Uint8Array>\nexport interface ParsePropertyOptions {\n strictValidation?: boolean\n defaultType?: string\n defaultId?: string\n defaultFormat?: string\n}\n\ntype ScalarType =\n | 'Boolean'\n | 'Int8'\n | 'UInt8'\n | 'Int16'\n | 'UInt16'\n | 'Int32'\n | 'UInt32'\n | 'Int64'\n | 'UInt64'\n | 'Float32'\n | 'Float64'\n | 'Complex32'\n | 'Complex64'\n | 'String'\n | 'TimePoint'\n\nconst SCALAR_ALIASES: Record<string, ScalarType> = {\n Boolean: 'Boolean',\n Int8: 'Int8',\n UInt8: 'UInt8',\n Byte: 'UInt8',\n Int16: 'Int16',\n UInt16: 'UInt16',\n Short: 'Int16',\n UShort: 'UInt16',\n Int32: 'Int32',\n UInt32: 'UInt32',\n Int: 'Int32',\n UInt: 'UInt32',\n Int64: 'Int64',\n UInt64: 'UInt64',\n Float32: 'Float32',\n Float: 'Float32',\n Float64: 'Float64',\n Double: 'Float64',\n Complex32: 'Complex32',\n Complex64: 'Complex64',\n String: 'String',\n TimePoint: 'TimePoint',\n}\n\nconst VECTOR_BASE: Record<string, ScalarType> = {\n I8Vector: 'Int8',\n UI8Vector: 'UInt8',\n ByteArray: 'UInt8',\n I16Vector: 'Int16',\n UI16Vector: 'UInt16',\n I32Vector: 'Int32',\n UI32Vector: 'UInt32',\n I64Vector: 'Int64',\n UI64Vector: 'UInt64',\n IVector: 'Int32',\n UIVector: 'UInt32',\n F32Vector: 'Float32',\n F64Vector: 'Float64',\n Vector: 'Float64',\n C32Vector: 'Complex32',\n C64Vector: 'Complex64',\n}\n\nconst MATRIX_BASE: Record<string, ScalarType> = {\n I8Matrix: 'Int8',\n UI8Matrix: 'UInt8',\n ByteMatrix: 'UInt8',\n I16Matrix: 'Int16',\n UI16Matrix: 'UInt16',\n I32Matrix: 'Int32',\n UI32Matrix: 'UInt32',\n I64Matrix: 'Int64',\n UI64Matrix: 'UInt64',\n IMatrix: 'Int32',\n UIMatrix: 'UInt32',\n F32Matrix: 'Float32',\n F64Matrix: 'Float64',\n Matrix: 'Float64',\n C32Matrix: 'Complex32',\n C64Matrix: 'Complex64',\n}\n\nfunction normalizeScalarType(type: string): ScalarType | undefined {\n return SCALAR_ALIASES[type]\n}\n\nfunction parseBoolean(value: string): boolean {\n const lowered = value.toLowerCase()\n return lowered === 'true' || lowered === '1'\n}\n\nfunction parseComplexText(raw: string): { real: number; imag: number } {\n const normalized = raw.trim().replace(',', ':')\n const idx = normalized.indexOf(':')\n if (idx > 0) {\n return {\n real: Number.parseFloat(normalized.slice(0, idx)),\n imag: Number.parseFloat(normalized.slice(idx + 1)),\n }\n }\n return { real: Number.parseFloat(normalized), imag: 0 }\n}\n\nfunction parseScalarValue(\n type: string,\n raw: string,\n): string | number | boolean | bigint | Record<string, unknown> {\n const normalized = normalizeScalarType(type) ?? type\n switch (normalized) {\n case 'Boolean':\n return parseBoolean(raw)\n case 'Int8':\n case 'Int16':\n case 'Int32':\n return Number.parseInt(raw, 10)\n case 'UInt8':\n case 'UInt16':\n case 'UInt32':\n return Number.parseInt(raw, 10)\n case 'Int64':\n case 'UInt64':\n return BigInt(raw)\n case 'Float32':\n case 'Float64':\n return Number.parseFloat(raw)\n case 'Complex32':\n case 'Complex64':\n return parseComplexText(raw)\n case 'TimePoint':\n case 'String':\n default:\n return raw\n }\n}\n\nfunction dataBlockByteOrder(block: XISFDataBlock): 'little' | 'big' {\n return block.byteOrder === 'big' ? 'big' : 'little'\n}\n\nfunction scalarByteSize(type: ScalarType): number {\n switch (type) {\n case 'Boolean':\n case 'Int8':\n case 'UInt8':\n return 1\n case 'Int16':\n case 'UInt16':\n return 2\n case 'Int32':\n case 'UInt32':\n case 'Float32':\n return 4\n case 'Int64':\n case 'UInt64':\n case 'Float64':\n return 8\n case 'Complex32':\n return 8\n case 'Complex64':\n return 16\n case 'String':\n case 'TimePoint':\n return 1\n }\n}\n\nfunction decodeScalarFromBytes(\n type: ScalarType,\n bytes: Uint8Array,\n byteOrder: 'little' | 'big',\n): string | number | boolean | bigint | Record<string, unknown> {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const little = byteOrder === 'little'\n if (bytes.byteLength < scalarByteSize(type)) {\n throw new XISFValidationError('Property data block is shorter than required for scalar type')\n }\n switch (type) {\n case 'Boolean':\n return view.getUint8(0) !== 0\n case 'Int8':\n return view.getInt8(0)\n case 'UInt8':\n return view.getUint8(0)\n case 'Int16':\n return view.getInt16(0, little)\n case 'UInt16':\n return view.getUint16(0, little)\n case 'Int32':\n return view.getInt32(0, little)\n case 'UInt32':\n return view.getUint32(0, little)\n case 'Int64':\n return view.getBigInt64(0, little)\n case 'UInt64':\n return view.getBigUint64(0, little)\n case 'Float32':\n return view.getFloat32(0, little)\n case 'Float64':\n return view.getFloat64(0, little)\n case 'Complex32':\n return {\n real: view.getFloat32(0, little),\n imag: view.getFloat32(4, little),\n }\n case 'Complex64':\n return {\n real: view.getFloat64(0, little),\n imag: view.getFloat64(8, little),\n }\n case 'String':\n case 'TimePoint':\n return new TextDecoder('utf-8').decode(bytes)\n }\n}\n\nfunction decodePrimitiveArray(\n type: ScalarType,\n bytes: Uint8Array,\n byteOrder: 'little' | 'big',\n length?: number,\n): ArrayLike<number | bigint> {\n const little = byteOrder === 'little'\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const itemSize = scalarByteSize(type)\n const count = length ?? Math.floor(bytes.byteLength / itemSize)\n switch (type) {\n case 'Int8': {\n const out = new Int8Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getInt8(i)\n return out\n }\n case 'UInt8':\n case 'Boolean': {\n const out = new Uint8Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getUint8(i)\n return out\n }\n case 'Int16': {\n const out = new Int16Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getInt16(i * 2, little)\n return out\n }\n case 'UInt16': {\n const out = new Uint16Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getUint16(i * 2, little)\n return out\n }\n case 'Int32': {\n const out = new Int32Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getInt32(i * 4, little)\n return out\n }\n case 'UInt32': {\n const out = new Uint32Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getUint32(i * 4, little)\n return out\n }\n case 'Int64': {\n const out = new BigInt64Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getBigInt64(i * 8, little)\n return out\n }\n case 'UInt64': {\n const out = new BigUint64Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getBigUint64(i * 8, little)\n return out\n }\n case 'Float32': {\n const out = new Float32Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getFloat32(i * 4, little)\n return out\n }\n case 'Float64': {\n const out = new Float64Array(count)\n for (let i = 0; i < count; i++) out[i] = view.getFloat64(i * 8, little)\n return out\n }\n case 'Complex32': {\n const out = new Float32Array(count * 2)\n for (let i = 0; i < count; i++) {\n out[i * 2] = view.getFloat32(i * 8, little)\n out[i * 2 + 1] = view.getFloat32(i * 8 + 4, little)\n }\n return out\n }\n case 'Complex64': {\n const out = new Float64Array(count * 2)\n for (let i = 0; i < count; i++) {\n out[i * 2] = view.getFloat64(i * 16, little)\n out[i * 2 + 1] = view.getFloat64(i * 16 + 8, little)\n }\n return out\n }\n case 'String':\n case 'TimePoint':\n return new Uint8Array(bytes)\n }\n}\n\nexport function parseDataBlockAttributes(element: Element): XISFDataBlock | undefined {\n const locationRaw = element.getAttribute('location')\n if (!locationRaw) return undefined\n\n const location = parseXISFLocation(locationRaw)\n const checksumRaw = element.getAttribute('checksum')\n const compressionRaw = element.getAttribute('compression')\n const byteOrderRaw = element.getAttribute('byteOrder')\n const subblocksRaw = element.getAttribute('subblocks')\n\n const dataBlock: XISFDataBlock = {\n location,\n byteOrder: byteOrderRaw === 'big' ? 'big' : byteOrderRaw === 'little' ? 'little' : undefined,\n }\n\n if (checksumRaw) {\n const checksum = parseChecksumSpec(checksumRaw)\n dataBlock.checksum = {\n algorithm: checksum.algorithm as never,\n digest: checksum.digest,\n }\n }\n\n if (compressionRaw) {\n const compression = parseCompressionSpec(compressionRaw)\n dataBlock.compression = {\n codec: compression.codec as never,\n uncompressedSize: compression.uncompressedSize,\n itemSize: compression.itemSize,\n subblocks: subblocksRaw ? parseCompressionSubblocks(subblocksRaw) : undefined,\n }\n }\n\n if (location.type === 'inline') {\n dataBlock.inlineData = (element.textContent ?? '').trim()\n } else if (location.type === 'embedded') {\n const dataElement = getFirstChildByName(element, 'Data')\n if (dataElement) {\n const encoding = dataElement.getAttribute('encoding')\n if (encoding === 'base64' || encoding === 'hex') {\n location.encoding = encoding\n }\n dataBlock.embeddedData = (dataElement.textContent ?? '').trim()\n if (!dataBlock.compression) {\n const embeddedCompressionRaw = dataElement.getAttribute('compression')\n if (embeddedCompressionRaw) {\n const compression = parseCompressionSpec(embeddedCompressionRaw)\n dataBlock.compression = {\n codec: compression.codec as never,\n uncompressedSize: compression.uncompressedSize,\n itemSize: compression.itemSize,\n subblocks: dataElement.getAttribute('subblocks')\n ? parseCompressionSubblocks(dataElement.getAttribute('subblocks')!)\n : undefined,\n }\n }\n }\n }\n }\n\n return dataBlock\n}\n\nfunction parseVectorData(type: string, bytes: Uint8Array, length?: number): ArrayLike<number> {\n const baseType = VECTOR_BASE[type]\n if (!baseType) return new Uint8Array(bytes)\n return decodePrimitiveArray(baseType, bytes, 'little', length) as ArrayLike<number>\n}\n\nexport async function parsePropertyElement(\n element: Element,\n readDataBlock: ReadDataBlock,\n options?: ParsePropertyOptions,\n): Promise<XISFProperty> {\n const strict = options?.strictValidation ?? true\n const id = element.getAttribute('id') ?? options?.defaultId ?? ''\n const type = element.getAttribute('type') ?? options?.defaultType ?? ''\n const format = element.getAttribute('format') ?? options?.defaultFormat ?? undefined\n const comment = element.getAttribute('comment') ?? undefined\n\n if (strict && !type) {\n throw new XISFValidationError(`Property '${id || '<unnamed>'}' is missing type`)\n }\n\n const property: XISFProperty = { id, type, format, comment }\n\n const valueAttr = element.hasAttribute('value') ? element.getAttribute('value') : null\n if (valueAttr !== null) {\n property.value = parseScalarValue(type, valueAttr)\n return property\n }\n\n const lengthAttr = element.getAttribute('length')\n const rowsAttr = element.getAttribute('rows')\n const columnsAttr = element.getAttribute('columns')\n if (lengthAttr) property.length = Number(lengthAttr)\n if (rowsAttr) property.rows = Number(rowsAttr)\n if (columnsAttr) property.columns = Number(columnsAttr)\n if (\n strict &&\n property.length !== undefined &&\n (!Number.isInteger(property.length) || property.length < 0)\n ) {\n throw new XISFValidationError(\n `Invalid property length '${lengthAttr}' for '${id || '<unnamed>'}'`,\n )\n }\n if (\n strict &&\n property.rows !== undefined &&\n (!Number.isInteger(property.rows) || property.rows < 0)\n ) {\n throw new XISFValidationError(`Invalid property rows '${rowsAttr}' for '${id || '<unnamed>'}'`)\n }\n if (\n strict &&\n property.columns !== undefined &&\n (!Number.isInteger(property.columns) || property.columns < 0)\n ) {\n throw new XISFValidationError(\n `Invalid property columns '${columnsAttr}' for '${id || '<unnamed>'}'`,\n )\n }\n\n const block = parseDataBlockAttributes(element)\n if (!block) {\n if (type === 'String' || type === 'TimePoint') {\n property.value = element.textContent ?? ''\n } else if (normalizeScalarType(type) && (element.textContent ?? '').trim().length > 0) {\n property.value = parseScalarValue(type, (element.textContent ?? '').trim())\n }\n return property\n }\n\n property.dataBlock = block\n const data = await readDataBlock(element, block)\n const byteOrder = dataBlockByteOrder(block)\n\n if (type === 'String') {\n property.value = new TextDecoder('utf-8').decode(data)\n return property\n }\n if (type === 'TimePoint') {\n property.value = new TextDecoder('utf-8').decode(data)\n return property\n }\n\n const scalarType = normalizeScalarType(type)\n if (scalarType && scalarType !== 'String' && scalarType !== 'TimePoint') {\n property.value = decodeScalarFromBytes(scalarType, data, byteOrder)\n return property\n }\n\n if (\n type.endsWith('Vector') ||\n type === 'ByteArray' ||\n type === 'IVector' ||\n type === 'UIVector' ||\n type === 'Vector'\n ) {\n const baseType = VECTOR_BASE[type]\n if (!baseType) {\n property.value = parseVectorData(type, data, property.length)\n return property\n }\n property.value = decodePrimitiveArray(baseType, data, byteOrder, property.length)\n return property\n }\n\n if (type.endsWith('Matrix')) {\n const rows = property.rows ?? 0\n const columns = property.columns ?? 0\n const baseType = MATRIX_BASE[type]\n if (!baseType) {\n property.value = data\n return property\n }\n const itemCount = rows > 0 && columns > 0 ? rows * columns : undefined\n const arr = decodePrimitiveArray(baseType, data, byteOrder, itemCount)\n const values = Array.from(arr)\n const matrix: Array<Array<number | bigint>> = []\n for (let r = 0; r < rows; r++) {\n matrix.push(values.slice(r * columns, (r + 1) * columns))\n }\n property.value = { rows, columns, values: matrix }\n return property\n }\n\n property.value = data\n return property\n}\n","import type { XISFStructureField, XISFTable, XISFTableRow } from './xisf-types'\nimport { getChildrenByName, getFirstChildByName } from './xisf-xml'\nimport {\n parsePropertyElement,\n type ParsePropertyOptions,\n type ReadDataBlock,\n} from './xisf-property'\nimport { XISFValidationError } from './xisf-errors'\n\nfunction parseField(element: Element): XISFStructureField {\n return {\n id: element.getAttribute('id') ?? '',\n type: element.getAttribute('type') ?? '',\n format: element.getAttribute('format') ?? undefined,\n header: element.getAttribute('header') ?? undefined,\n }\n}\n\ninterface ParseTableOptions {\n strictValidation?: boolean\n}\n\nfunction cloneCellAsProperty(source: Element, field: XISFStructureField | undefined): Element {\n const propertyLike = source.cloneNode(true) as Element\n if (field?.id && !propertyLike.getAttribute('id')) {\n propertyLike.setAttribute('id', field.id)\n }\n if (field?.type && !propertyLike.getAttribute('type')) {\n propertyLike.setAttribute('type', field.type)\n }\n if (field?.format && !propertyLike.getAttribute('format')) {\n propertyLike.setAttribute('format', field.format)\n }\n return propertyLike\n}\n\nasync function parseRow(\n element: Element,\n fields: XISFStructureField[],\n readDataBlock: ReadDataBlock,\n options?: ParsePropertyOptions,\n): Promise<XISFTableRow> {\n const cells = getChildrenByName(element, 'Cell')\n const parsedCells = await Promise.all(\n cells.map((cell, index) => {\n const field = fields[index]\n const propertyNode = cloneCellAsProperty(cell, field)\n return parsePropertyElement(propertyNode, readDataBlock, {\n ...options,\n defaultType: field?.type,\n defaultId: field?.id,\n defaultFormat: field?.format,\n })\n }),\n )\n return { cells: parsedCells }\n}\n\nexport async function parseTableElement(\n element: Element,\n resolveReference: (ref: string) => Element | null,\n readDataBlock: ReadDataBlock,\n options?: ParseTableOptions,\n): Promise<XISFTable> {\n const strict = options?.strictValidation ?? true\n const id = element.getAttribute('id') ?? ''\n const caption = element.getAttribute('caption') ?? undefined\n const rows = element.getAttribute('rows') ? Number(element.getAttribute('rows')) : undefined\n const columns = element.getAttribute('columns')\n ? Number(element.getAttribute('columns'))\n : undefined\n const comment = element.getAttribute('comment') ?? undefined\n if (strict && rows !== undefined && (!Number.isInteger(rows) || rows < 0)) {\n throw new XISFValidationError(`Table '${id || '<unnamed>'}' has invalid rows value`)\n }\n if (strict && columns !== undefined && (!Number.isInteger(columns) || columns < 0)) {\n throw new XISFValidationError(`Table '${id || '<unnamed>'}' has invalid columns value`)\n }\n\n let structureElement = getFirstChildByName(element, 'Structure')\n if (!structureElement) {\n const ref = getFirstChildByName(element, 'Reference')\n if (ref) {\n const refId = ref.getAttribute('ref')\n if (refId) {\n const target = resolveReference(refId)\n if (target && target.tagName.toLowerCase().endsWith('structure')) {\n structureElement = target\n } else if (strict) {\n throw new XISFValidationError(\n `Table '${id || '<unnamed>'}' has invalid Structure reference '${refId}'`,\n )\n }\n }\n }\n }\n\n const fields: XISFStructureField[] = structureElement\n ? getChildrenByName(structureElement, 'Field').map(parseField)\n : []\n\n const rowElements = getChildrenByName(element, 'Row')\n const dataRows = await Promise.all(\n rowElements.map((rowElement) =>\n parseRow(rowElement, fields, readDataBlock, { strictValidation: strict }),\n ),\n )\n if (strict && rows !== undefined && rows !== dataRows.length) {\n throw new XISFValidationError(`Table '${id || '<unnamed>'}' row count mismatch`)\n }\n if (strict && columns !== undefined) {\n for (const row of dataRows) {\n if (row.cells.length !== columns) {\n throw new XISFValidationError(`Table '${id || '<unnamed>'}' column count mismatch`)\n }\n }\n }\n if (strict && fields.length > 0) {\n for (const row of dataRows) {\n if (row.cells.length !== fields.length) {\n throw new XISFValidationError(`Table '${id || '<unnamed>'}' field/cell count mismatch`)\n }\n }\n }\n\n return {\n id,\n caption,\n rows,\n columns,\n comment,\n structure: fields,\n dataRows,\n }\n}\n","import type {\n XISFColorFilterArray,\n XISFDisplayFunction,\n XISFFITSKeyword,\n XISFImage,\n XISFRGBWorkingSpace,\n XISFResolution,\n} from './xisf-types'\nimport { XISFValidationError } from './xisf-errors'\nimport { getChildrenByName, getNodeName } from './xisf-xml'\nimport { parseDataBlockAttributes, parsePropertyElement, type ReadDataBlock } from './xisf-property'\nimport { parseTableElement } from './xisf-table'\n\nconst SAMPLE_FORMATS = new Set([\n 'UInt8',\n 'UInt16',\n 'UInt32',\n 'UInt64',\n 'Float32',\n 'Float64',\n 'Complex32',\n 'Complex64',\n])\nconst COLOR_SPACES = new Set(['Gray', 'RGB', 'CIELab'])\nconst PIXEL_STORAGES = new Set(['Planar', 'Normal'])\nconst ORIENTATIONS = new Set(['0', 'flip', '90', '90;flip', '-90', '-90;flip', '180', '180;flip'])\nconst CFA_PATTERN = /^[0RGBWCMY]+$/\n\nfunction parseNumberList(value: string): number[] {\n return value.split(':').map((part) => Number(part.trim()))\n}\n\nfunction parseGeometry(value: string): { dimensions: number[]; channels: number } {\n const values = parseNumberList(value)\n if (values.length < 2) {\n throw new XISFValidationError(`Invalid geometry: ${value}`)\n }\n if (values.some((n) => !Number.isFinite(n) || !Number.isInteger(n) || n <= 0)) {\n throw new XISFValidationError(`Geometry values must be positive integers: ${value}`)\n }\n const channels = values[values.length - 1]!\n const dimensions = values.slice(0, -1)\n return { dimensions, channels }\n}\n\nfunction parseBounds(value?: string | null): [number, number] | undefined {\n if (!value) return undefined\n const [a, b] = parseNumberList(value)\n if (a === undefined || b === undefined) return undefined\n return [a, b]\n}\n\nfunction parseRGBWorkingSpace(element: Element): XISFRGBWorkingSpace {\n const gamma = element.getAttribute('gamma') ?? 'sRGB'\n const x = parseNumberList(element.getAttribute('x') ?? '0:0:0') as [number, number, number]\n const y = parseNumberList(element.getAttribute('y') ?? '0:0:0') as [number, number, number]\n const Y = parseNumberList(element.getAttribute('Y') ?? '0:0:0') as [number, number, number]\n return {\n gamma,\n x,\n y,\n Y,\n name: element.getAttribute('name') ?? undefined,\n }\n}\n\nfunction parseDisplayFunction(element: Element): XISFDisplayFunction {\n return {\n m: parseNumberList(element.getAttribute('m') ?? '0.5:0.5:0.5:0.5') as [\n number,\n number,\n number,\n number,\n ],\n s: parseNumberList(element.getAttribute('s') ?? '0:0:0:0') as [number, number, number, number],\n h: parseNumberList(element.getAttribute('h') ?? '1:1:1:1') as [number, number, number, number],\n l: parseNumberList(element.getAttribute('l') ?? '0:0:0:0') as [number, number, number, number],\n r: parseNumberList(element.getAttribute('r') ?? '1:1:1:1') as [number, number, number, number],\n name: element.getAttribute('name') ?? undefined,\n }\n}\n\nfunction parseColorFilterArray(element: Element, strictValidation: boolean): XISFColorFilterArray {\n const width = Number(element.getAttribute('width') ?? '0')\n const height = Number(element.getAttribute('height') ?? '0')\n const pattern = element.getAttribute('pattern') ?? ''\n if (\n strictValidation &&\n (width <= 0 || height <= 0 || !Number.isInteger(width) || !Number.isInteger(height))\n ) {\n throw new XISFValidationError('ColorFilterArray width/height must be positive integers')\n }\n if (strictValidation && !CFA_PATTERN.test(pattern)) {\n throw new XISFValidationError('ColorFilterArray pattern contains invalid symbols')\n }\n if (strictValidation && pattern.length !== width * height) {\n throw new XISFValidationError('ColorFilterArray pattern length must equal width*height')\n }\n return {\n pattern,\n width,\n height,\n name: element.getAttribute('name') ?? undefined,\n }\n}\n\nfunction parseResolution(element: Element, strictValidation: boolean): XISFResolution {\n const unit = element.getAttribute('unit')\n const horizontal = Number(element.getAttribute('horizontal') ?? '72')\n const vertical = Number(element.getAttribute('vertical') ?? '72')\n if (\n strictValidation &&\n (!Number.isFinite(horizontal) || !Number.isFinite(vertical) || horizontal <= 0 || vertical <= 0)\n ) {\n throw new XISFValidationError('Resolution horizontal/vertical must be positive numbers')\n }\n return {\n horizontal,\n vertical,\n unit: unit === 'cm' ? 'cm' : 'inch',\n }\n}\n\nfunction parseFITSKeyword(element: Element): XISFFITSKeyword {\n return {\n name: element.getAttribute('name') ?? '',\n value: element.getAttribute('value') ?? '',\n comment: element.getAttribute('comment') ?? '',\n }\n}\n\nexport async function parseImageElement(\n element: Element,\n resolveReference: (ref: string) => Element | null,\n readDataBlock: ReadDataBlock,\n decodeImageData: boolean,\n strictValidation: boolean = true,\n isThumbnail: boolean = false,\n): Promise<XISFImage> {\n const geometryRaw = element.getAttribute('geometry')\n if (!geometryRaw) {\n throw new XISFValidationError('Image element is missing geometry')\n }\n const sampleFormat = element.getAttribute('sampleFormat')\n if (!sampleFormat) {\n throw new XISFValidationError('Image element is missing sampleFormat')\n }\n if (!SAMPLE_FORMATS.has(sampleFormat)) {\n throw new XISFValidationError(`Unsupported image sampleFormat: ${sampleFormat}`)\n }\n\n const { dimensions, channels } = parseGeometry(geometryRaw)\n const dataBlock = parseDataBlockAttributes(element)\n if (!dataBlock) {\n throw new XISFValidationError('Image element is missing location/data block')\n }\n if (strictValidation && dataBlock.location.type === 'inline') {\n throw new XISFValidationError('Image element cannot use inline location')\n }\n const pixelStorage = element.getAttribute('pixelStorage') || 'Planar'\n if (!PIXEL_STORAGES.has(pixelStorage)) {\n throw new XISFValidationError(`Unsupported pixelStorage: ${pixelStorage}`)\n }\n const colorSpace = element.getAttribute('colorSpace') || 'Gray'\n if (!COLOR_SPACES.has(colorSpace)) {\n throw new XISFValidationError(`Unsupported colorSpace: ${colorSpace}`)\n }\n if (\n strictValidation &&\n (sampleFormat === 'Float32' || sampleFormat === 'Float64') &&\n !element.getAttribute('bounds')\n ) {\n throw new XISFValidationError('bounds is required for Float32/Float64 images')\n }\n const orientation = element.getAttribute('orientation') ?? undefined\n if (orientation && !ORIENTATIONS.has(orientation)) {\n throw new XISFValidationError(`Unsupported orientation: ${orientation}`)\n }\n const offsetRaw = element.getAttribute('offset')\n const offset = offsetRaw ? Number(offsetRaw) : undefined\n if (offset !== undefined && (!Number.isFinite(offset) || offset < 0)) {\n throw new XISFValidationError('offset must be a non-negative number')\n }\n const bounds = parseBounds(element.getAttribute('bounds'))\n if (\n bounds &&\n (!Number.isFinite(bounds[0]) || !Number.isFinite(bounds[1]) || bounds[0] >= bounds[1])\n ) {\n throw new XISFValidationError('bounds must contain two finite numbers with lower < upper')\n }\n if (isThumbnail && element.getAttribute('bounds')) {\n throw new XISFValidationError('Thumbnail must not define bounds')\n }\n if (isThumbnail && !['UInt8', 'UInt16'].includes(sampleFormat)) {\n throw new XISFValidationError('Thumbnail sampleFormat must be UInt8 or UInt16')\n }\n if (isThumbnail && !['Gray', 'RGB'].includes(colorSpace)) {\n throw new XISFValidationError('Thumbnail colorSpace must be Gray or RGB')\n }\n if (isThumbnail && dimensions.length !== 2) {\n throw new XISFValidationError('Thumbnail must be two-dimensional')\n }\n\n const image: XISFImage = {\n id: element.getAttribute('id') ?? undefined,\n uuid: element.getAttribute('uuid') ?? undefined,\n geometry: dimensions,\n channelCount: channels,\n sampleFormat: sampleFormat as XISFImage['sampleFormat'],\n bounds,\n imageType: element.getAttribute('imageType') ?? undefined,\n pixelStorage: pixelStorage as XISFImage['pixelStorage'],\n colorSpace: colorSpace as XISFImage['colorSpace'],\n offset,\n orientation,\n dataBlock,\n properties: [],\n tables: [],\n fitsKeywords: [],\n }\n\n if (decodeImageData) {\n image.data = await readDataBlock(element, dataBlock)\n }\n\n const children = getChildrenByName(element, 'Reference')\n const inlinedChildren = (element: Element): Element[] => {\n const all = [] as Element[]\n const local = element.childNodes\n for (let i = 0; i < local.length; i++) {\n const n = local.item(i)\n if (n && n.nodeType === 1) all.push(n as Element)\n }\n return all\n }\n\n const materialized: Element[] = []\n for (const child of inlinedChildren(element)) {\n if (getNodeName(child) === 'Reference') {\n const ref = child.getAttribute('ref')\n if (ref) {\n const target = resolveReference(ref)\n if (target) {\n if (strictValidation && getNodeName(target) === 'Reference') {\n throw new XISFValidationError(`Chained references are not allowed (${ref})`)\n }\n materialized.push(target)\n }\n }\n continue\n }\n materialized.push(child)\n }\n for (const refElement of children) {\n const ref = refElement.getAttribute('ref')\n if (!ref) continue\n const target = resolveReference(ref)\n if (strictValidation && target && getNodeName(target) === 'Reference') {\n throw new XISFValidationError(`Chained references are not allowed (${ref})`)\n }\n if (target && !materialized.includes(target)) {\n materialized.push(target)\n }\n }\n\n for (const child of materialized) {\n const name = getNodeName(child)\n switch (name) {\n case 'Property':\n image.properties.push(\n await parsePropertyElement(child, readDataBlock, { strictValidation }),\n )\n break\n case 'Table':\n image.tables.push(\n await parseTableElement(child, resolveReference, readDataBlock, { strictValidation }),\n )\n break\n case 'FITSKeyword':\n image.fitsKeywords.push(parseFITSKeyword(child))\n break\n case 'ICCProfile': {\n if (strictValidation && child.hasAttribute('byteOrder')) {\n throw new XISFValidationError('ICCProfile must not define byteOrder')\n }\n const block = parseDataBlockAttributes(child)\n if (block) {\n image.iccProfile = await readDataBlock(child, block)\n }\n break\n }\n case 'RGBWorkingSpace':\n image.rgbWorkingSpace = parseRGBWorkingSpace(child)\n break\n case 'DisplayFunction':\n image.displayFunction = parseDisplayFunction(child)\n break\n case 'ColorFilterArray':\n if (isThumbnail) {\n throw new XISFValidationError('Thumbnail must not contain ColorFilterArray')\n }\n image.colorFilterArray = parseColorFilterArray(child, strictValidation)\n break\n case 'Resolution':\n image.resolution = parseResolution(child, strictValidation)\n break\n case 'Thumbnail':\n if (isThumbnail) {\n throw new XISFValidationError('Nested Thumbnail elements are not allowed')\n }\n image.thumbnail = await parseImageElement(\n child,\n resolveReference,\n readDataBlock,\n decodeImageData,\n strictValidation,\n true,\n )\n break\n default:\n break\n }\n }\n\n return image\n}\n","import { unzlibSync, zlibSync } from 'fflate'\nimport { compressBlock, compressBound, decompressBlock } from 'lz4js'\nimport { decompress as zstdDecompress } from 'fzstd'\nimport type { XISFCodecProvider, XISFCompressionSpec } from './xisf-types'\nimport { XISFCompressionError } from './xisf-errors'\n\nconst SHUFFLE_SUFFIX = '+sh'\nconst ZLIB_LEVELS = new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9] as const)\n\nconst LZ4_CODEC_NAMES = new Set(['lz4', 'lz4hc'])\nconst ZSTD_CODEC_NAMES = new Set(['zstd'])\n\nfunction encodeUncompressedLz4Block(input: Uint8Array): Uint8Array {\n const literalLength = input.byteLength\n const extraLengthBytes = literalLength >= 15 ? Math.floor((literalLength - 15) / 255) + 1 : 0\n const out = new Uint8Array(1 + extraLengthBytes + literalLength)\n out[0] = Math.min(15, literalLength) << 4\n let offset = 1\n if (literalLength >= 15) {\n let remaining = literalLength - 15\n while (remaining >= 255) {\n out[offset++] = 255\n remaining -= 255\n }\n out[offset++] = remaining\n }\n out.set(input, offset)\n return out\n}\n\nfunction compressLz4(input: Uint8Array): Uint8Array {\n const out = new Uint8Array(compressBound(input.byteLength))\n const hashTable = new Uint32Array(1 << 16)\n const encodedSize = compressBlock(input, out, 0, input.byteLength, hashTable)\n if (encodedSize > 0) {\n return out.slice(0, encodedSize)\n }\n return encodeUncompressedLz4Block(input)\n}\n\nfunction decompressLz4(input: Uint8Array, uncompressedSize?: number): Uint8Array {\n if (!uncompressedSize || uncompressedSize <= 0) {\n throw new XISFCompressionError('LZ4 codecs require uncompressedSize in XISF compression spec')\n }\n const out = new Uint8Array(uncompressedSize)\n const written = decompressBlock(input, out, 0, input.byteLength, 0)\n const actualSize = typeof written === 'number' ? written : out.byteLength\n if (actualSize !== out.byteLength) {\n throw new XISFCompressionError(\n `Decoded LZ4 block length mismatch: expected ${out.byteLength}, got ${actualSize}`,\n )\n }\n return out\n}\n\nexport const DefaultXISFCodecProvider: XISFCodecProvider = {\n supports(codec: string): boolean {\n const canonical = codec.toLowerCase()\n const baseCodec = canonical.endsWith(SHUFFLE_SUFFIX)\n ? canonical.slice(0, -SHUFFLE_SUFFIX.length)\n : canonical\n return baseCodec === 'zlib' || LZ4_CODEC_NAMES.has(baseCodec) || ZSTD_CODEC_NAMES.has(baseCodec)\n },\n compress(codec: string, input: Uint8Array, level?: number): Uint8Array {\n const canonical = codec.toLowerCase()\n if (!this.supports(canonical)) {\n throw new XISFCompressionError(`Unsupported codec in default provider: ${codec}`)\n }\n if (LZ4_CODEC_NAMES.has(canonical)) {\n return compressLz4(input)\n }\n if (ZSTD_CODEC_NAMES.has(canonical)) {\n throw new XISFCompressionError(\n 'Default provider supports zstd decompression only; provide a custom codecProvider for zstd encoding',\n )\n }\n const normalizedLevel =\n level !== undefined && ZLIB_LEVELS.has(level as never)\n ? (level as 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)\n : undefined\n return zlibSync(input, { level: normalizedLevel })\n },\n decompress(codec: string, input: Uint8Array, uncompressedSize?: number): Uint8Array {\n const canonical = codec.toLowerCase()\n if (!this.supports(canonical)) {\n throw new XISFCompressionError(`Unsupported codec in default provider: ${codec}`)\n }\n if (LZ4_CODEC_NAMES.has(canonical)) {\n return decompressLz4(input, uncompressedSize)\n }\n if (ZSTD_CODEC_NAMES.has(canonical)) {\n const outputBuffer =\n uncompressedSize && uncompressedSize > 0 ? new Uint8Array(uncompressedSize) : undefined\n const out = outputBuffer ? zstdDecompress(input, outputBuffer) : zstdDecompress(input)\n if (outputBuffer && out.byteLength !== outputBuffer.byteLength) {\n throw new XISFCompressionError(\n `Decoded zstd block length mismatch: expected ${outputBuffer.byteLength}, got ${out.byteLength}`,\n )\n }\n return out\n }\n return unzlibSync(input)\n },\n}\n\nexport function shuffleBytes(input: Uint8Array, itemSize: number): Uint8Array {\n if (itemSize <= 1 || input.byteLength === 0) return input.slice()\n const itemCount = Math.floor(input.byteLength / itemSize)\n const trailing = input.byteLength % itemSize\n const out = new Uint8Array(input.byteLength)\n let dst = 0\n for (let b = 0; b < itemSize; b++) {\n for (let i = 0; i < itemCount; i++) {\n out[dst++] = input[i * itemSize + b]!\n }\n }\n if (trailing > 0) {\n out.set(input.slice(itemCount * itemSize), dst)\n }\n return out\n}\n\nexport function unshuffleBytes(input: Uint8Array, itemSize: number): Uint8Array {\n if (itemSize <= 1 || input.byteLength === 0) return input.slice()\n const itemCount = Math.floor(input.byteLength / itemSize)\n const trailing = input.byteLength % itemSize\n const out = new Uint8Array(input.byteLength)\n let src = 0\n for (let b = 0; b < itemSize; b++) {\n for (let i = 0; i < itemCount; i++) {\n out[i * itemSize + b] = input[src++]!\n }\n }\n if (trailing > 0) {\n out.set(input.slice(src), itemCount * itemSize)\n }\n return out\n}\n\nfunction splitBySubblocks(\n data: Uint8Array,\n subblocks: Array<{ compressedSize: number; uncompressedSize: number }>,\n): Uint8Array[] {\n const blocks: Uint8Array[] = []\n let offset = 0\n for (const part of subblocks) {\n const end = offset + part.compressedSize\n if (end > data.byteLength) {\n throw new XISFCompressionError('Compressed subblocks exceed block length')\n }\n blocks.push(data.slice(offset, end))\n offset = end\n }\n if (offset !== data.byteLength) {\n throw new XISFCompressionError('Compressed subblocks length mismatch')\n }\n return blocks\n}\n\nexport function decodeCompressedBlock(\n data: Uint8Array,\n spec: XISFCompressionSpec,\n provider: XISFCodecProvider,\n): Uint8Array {\n const codec = spec.codec.toLowerCase()\n const usesShuffle = codec.endsWith(SHUFFLE_SUFFIX)\n const baseCodec = usesShuffle ? codec.slice(0, -SHUFFLE_SUFFIX.length) : codec\n\n const decodeSingle = (input: Uint8Array): Uint8Array => {\n const out = provider.decompress(baseCodec, input, spec.uncompressedSize)\n if (!usesShuffle) return out\n if (!spec.itemSize || spec.itemSize <= 0) {\n throw new XISFCompressionError(`Shuffle codec ${codec} requires itemSize`)\n }\n return unshuffleBytes(out, spec.itemSize)\n }\n\n if (!spec.subblocks || spec.subblocks.length === 0) {\n return decodeSingle(data)\n }\n\n const chunks = splitBySubblocks(data, spec.subblocks)\n const out = new Uint8Array(spec.uncompressedSize)\n let cursor = 0\n for (let i = 0; i < chunks.length; i++) {\n const decoded = decodeSingle(chunks[i]!)\n const expected = spec.subblocks[i]!.uncompressedSize\n if (decoded.byteLength !== expected) {\n throw new XISFCompressionError('Decoded subblock size mismatch')\n }\n out.set(decoded, cursor)\n cursor += decoded.byteLength\n }\n if (cursor !== spec.uncompressedSize) {\n throw new XISFCompressionError('Decoded uncompressed size mismatch')\n }\n return out\n}\n\nexport function encodeCompressedBlock(\n data: Uint8Array,\n codec: XISFCompressionSpec['codec'],\n provider: XISFCodecProvider,\n level?: number,\n itemSize?: number,\n): { data: Uint8Array; spec: XISFCompressionSpec } {\n const normalized = codec.toLowerCase() as XISFCompressionSpec['codec']\n const usesShuffle = normalized.endsWith(SHUFFLE_SUFFIX)\n const baseCodec = (\n usesShuffle ? normalized.slice(0, -SHUFFLE_SUFFIX.length) : normalized\n ) as XISFCompressionSpec['codec']\n\n const toCompress = usesShuffle ? shuffleBytes(data, itemSize ?? 1) : data\n const compressed = provider.compress(baseCodec, toCompress, level)\n return {\n data: compressed,\n spec: {\n codec: normalized,\n uncompressedSize: data.byteLength,\n itemSize: usesShuffle ? (itemSize ?? 1) : undefined,\n },\n }\n}\n","function dynamicImport(specifier: string): Promise<unknown> {\n return import(/* @vite-ignore */ specifier)\n}\n\nfunction hasProcessObject(): boolean {\n return typeof process !== 'undefined' && typeof process === 'object'\n}\n\nexport function isReactNativeRuntime(): boolean {\n return typeof navigator !== 'undefined' && navigator.product === 'ReactNative'\n}\n\nexport function isNodeRuntime(): boolean {\n if (!hasProcessObject() || isReactNativeRuntime()) {\n return false\n }\n const versions = (process as { versions?: { node?: string } }).versions\n return typeof versions?.node === 'string' && versions.node.length > 0\n}\n\nexport function runtimeLabel(): 'node' | 'react-native' | 'browser' | 'unknown' {\n if (isNodeRuntime()) return 'node'\n if (isReactNativeRuntime()) return 'react-native'\n if (typeof window !== 'undefined') return 'browser'\n return 'unknown'\n}\n\nexport async function importNodeModule<T>(\n moduleName: string,\n context: string,\n hint?: string,\n): Promise<T> {\n if (!isNodeRuntime()) {\n const suffix = hint ? ` ${hint}` : ''\n throw new Error(\n `${context} requires Node.js runtime. Current runtime: ${runtimeLabel()}.${suffix}`,\n )\n }\n\n const specifier = moduleName.startsWith('node:') ? moduleName : `node:${moduleName}`\n try {\n return (await dynamicImport(specifier)) as T\n } catch (error) {\n throw new Error(`${context} failed to load ${specifier}: ${(error as Error).message}`)\n }\n}\n","import type { XISFResourceResolver } from './xisf-types'\nimport { XISFResourceError } from './xisf-errors'\nimport { importNodeModule, isNodeRuntime, runtimeLabel } from '../core/runtime'\n\nfunction toUint8Array(buffer: ArrayBuffer): Uint8Array {\n return new Uint8Array(buffer)\n}\n\nasync function resolveWithNodeFS(path: string): Promise<Uint8Array> {\n try {\n const fsMod = await importNodeModule<{\n readFile(path: string): Promise<Uint8Array>\n }>(\n 'fs/promises',\n 'XISF path(...) resource resolution',\n 'Provide a custom resourceResolver.resolvePath in browser/React Native.',\n )\n const data = await fsMod.readFile(path)\n return new Uint8Array(data)\n } catch (error) {\n throw new XISFResourceError(`Failed to read path \"${path}\": ${(error as Error).message}`)\n }\n}\n\nexport const DefaultXISFResourceResolver: XISFResourceResolver = {\n async resolveURL(url: string): Promise<Uint8Array> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new XISFResourceError(\n `Failed to fetch ${url}: ${response.status} ${response.statusText}`,\n )\n }\n return toUint8Array(await response.arrayBuffer())\n },\n\n async resolvePath(path: string): Promise<Uint8Array> {\n if (!isNodeRuntime()) {\n throw new XISFResourceError(\n `Path-based distributed XISF access requires Node.js or a custom resourceResolver.resolvePath (runtime=${runtimeLabel()}): ${path}`,\n )\n }\n return resolveWithNodeFS(path)\n },\n}\n","import { XISFParseError, XISFValidationError } from './xisf-errors'\n\nconst XISB_SIGNATURE = 'XISB0100'\n\nexport interface XISBIndexElement {\n uniqueId: bigint\n blockPosition: bigint\n blockLength: bigint\n uncompressedBlockLength: bigint\n}\n\nexport interface XISBIndex {\n elements: XISBIndexElement[]\n byId: Map<bigint, XISBIndexElement>\n}\n\nfunction readAscii(bytes: Uint8Array): string {\n return new TextDecoder('ascii').decode(bytes)\n}\n\nfunction toNumber(value: bigint, name: string): number {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new XISFValidationError(`${name} exceeds Number.MAX_SAFE_INTEGER`)\n }\n return Number(value)\n}\n\nexport function parseXISBIndex(buffer: ArrayBuffer): XISBIndex {\n const bytes = new Uint8Array(buffer)\n if (bytes.byteLength < 16) {\n throw new XISFParseError('Invalid XISB file: too short')\n }\n const signature = readAscii(bytes.slice(0, 8))\n if (signature !== XISB_SIGNATURE) {\n throw new XISFParseError(`Invalid XISB signature: ${signature}`)\n }\n\n const view = new DataView(buffer)\n const elements: XISBIndexElement[] = []\n\n let nodeOffset = 16\n const visited = new Set<number>()\n while (nodeOffset !== 0) {\n if (visited.has(nodeOffset)) {\n throw new XISFParseError('Invalid XISB index: cyclic block index list')\n }\n visited.add(nodeOffset)\n\n if (nodeOffset + 16 > bytes.byteLength) {\n throw new XISFParseError('Invalid XISB index node offset')\n }\n\n const length = view.getUint32(nodeOffset, true)\n const nextNode = view.getBigUint64(nodeOffset + 8, true)\n\n let elementOffset = nodeOffset + 16\n for (let i = 0; i < length; i++) {\n if (elementOffset + 40 > bytes.byteLength) {\n throw new XISFParseError('Invalid XISB index element offset')\n }\n const uniqueId = view.getBigUint64(elementOffset, true)\n const blockPosition = view.getBigUint64(elementOffset + 8, true)\n const blockLength = view.getBigUint64(elementOffset + 16, true)\n const uncompressedBlockLength = view.getBigUint64(elementOffset + 24, true)\n elements.push({ uniqueId, blockPosition, blockLength, uncompressedBlockLength })\n elementOffset += 40\n }\n\n nodeOffset = toNumber(nextNode, 'nextNode')\n }\n\n const byId = new Map<bigint, XISBIndexElement>()\n for (const item of elements) {\n byId.set(item.uniqueId, item)\n }\n\n return { elements, byId }\n}\n\nexport function sliceXISBBlock(buffer: ArrayBuffer, element: XISBIndexElement): Uint8Array {\n if (element.blockPosition === BigInt(0) || element.blockLength === BigInt(0)) {\n throw new XISFValidationError('Cannot read free XISB index element')\n }\n const start = toNumber(element.blockPosition, 'blockPosition')\n const length = toNumber(element.blockLength, 'blockLength')\n const bytes = new Uint8Array(buffer)\n if (start + length > bytes.byteLength) {\n throw new XISFParseError('XISB block out of bounds')\n }\n return bytes.slice(start, start + length)\n}\n\nexport function buildXISBFile(blocks: Uint8Array[]): { bytes: Uint8Array; ids: bigint[] } {\n const ids = blocks.map((_, i) => BigInt(i + 1))\n const headerSize = 16\n const nodeHeaderSize = 16\n const elementSize = 40\n const indexSize = nodeHeaderSize + blocks.length * elementSize\n let cursor = headerSize + indexSize\n\n const elements: XISBIndexElement[] = blocks.map((block, i) => {\n const blockPosition = BigInt(cursor)\n cursor += block.byteLength\n return {\n uniqueId: ids[i]!,\n blockPosition,\n blockLength: BigInt(block.byteLength),\n uncompressedBlockLength: BigInt(0),\n }\n })\n\n const total = cursor\n const out = new Uint8Array(total)\n out.set(new TextEncoder().encode(XISB_SIGNATURE), 0)\n\n const view = new DataView(out.buffer)\n let offset = headerSize\n view.setUint32(offset, elements.length, true)\n view.setUint32(offset + 4, 0, true)\n view.setBigUint64(offset + 8, BigInt(0), true)\n offset += nodeHeaderSize\n\n for (const element of elements) {\n view.setBigUint64(offset, element.uniqueId, true)\n view.setBigUint64(offset + 8, element.blockPosition, true)\n view.setBigUint64(offset + 16, element.blockLength, true)\n view.setBigUint64(offset + 24, element.uncompressedBlockLength, true)\n view.setBigUint64(offset + 32, BigInt(0), true)\n offset += elementSize\n }\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!\n const position = Number(elements[i]!.blockPosition)\n out.set(block, position)\n }\n\n return { bytes: out, ids }\n}\n","import sha3Module from 'js-sha3'\nimport type { XISFChecksumSpec } from './xisf-types'\nimport { XISFChecksumError } from './xisf-errors'\nimport { importNodeModule } from '../core/runtime'\n\nconst sha3_256: (data: Uint8Array) => string = (\n sha3Module as unknown as { sha3_256: (data: Uint8Array) => string }\n).sha3_256\nconst sha3_512: (data: Uint8Array) => string = (\n sha3Module as unknown as { sha3_512: (data: Uint8Array) => string }\n).sha3_512\n\nfunction toHex(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let out = ''\n for (let i = 0; i < bytes.length; i++) {\n out += bytes[i]!.toString(16).padStart(2, '0')\n }\n return out\n}\n\nasync function digestSubtle(algorithm: string, data: Uint8Array): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const digestInput = new Uint8Array(data.byteLength)\n digestInput.set(data)\n const digest = await crypto.subtle.digest(algorithm, digestInput)\n return toHex(digest)\n }\n\n const mod = await importNodeModule<{\n createHash(name: string): { update(data: Uint8Array): unknown; digest(enc: 'hex'): string }\n }>(\n 'crypto',\n `XISF checksum ${algorithm} without WebCrypto`,\n 'Enable WebCrypto or run in Node.js for checksum verification.',\n )\n\n const h = mod.createHash(algorithm.toLowerCase().replace('-', ''))\n h.update(data)\n return h.digest('hex')\n}\n\nexport async function computeChecksum(\n data: Uint8Array,\n algorithm: XISFChecksumSpec['algorithm'],\n): Promise<string> {\n const normalized = algorithm.toLowerCase()\n switch (normalized) {\n case 'sha1':\n case 'sha-1':\n return digestSubtle('SHA-1', data)\n case 'sha256':\n case 'sha-256':\n return digestSubtle('SHA-256', data)\n case 'sha512':\n case 'sha-512':\n return digestSubtle('SHA-512', data)\n case 'sha3-256':\n return sha3_256(data)\n case 'sha3-512':\n return sha3_512(data)\n default:\n throw new XISFChecksumError(`Unsupported checksum algorithm: ${algorithm}`)\n }\n}\n\nexport async function verifyChecksum(data: Uint8Array, spec: XISFChecksumSpec): Promise<boolean> {\n const computed = await computeChecksum(data, spec.algorithm)\n return computed.toLowerCase() === spec.digest.toLowerCase()\n}\n","const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nconst BASE64_LOOKUP = new Int16Array(128).fill(-1)\n\nfor (let i = 0; i < BASE64_ALPHABET.length; i++) {\n BASE64_LOOKUP[BASE64_ALPHABET.charCodeAt(i)] = i\n}\n\nfunction bytesToBinaryString(bytes: Uint8Array): string {\n let out = ''\n const chunk = 0x8000\n for (let i = 0; i < bytes.length; i += chunk) {\n const part = bytes.subarray(i, Math.min(i + chunk, bytes.length))\n out += String.fromCharCode(...part)\n }\n return out\n}\n\nfunction binaryStringToBytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length)\n for (let i = 0; i < text.length; i++) {\n out[i] = text.charCodeAt(i) & 0xff\n }\n return out\n}\n\nfunction lookupBase64(code: number): number {\n if (code < 0 || code >= BASE64_LOOKUP.length) return -1\n return BASE64_LOOKUP[code] ?? -1\n}\n\nexport function normalizeBase64(input: string): string {\n let normalized = input.replace(/\\s+/gu, '').replace(/-/gu, '+').replace(/_/gu, '/')\n const remainder = normalized.length % 4\n if (remainder !== 0) {\n normalized = normalized.padEnd(normalized.length + (4 - remainder), '=')\n }\n return normalized\n}\n\nfunction encodeBase64Fallback(bytes: Uint8Array): string {\n let out = ''\n for (let i = 0; i < bytes.length; i += 3) {\n const a = bytes[i]!\n const b = i + 1 < bytes.length ? bytes[i + 1]! : 0\n const c = i + 2 < bytes.length ? bytes[i + 2]! : 0\n const triple = (a << 16) | (b << 8) | c\n out += BASE64_ALPHABET[(triple >> 18) & 0x3f]\n out += BASE64_ALPHABET[(triple >> 12) & 0x3f]\n out += i + 1 < bytes.length ? BASE64_ALPHABET[(triple >> 6) & 0x3f] : '='\n out += i + 2 < bytes.length ? BASE64_ALPHABET[triple & 0x3f] : '='\n }\n return out\n}\n\nfunction decodeBase64Fallback(input: string): Uint8Array {\n const normalized = normalizeBase64(input)\n if (normalized.length % 4 !== 0) {\n throw new Error('Invalid base64 payload length')\n }\n\n const padding = normalized.endsWith('==') ? 2 : normalized.endsWith('=') ? 1 : 0\n const out = new Uint8Array((normalized.length / 4) * 3 - padding)\n let oi = 0\n\n for (let i = 0; i < normalized.length; i += 4) {\n const c0 = normalized.charCodeAt(i)\n const c1 = normalized.charCodeAt(i + 1)\n const c2 = normalized.charCodeAt(i + 2)\n const c3 = normalized.charCodeAt(i + 3)\n\n const v0 = c0 < 128 ? lookupBase64(c0) : -1\n const v1 = c1 < 128 ? lookupBase64(c1) : -1\n const v2 = c2 === 61 ? -2 : c2 < 128 ? lookupBase64(c2) : -1\n const v3 = c3 === 61 ? -2 : c3 < 128 ? lookupBase64(c3) : -1\n\n if (v0 < 0 || v1 < 0 || v2 === -1 || v3 === -1) {\n throw new Error('Invalid base64 payload characters')\n }\n\n const sextet2 = v2 < 0 ? 0 : v2\n const sextet3 = v3 < 0 ? 0 : v3\n const triple = (v0 << 18) | (v1 << 12) | (sextet2 << 6) | sextet3\n\n out[oi++] = (triple >> 16) & 0xff\n if (v2 >= 0) out[oi++] = (triple >> 8) & 0xff\n if (v3 >= 0) out[oi++] = triple & 0xff\n }\n\n return out\n}\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n if (typeof btoa === 'function') {\n return btoa(bytesToBinaryString(bytes))\n }\n return encodeBase64Fallback(bytes)\n}\n\nexport function base64ToBytes(input: string): Uint8Array {\n const normalized = normalizeBase64(input)\n if (typeof atob === 'function') {\n return binaryStringToBytes(atob(normalized))\n }\n return decodeBase64Fallback(normalized)\n}\n","import type { XISFSignatureResult } from './xisf-types'\nimport {\n base64ToBytes,\n bytesToBase64,\n normalizeBase64 as normalizeBase64Payload,\n} from '../core/base64'\nimport { importNodeModule } from '../core/runtime'\n\nconst DSIG_NS = 'http://www.w3.org/2000/09/xmldsig#'\nconst C14N_10 = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'\nconst C14N_10_WITH_COMMENTS = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments'\nconst C14N_11 = 'http://www.w3.org/2006/12/xml-c14n11'\nconst C14N_11_WITH_COMMENTS = 'http://www.w3.org/2006/12/xml-c14n11#WithComments'\nconst EXC_C14N = 'http://www.w3.org/2001/10/xml-exc-c14n#'\nconst EXC_C14N_WITH_COMMENTS = 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments'\nconst ENVELOPED_SIGNATURE = 'http://www.w3.org/2000/09/xmldsig#enveloped-signature'\nconst BASE64_TRANSFORM = 'http://www.w3.org/2000/09/xmldsig#base64'\n\ninterface CanonicalizationMode {\n withComments: boolean\n exclusive: boolean\n}\n\ninterface SignatureMethodSpec {\n name: string\n kind: 'rsa-pkcs1' | 'rsa-pss' | 'ecdsa'\n hash: 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512'\n}\n\ntype TransformState = { kind: 'node'; node: Node } | { kind: 'bytes'; bytes: Uint8Array }\n\ntype LoadedPublicKey = { kind: 'node'; key: unknown } | { kind: 'webcrypto'; key: CryptoKey }\n\nfunction nodeLocalName(node: Node): string {\n const value = (node as Node & { localName?: string; nodeName: string }).localName\n if (value && value.length > 0) return value\n const raw = (node as Node & { nodeName: string }).nodeName\n const idx = raw.indexOf(':')\n return idx >= 0 ? raw.slice(idx + 1) : raw\n}\n\nfunction isElement(node: Node | null): node is Element {\n return !!node && node.nodeType === 1\n}\n\nfunction isComment(node: Node | null): node is Comment {\n return !!node && node.nodeType === 8\n}\n\nfunction isTextLike(node: Node | null): node is Text | CDATASection {\n return !!node && (node.nodeType === 3 || node.nodeType === 4)\n}\n\nfunction getChildrenByLocalName(parent: Element, localName: string, namespace?: string): Element[] {\n const out: Element[] = []\n for (let i = 0; i < parent.childNodes.length; i++) {\n const child = parent.childNodes.item(i)\n if (!isElement(child)) continue\n if (nodeLocalName(child) !== localName) continue\n if (namespace && (child.namespaceURI ?? '') !== namespace) continue\n out.push(child)\n }\n return out\n}\n\nfunction getFirstChildByLocalName(\n parent: Element,\n localName: string,\n namespace?: string,\n): Element | null {\n const children = getChildrenByLocalName(parent, localName, namespace)\n return children.length > 0 ? children[0]! : null\n}\n\nfunction getDirectSignatureElement(doc: Document): Element | null {\n const root = doc.documentElement\n if (!root) return null\n for (let i = 0; i < root.childNodes.length; i++) {\n const child = root.childNodes.item(i)\n if (!isElement(child)) continue\n if (nodeLocalName(child) === 'Signature' && (child.namespaceURI ?? '') === DSIG_NS) {\n return child\n }\n }\n return null\n}\n\nexport function hasDetachedSignature(doc: Document): boolean {\n return getDirectSignatureElement(doc) !== null\n}\n\nfunction normalizeBase64(input: string): string {\n return normalizeBase64Payload(input)\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n const base64 = bytesToBase64(bytes)\n return base64.replace(/\\+/gu, '-').replace(/\\//gu, '_').replace(/=+$/gu, '')\n}\n\nasync function decodeBase64(input: string): Promise<Uint8Array> {\n return base64ToBytes(normalizeBase64(input))\n}\n\nfunction encodeUtf8(text: string): Uint8Array {\n return new TextEncoder().encode(text)\n}\n\nfunction toArrayBuffer(data: Uint8Array): ArrayBuffer {\n if (\n data.byteOffset === 0 &&\n data.byteLength === data.buffer.byteLength &&\n data.buffer instanceof ArrayBuffer\n ) {\n return data.buffer\n }\n const copy = new Uint8Array(data.byteLength)\n copy.set(data)\n return copy.buffer\n}\n\nfunction escapeText(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\\r', '&#xD;')\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('\"', '&quot;')\n .replaceAll('\\t', '&#x9;')\n .replaceAll('\\n', '&#xA;')\n .replaceAll('\\r', '&#xD;')\n}\n\nfunction qName(element: Element): string {\n const prefix = element.prefix\n const local = nodeLocalName(element)\n return prefix ? `${prefix}:${local}` : local\n}\n\nfunction declaredNamespaces(element: Element): Map<string, string> {\n const out = new Map<string, string>()\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes.item(i)\n if (!attr) continue\n if (attr.name === 'xmlns') {\n out.set('', attr.value)\n } else if (attr.name.startsWith('xmlns:')) {\n out.set(attr.name.slice(6), attr.value)\n }\n }\n return out\n}\n\nfunction copyNamespaceScope(input: Map<string, string>): Map<string, string> {\n return new Map(input.entries())\n}\n\nfunction removeEnvelopedSignatures(root: Node): Node {\n const clone = root.cloneNode(true)\n const walk = (node: Node): void => {\n for (let i = node.childNodes.length - 1; i >= 0; i--) {\n const child = node.childNodes.item(i)\n if (!child) continue\n if (\n isElement(child) &&\n nodeLocalName(child) === 'Signature' &&\n (child.namespaceURI ?? '') === DSIG_NS\n ) {\n node.removeChild(child)\n continue\n }\n walk(child)\n }\n }\n walk(clone)\n return clone\n}\n\nfunction parseCanonicalizationMode(algorithm: string): CanonicalizationMode | null {\n switch (algorithm) {\n case C14N_10:\n case C14N_11:\n return { withComments: false, exclusive: false }\n case C14N_10_WITH_COMMENTS:\n case C14N_11_WITH_COMMENTS:\n return { withComments: true, exclusive: false }\n case EXC_C14N:\n return { withComments: false, exclusive: true }\n case EXC_C14N_WITH_COMMENTS:\n return { withComments: true, exclusive: true }\n default:\n return null\n }\n}\n\nfunction elementUsesPrefix(element: Element): string {\n return element.prefix ?? ''\n}\n\nfunction attributeUsesPrefix(attribute: Attr): string {\n const prefix = attribute.prefix\n if (!prefix || prefix === 'xmlns') return ''\n return prefix\n}\n\nfunction canonicalizeElement(\n element: Element,\n parentScope: Map<string, string>,\n mode: CanonicalizationMode,\n): string {\n const elementPrefix = elementUsesPrefix(element)\n const elementNamespace = element.namespaceURI ?? ''\n const declared = declaredNamespaces(element)\n const activeScope = copyNamespaceScope(parentScope)\n for (const [prefix, uri] of declared.entries()) {\n activeScope.set(prefix, uri)\n }\n\n const namespacesToEmit = new Map<string, string>()\n if (mode.exclusive) {\n const usedPrefixes = new Set<string>()\n usedPrefixes.add(elementPrefix)\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes.item(i)\n if (!attr) continue\n if (attr.name === 'xmlns' || attr.name.startsWith('xmlns:')) continue\n const attrPrefix = attributeUsesPrefix(attr)\n if (attrPrefix) usedPrefixes.add(attrPrefix)\n }\n for (const prefix of usedPrefixes) {\n const parentValue = parentScope.get(prefix) ?? ''\n const activeValue =\n prefix === elementPrefix ? elementNamespace : (activeScope.get(prefix) ?? '')\n if (activeValue !== parentValue) {\n namespacesToEmit.set(prefix, activeValue)\n }\n }\n } else {\n for (const [prefix, uri] of declared.entries()) {\n const parentValue = parentScope.get(prefix) ?? ''\n if (uri !== parentValue) {\n namespacesToEmit.set(prefix, uri)\n }\n }\n const defaultInScope = parentScope.get('') ?? ''\n if (elementPrefix === '' && elementNamespace !== defaultInScope) {\n namespacesToEmit.set('', elementNamespace)\n }\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes.item(i)\n if (!attr) continue\n if (attr.name === 'xmlns' || attr.name.startsWith('xmlns:')) continue\n const attrPrefix = attributeUsesPrefix(attr)\n if (!attrPrefix) continue\n const parentValue = parentScope.get(attrPrefix) ?? ''\n const activeValue = activeScope.get(attrPrefix) ?? ''\n if (activeValue !== parentValue) {\n namespacesToEmit.set(attrPrefix, activeValue)\n }\n }\n }\n\n const namespaceAttributes = [...namespacesToEmit.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([prefix, uri]) => {\n if (prefix === '') return ` xmlns=\"${escapeAttribute(uri)}\"`\n return ` xmlns:${prefix}=\"${escapeAttribute(uri)}\"`\n })\n\n const normalAttributes: Attr[] = []\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes.item(i)\n if (!attr) continue\n if (attr.name === 'xmlns' || attr.name.startsWith('xmlns:')) continue\n normalAttributes.push(attr)\n }\n normalAttributes.sort((a, b) => {\n const ans = a.namespaceURI ?? ''\n const bns = b.namespaceURI ?? ''\n if (ans === bns) {\n return nodeLocalName(a).localeCompare(nodeLocalName(b))\n }\n return ans.localeCompare(bns)\n })\n\n const attributesText = normalAttributes\n .map((attr) => ` ${attr.name}=\"${escapeAttribute(attr.value)}\"`)\n .join('')\n\n const opening = `<${qName(element)}${namespaceAttributes.join('')}${attributesText}>`\n let body = ''\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes.item(i)\n if (!child) continue\n body += canonicalizeNode(child, activeScope, mode)\n }\n const closing = `</${qName(element)}>`\n return `${opening}${body}${closing}`\n}\n\nfunction canonicalizeNode(\n node: Node,\n namespaceScope: Map<string, string>,\n mode: CanonicalizationMode,\n): string {\n if (node.nodeType === 9) {\n const doc = node as Document\n let out = ''\n for (let i = 0; i < doc.childNodes.length; i++) {\n const child = doc.childNodes.item(i)\n if (!child) continue\n out += canonicalizeNode(child, namespaceScope, mode)\n }\n return out\n }\n\n if (isElement(node)) {\n return canonicalizeElement(node, namespaceScope, mode)\n }\n\n if (isTextLike(node)) {\n return escapeText(node.data)\n }\n\n if (isComment(node)) {\n if (!mode.withComments) return ''\n return `<!--${node.data}-->`\n }\n\n if (node.nodeType === 7) {\n const pi = node as ProcessingInstruction\n return `<?${pi.target}${pi.data ? ` ${pi.data}` : ''}?>`\n }\n\n return ''\n}\n\nfunction canonicalize(node: Node, algorithm: string): string {\n const mode = parseCanonicalizationMode(algorithm)\n if (!mode) {\n throw new Error(`Unsupported canonicalization algorithm: ${algorithm}`)\n }\n return canonicalizeNode(node, new Map(), mode)\n}\n\nfunction getTransformAlgorithms(reference: Element): string[] {\n const transforms = getFirstChildByLocalName(reference, 'Transforms', DSIG_NS)\n if (!transforms) return []\n const out: string[] = []\n for (const transform of getChildrenByLocalName(transforms, 'Transform', DSIG_NS)) {\n const algorithm = transform.getAttribute('Algorithm')\n if (algorithm) out.push(algorithm)\n }\n return out\n}\n\nfunction findElementById(doc: Document, id: string): Element | null {\n const stack: Node[] = [doc.documentElement]\n while (stack.length > 0) {\n const current = stack.pop()\n if (!current || !isElement(current)) continue\n const candidate =\n current.getAttribute('Id') ??\n current.getAttribute('ID') ??\n current.getAttribute('id') ??\n current.getAttribute('xml:id') ??\n current.getAttribute('uid')\n if (candidate === id) return current\n for (let i = current.childNodes.length - 1; i >= 0; i--) {\n const child = current.childNodes.item(i)\n if (child) stack.push(child)\n }\n }\n return null\n}\n\nfunction resolveReferenceTarget(doc: Document, uri: string | null): TransformState {\n if (!uri || uri === '') {\n return { kind: 'node', node: doc.documentElement }\n }\n if (!uri.startsWith('#')) {\n throw new Error(`Unsupported detached reference URI: ${uri}`)\n }\n const id = decodeURIComponent(uri.slice(1))\n const target = findElementById(doc, id)\n if (!target) {\n throw new Error(`Unable to resolve signature reference URI: ${uri}`)\n }\n return { kind: 'node', node: target }\n}\n\nfunction readNodeText(node: Node): string {\n return (node.textContent ?? '').trim()\n}\n\nfunction digestAlgorithmUriToSubtle(name: string): string {\n switch (name) {\n case 'http://www.w3.org/2000/09/xmldsig#sha1':\n return 'SHA-1'\n case 'http://www.w3.org/2001/04/xmlenc#sha256':\n return 'SHA-256'\n case 'http://www.w3.org/2001/04/xmldsig-more#sha384':\n return 'SHA-384'\n case 'http://www.w3.org/2001/04/xmlenc#sha512':\n return 'SHA-512'\n default:\n throw new Error(`Unsupported digest algorithm: ${name}`)\n }\n}\n\nasync function computeDigest(algorithmUri: string, data: Uint8Array): Promise<Uint8Array> {\n const subtleAlgorithm = digestAlgorithmUriToSubtle(algorithmUri)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const digest = await crypto.subtle.digest(subtleAlgorithm, toArrayBuffer(data))\n return new Uint8Array(digest)\n }\n\n const cryptoModule = await importNodeModule<{\n createHash(name: string): { update(data: Uint8Array): unknown; digest(): Uint8Array }\n }>(\n 'crypto',\n `XISF signature digest ${subtleAlgorithm} without WebCrypto`,\n 'Enable WebCrypto or run in Node.js for detached-signature verification.',\n )\n const hashName = subtleAlgorithm.toLowerCase().replace('-', '')\n const hash = cryptoModule.createHash(hashName)\n hash.update(data)\n return new Uint8Array(hash.digest())\n}\n\nfunction signatureMethodSpec(uri: string): SignatureMethodSpec {\n switch (uri) {\n case 'http://www.w3.org/2000/09/xmldsig#rsa-sha1':\n return { name: uri, kind: 'rsa-pkcs1', hash: 'SHA-1' }\n case 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256':\n return { name: uri, kind: 'rsa-pkcs1', hash: 'SHA-256' }\n case 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha384':\n return { name: uri, kind: 'rsa-pkcs1', hash: 'SHA-384' }\n case 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512':\n return { name: uri, kind: 'rsa-pkcs1', hash: 'SHA-512' }\n case 'http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1':\n return { name: uri, kind: 'rsa-pss', hash: 'SHA-256' }\n case 'http://www.w3.org/2007/05/xmldsig-more#sha384-rsa-MGF1':\n return { name: uri, kind: 'rsa-pss', hash: 'SHA-384' }\n case 'http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1':\n return { name: uri, kind: 'rsa-pss', hash: 'SHA-512' }\n case 'http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256':\n return { name: uri, kind: 'ecdsa', hash: 'SHA-256' }\n case 'http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384':\n return { name: uri, kind: 'ecdsa', hash: 'SHA-384' }\n case 'http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512':\n return { name: uri, kind: 'ecdsa', hash: 'SHA-512' }\n default:\n throw new Error(`Unsupported signature method: ${uri}`)\n }\n}\n\nfunction trimBigEndianInteger(bytes: Uint8Array): Uint8Array {\n let first = 0\n while (first < bytes.length - 1 && bytes[first] === 0) first++\n return bytes.subarray(first)\n}\n\nasync function loadNodeCryptoKeyFromKeyInfo(keyInfo: Element): Promise<unknown> {\n const cryptoModule = await importNodeModule<{\n X509Certificate: new (buffer: Uint8Array) => { publicKey: unknown }\n createPublicKey(input: { key: JsonWebKey; format: 'jwk' }): unknown\n }>(\n 'crypto',\n 'XISF signature key loading from KeyInfo',\n 'Enable WebCrypto-compatible KeyInfo or run in Node.js for detached-signature verification.',\n )\n\n const x509 = getFirstChildByLocalName(keyInfo, 'X509Data', DSIG_NS)\n if (x509) {\n const certNode = getFirstChildByLocalName(x509, 'X509Certificate', DSIG_NS)\n if (certNode) {\n const certBytes = await decodeBase64(readNodeText(certNode))\n const cert = new cryptoModule.X509Certificate(certBytes)\n return cert.publicKey\n }\n }\n\n const keyValue = getFirstChildByLocalName(keyInfo, 'KeyValue', DSIG_NS)\n if (keyValue) {\n const rsa = getFirstChildByLocalName(keyValue, 'RSAKeyValue', DSIG_NS)\n if (rsa) {\n const modulusNode = getFirstChildByLocalName(rsa, 'Modulus', DSIG_NS)\n const exponentNode = getFirstChildByLocalName(rsa, 'Exponent', DSIG_NS)\n if (!modulusNode || !exponentNode) {\n throw new Error('Invalid RSAKeyValue: missing Modulus/Exponent')\n }\n const modulus = trimBigEndianInteger(await decodeBase64(readNodeText(modulusNode)))\n const exponent = trimBigEndianInteger(await decodeBase64(readNodeText(exponentNode)))\n const jwk: JsonWebKey = {\n kty: 'RSA',\n n: toBase64Url(modulus),\n e: toBase64Url(exponent),\n }\n return cryptoModule.createPublicKey({ key: jwk, format: 'jwk' })\n }\n }\n\n throw new Error('Unsupported KeyInfo content')\n}\n\nasync function loadWebCryptoKeyFromKeyInfo(\n keyInfo: Element,\n method: SignatureMethodSpec,\n): Promise<CryptoKey> {\n if (method.kind === 'ecdsa') {\n throw new Error('ECDSA KeyInfo import is not yet supported without SPKI')\n }\n\n const keyValue = getFirstChildByLocalName(keyInfo, 'KeyValue', DSIG_NS)\n if (!keyValue) {\n throw new Error('No RSA KeyValue in KeyInfo')\n }\n const rsa = getFirstChildByLocalName(keyValue, 'RSAKeyValue', DSIG_NS)\n if (!rsa) {\n throw new Error('Only RSAKeyValue is supported for WebCrypto verification')\n }\n const modulusNode = getFirstChildByLocalName(rsa, 'Modulus', DSIG_NS)\n const exponentNode = getFirstChildByLocalName(rsa, 'Exponent', DSIG_NS)\n if (!modulusNode || !exponentNode) {\n throw new Error('Invalid RSAKeyValue: missing Modulus/Exponent')\n }\n const modulus = trimBigEndianInteger(await decodeBase64(readNodeText(modulusNode)))\n const exponent = trimBigEndianInteger(await decodeBase64(readNodeText(exponentNode)))\n const jwk: JsonWebKey = {\n kty: 'RSA',\n n: toBase64Url(modulus),\n e: toBase64Url(exponent),\n ext: true,\n }\n const algorithm =\n method.kind === 'rsa-pss'\n ? { name: 'RSA-PSS', hash: method.hash }\n : { name: 'RSASSA-PKCS1-v1_5', hash: method.hash }\n return crypto.subtle.importKey('jwk', jwk, algorithm, false, ['verify'])\n}\n\nasync function loadPublicKey(\n signatureElement: Element,\n method: SignatureMethodSpec,\n): Promise<LoadedPublicKey> {\n const keyInfo = getFirstChildByLocalName(signatureElement, 'KeyInfo', DSIG_NS)\n if (!keyInfo) {\n throw new Error('Missing ds:KeyInfo in signature')\n }\n\n try {\n const key = await loadNodeCryptoKeyFromKeyInfo(keyInfo)\n return { kind: 'node', key }\n } catch (nodeError) {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n try {\n const key = await loadWebCryptoKeyFromKeyInfo(keyInfo, method)\n return { kind: 'webcrypto', key }\n } catch (webError) {\n throw new Error(\n `Unable to load signature public key (node=${(nodeError as Error).message}; web=${(webError as Error).message})`,\n )\n }\n }\n throw nodeError\n }\n}\n\nfunction hashNameForNode(hash: SignatureMethodSpec['hash']): string {\n return hash.toLowerCase().replace('-', '')\n}\n\nfunction hashByteLength(hash: SignatureMethodSpec['hash']): number {\n switch (hash) {\n case 'SHA-1':\n return 20\n case 'SHA-256':\n return 32\n case 'SHA-384':\n return 48\n case 'SHA-512':\n return 64\n }\n}\n\nasync function verifySignatureValue(\n signedInfoBytes: Uint8Array,\n signatureValueBytes: Uint8Array,\n method: SignatureMethodSpec,\n key: LoadedPublicKey,\n): Promise<boolean> {\n if (key.kind === 'node') {\n const cryptoModule = await importNodeModule<{\n createVerify(name: string): {\n update(data: Uint8Array): unknown\n end(): unknown\n verify(key: unknown, signature: Uint8Array): boolean\n verify(\n options: { key: unknown; padding: number; saltLength: number },\n signature: Uint8Array,\n ): boolean\n }\n constants: { RSA_PKCS1_PSS_PADDING: number }\n }>(\n 'crypto',\n `XISF detached signature verification (${method.name})`,\n 'Enable WebCrypto or run in Node.js for detached-signature verification.',\n )\n const verifier = cryptoModule.createVerify(hashNameForNode(method.hash))\n verifier.update(signedInfoBytes)\n verifier.end()\n if (method.kind === 'rsa-pss') {\n return verifier.verify(\n {\n key: key.key,\n padding: cryptoModule.constants.RSA_PKCS1_PSS_PADDING,\n saltLength: hashByteLength(method.hash),\n },\n signatureValueBytes,\n )\n }\n return verifier.verify(key.key, signatureValueBytes)\n }\n\n let algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams\n if (method.kind === 'rsa-pss') {\n algorithm = {\n name: 'RSA-PSS',\n saltLength: hashByteLength(method.hash),\n }\n } else if (method.kind === 'ecdsa') {\n algorithm = {\n name: 'ECDSA',\n hash: method.hash,\n }\n } else {\n algorithm = {\n name: 'RSASSA-PKCS1-v1_5',\n hash: method.hash,\n }\n }\n return crypto.subtle.verify(\n algorithm,\n key.key,\n toArrayBuffer(signatureValueBytes),\n toArrayBuffer(signedInfoBytes),\n )\n}\n\nasync function referenceToOctets(doc: Document, reference: Element): Promise<Uint8Array> {\n const uri = reference.getAttribute('URI')\n let state = resolveReferenceTarget(doc, uri)\n const transforms = getTransformAlgorithms(reference)\n\n for (const transform of transforms) {\n if (transform === ENVELOPED_SIGNATURE) {\n if (state.kind !== 'node') {\n throw new Error('Enveloped-signature transform requires XML node input')\n }\n state = { kind: 'node', node: removeEnvelopedSignatures(state.node) }\n continue\n }\n if (transform === BASE64_TRANSFORM) {\n const text =\n state.kind === 'node'\n ? readNodeText(state.node)\n : new TextDecoder('ascii').decode(state.bytes)\n state = { kind: 'bytes', bytes: await decodeBase64(text) }\n continue\n }\n if (parseCanonicalizationMode(transform)) {\n if (state.kind !== 'node') {\n throw new Error('Canonicalization transform requires XML node input')\n }\n state = { kind: 'bytes', bytes: encodeUtf8(canonicalize(state.node, transform)) }\n continue\n }\n throw new Error(`Unsupported signature transform: ${transform}`)\n }\n\n if (state.kind === 'bytes') return state.bytes\n return encodeUtf8(canonicalize(state.node, C14N_10))\n}\n\nasync function verifyReferences(doc: Document, signedInfo: Element): Promise<void> {\n const references = getChildrenByLocalName(signedInfo, 'Reference', DSIG_NS)\n if (references.length === 0) {\n throw new Error('SignedInfo has no Reference elements')\n }\n\n for (const reference of references) {\n const uri = reference.getAttribute('URI') ?? ''\n const digestMethod = getFirstChildByLocalName(reference, 'DigestMethod', DSIG_NS)\n const digestValue = getFirstChildByLocalName(reference, 'DigestValue', DSIG_NS)\n if (!digestMethod || !digestValue) {\n throw new Error(`Reference ${uri} missing DigestMethod or DigestValue`)\n }\n const digestAlgorithm = digestMethod.getAttribute('Algorithm')\n if (!digestAlgorithm) {\n throw new Error(`Reference ${uri} missing DigestMethod Algorithm`)\n }\n const expectedDigest = await decodeBase64(readNodeText(digestValue))\n const referencedData = await referenceToOctets(doc, reference)\n const computedDigest = await computeDigest(digestAlgorithm, referencedData)\n\n if (expectedDigest.length !== computedDigest.length) {\n throw new Error(`Reference digest length mismatch for URI ${uri}`)\n }\n for (let i = 0; i < expectedDigest.length; i++) {\n if (expectedDigest[i] !== computedDigest[i]) {\n throw new Error(`Reference digest mismatch for URI ${uri}`)\n }\n }\n }\n}\n\nfunction normalizeResultFailure(method: string | undefined, reason: string): XISFSignatureResult {\n return {\n present: true,\n verified: false,\n algorithm: method,\n reason,\n }\n}\n\nexport async function verifyDetachedSignature(doc: Document): Promise<XISFSignatureResult> {\n const signatureElement = getDirectSignatureElement(doc)\n if (!signatureElement) {\n return { present: false, verified: true }\n }\n\n const signedInfo = getFirstChildByLocalName(signatureElement, 'SignedInfo', DSIG_NS)\n if (!signedInfo) {\n return normalizeResultFailure(undefined, 'Signature is missing SignedInfo')\n }\n\n const canonicalizationMethod = getFirstChildByLocalName(\n signedInfo,\n 'CanonicalizationMethod',\n DSIG_NS,\n )\n if (!canonicalizationMethod) {\n return normalizeResultFailure(undefined, 'SignedInfo is missing CanonicalizationMethod')\n }\n const canonicalizationAlgorithm = canonicalizationMethod.getAttribute('Algorithm') ?? C14N_10\n if (!parseCanonicalizationMode(canonicalizationAlgorithm)) {\n return normalizeResultFailure(\n undefined,\n `Unsupported canonicalization algorithm: ${canonicalizationAlgorithm}`,\n )\n }\n\n const signatureMethodElement = getFirstChildByLocalName(signedInfo, 'SignatureMethod', DSIG_NS)\n if (!signatureMethodElement) {\n return normalizeResultFailure(undefined, 'SignedInfo is missing SignatureMethod')\n }\n const signatureMethodUri = signatureMethodElement.getAttribute('Algorithm') ?? undefined\n if (!signatureMethodUri) {\n return normalizeResultFailure(undefined, 'SignatureMethod is missing Algorithm')\n }\n\n const signatureValueElement = getFirstChildByLocalName(\n signatureElement,\n 'SignatureValue',\n DSIG_NS,\n )\n if (!signatureValueElement) {\n return normalizeResultFailure(signatureMethodUri, 'SignatureValue is missing')\n }\n\n let method: SignatureMethodSpec\n try {\n method = signatureMethodSpec(signatureMethodUri)\n } catch (error) {\n return normalizeResultFailure(signatureMethodUri, (error as Error).message)\n }\n\n try {\n await verifyReferences(doc, signedInfo)\n } catch (error) {\n return normalizeResultFailure(\n signatureMethodUri,\n `Digest verification failed: ${(error as Error).message}`,\n )\n }\n\n const signedInfoBytes = encodeUtf8(canonicalize(signedInfo, canonicalizationAlgorithm))\n const signatureValueBytes = await decodeBase64(readNodeText(signatureValueElement))\n\n let key: LoadedPublicKey\n try {\n key = await loadPublicKey(signatureElement, method)\n } catch (error) {\n return normalizeResultFailure(\n signatureMethodUri,\n `Key loading failed: ${(error as Error).message}`,\n )\n }\n\n let verified = false\n try {\n verified = await verifySignatureValue(signedInfoBytes, signatureValueBytes, method, key)\n } catch (error) {\n return normalizeResultFailure(\n signatureMethodUri,\n `Signature verification failed: ${(error as Error).message}`,\n )\n }\n\n if (!verified) {\n return normalizeResultFailure(signatureMethodUri, 'SignatureValue does not match SignedInfo')\n }\n\n return {\n present: true,\n verified: true,\n algorithm: method.name,\n }\n}\n\nexport const __signatureTesting = {\n canonicalize,\n constants: {\n DSIG_NS,\n C14N_10,\n ENVELOPED_SIGNATURE,\n BASE64_TRANSFORM,\n },\n}\n","import {\n parseMonolithicContainer,\n isMonolithicXISF,\n extractAttachmentBytes,\n} from './xisf-container'\nimport { parseXISFXML, getChildrenByName, getNodeName } from './xisf-xml'\nimport { parsePropertyElement, type ReadDataBlock } from './xisf-property'\nimport { parseImageElement } from './xisf-image'\nimport { parseTableElement } from './xisf-table'\nimport { DefaultXISFCodecProvider, decodeCompressedBlock } from './xisf-codec'\nimport { DefaultXISFResourceResolver } from './xisf-resolver'\nimport { parseXISFLocation, resolveHeaderRelativePath } from './xisf-location'\nimport { parseXISBIndex, sliceXISBBlock } from './xisb-index'\nimport { verifyChecksum } from './xisf-checksum'\nimport { hasDetachedSignature, verifyDetachedSignature } from './xisf-signature'\nimport { base64ToBytes } from '../core/base64'\nimport {\n XISFChecksumError,\n XISFParseError,\n XISFResourceError,\n XISFValidationError,\n XISFSignatureError,\n} from './xisf-errors'\nimport type {\n XISFDataBlock,\n XISFLocation,\n XISFReadOptions,\n XISFUnit,\n XISFWarning,\n XISFProperty,\n XISFTable,\n} from './xisf-types'\n\nfunction withDefaults(options?: XISFReadOptions): Required<XISFReadOptions> {\n return {\n strictValidation: options?.strictValidation ?? true,\n verifyChecksums: options?.verifyChecksums ?? true,\n verifySignatures: options?.verifySignatures ?? true,\n signaturePolicy: options?.signaturePolicy ?? 'require',\n decodeImageData: options?.decodeImageData ?? true,\n baseUrl: options?.baseUrl ?? '',\n headerDir: options?.headerDir ?? '',\n onWarning: options?.onWarning ?? (() => undefined),\n codecProvider: options?.codecProvider ?? DefaultXISFCodecProvider,\n resourceResolver: options?.resourceResolver ?? DefaultXISFResourceResolver,\n }\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength)\n copy.set(bytes)\n return copy.buffer\n}\n\nfunction decodeInlineData(encoding: 'base64' | 'hex', payload: string): Uint8Array {\n const normalized = payload.replace(/\\s+/g, '')\n if (encoding === 'base64') {\n return base64ToBytes(normalized)\n }\n\n const bytes = new Uint8Array(normalized.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number.parseInt(normalized.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n\nfunction decodeBase64Fallback(payload: string): Uint8Array {\n return base64ToBytes(payload)\n}\n\nfunction warn(options: Required<XISFReadOptions>, warning: XISFWarning): void {\n options.onWarning(warning)\n}\n\nfunction maybeThrow(options: Required<XISFReadOptions>, error: Error, code: string): void {\n if (options.strictValidation) throw error\n warn(options, { code, message: error.message })\n}\n\nasync function decodeInlineOrEmbedded(block: XISFDataBlock): Promise<Uint8Array> {\n if (block.location.type === 'inline') {\n if (block.location.encoding === 'base64') {\n return decodeBase64Fallback(block.inlineData ?? '')\n }\n return decodeInlineData('hex', block.inlineData ?? '')\n }\n if (block.location.type === 'embedded') {\n const encoding = block.location.encoding ?? 'base64'\n if (encoding === 'base64') {\n return decodeBase64Fallback(block.embeddedData ?? '')\n }\n return decodeInlineData('hex', block.embeddedData ?? '')\n }\n throw new XISFParseError('decodeInlineOrEmbedded called on non-inline block')\n}\n\nexport class XISF {\n readonly unit: XISFUnit\n\n private constructor(unit: XISFUnit) {\n this.unit = unit\n }\n\n static async fromArrayBuffer(buffer: ArrayBuffer, options?: XISFReadOptions): Promise<XISF> {\n const readOptions = withDefaults(options)\n if (!readOptions.verifySignatures && readOptions.signaturePolicy === 'require') {\n throw new XISFSignatureError('signaturePolicy=require requires verifySignatures=true')\n }\n\n let headerXml = ''\n let monolithicBuffer: ArrayBuffer | undefined\n\n if (isMonolithicXISF(buffer)) {\n const container = parseMonolithicContainer(buffer)\n headerXml = container.headerXml\n monolithicBuffer = buffer\n } else {\n headerXml = new TextDecoder('utf-8').decode(new Uint8Array(buffer))\n }\n\n const doc = parseXISFXML(headerXml)\n const detachedSignaturePresent = hasDetachedSignature(doc)\n const root = doc.documentElement\n const forceSignedChecksumValidation =\n detachedSignaturePresent &&\n readOptions.verifySignatures &&\n readOptions.signaturePolicy !== 'ignore'\n\n const byUid = new Map<string, Element>()\n for (let i = 0; i < root.childNodes.length; i++) {\n const node = root.childNodes.item(i)\n if (!node || node.nodeType !== 1) continue\n const element = node as Element\n const uid = element.getAttribute('uid')\n if (uid) {\n byUid.set(uid, element)\n }\n }\n\n const resolveReference = (ref: string): Element | null => byUid.get(ref) ?? null\n\n const readDataBlock: ReadDataBlock = async (element, block): Promise<Uint8Array> => {\n let raw: Uint8Array\n const location = block.location\n\n if (location.type === 'inline' || location.type === 'embedded') {\n raw = await decodeInlineOrEmbedded(block)\n } else if (location.type === 'attachment') {\n if (!monolithicBuffer) {\n throw new XISFResourceError(\n 'Attachment location found but no monolithic XISF payload exists',\n )\n }\n raw = extractAttachmentBytes(monolithicBuffer, location.position, location.size)\n } else {\n raw = await XISF.resolveExternalLocation(location, readOptions)\n }\n\n const isExternalOrAttached =\n location.type === 'attachment' || location.type === 'url' || location.type === 'path'\n if (forceSignedChecksumValidation && isExternalOrAttached && !block.checksum) {\n maybeThrow(\n readOptions,\n new XISFChecksumError(`Checksum is required for signed block in ${element.tagName}`),\n 'checksum_required_for_signed_block',\n )\n }\n\n if (block.checksum && (readOptions.verifyChecksums || forceSignedChecksumValidation)) {\n const ok = await verifyChecksum(raw, block.checksum)\n if (!ok) {\n maybeThrow(\n readOptions,\n new XISFChecksumError(`Checksum mismatch for ${element.tagName}`),\n 'checksum_mismatch',\n )\n }\n }\n\n if (block.compression) {\n try {\n raw = decodeCompressedBlock(raw, block.compression, readOptions.codecProvider)\n } catch (error) {\n maybeThrow(readOptions, error as Error, 'decompression_failed')\n }\n }\n\n return raw\n }\n\n const metadataProperties: XISFProperty[] = []\n const standaloneProperties: XISFProperty[] = []\n const standaloneTables: XISFTable[] = []\n\n const metadataElement = getChildrenByName(root, 'Metadata')[0]\n if (metadataElement) {\n const properties = getChildrenByName(metadataElement, 'Property')\n for (const propertyNode of properties) {\n metadataProperties.push(\n await parsePropertyElement(propertyNode, readDataBlock, {\n strictValidation: readOptions.strictValidation,\n }),\n )\n }\n }\n\n const images = []\n for (const imageNode of getChildrenByName(root, 'Image')) {\n const image = await parseImageElement(\n imageNode,\n resolveReference,\n readDataBlock,\n readOptions.decodeImageData,\n readOptions.strictValidation,\n )\n images.push(image)\n }\n\n for (let i = 0; i < root.childNodes.length; i++) {\n const node = root.childNodes.item(i)\n if (!node || node.nodeType !== 1) continue\n const element = node as Element\n const name = getNodeName(element)\n if (name === 'Property') {\n standaloneProperties.push(\n await parsePropertyElement(element, readDataBlock, {\n strictValidation: readOptions.strictValidation,\n }),\n )\n } else if (name === 'Table') {\n standaloneTables.push(\n await parseTableElement(element, resolveReference, readDataBlock, {\n strictValidation: readOptions.strictValidation,\n }),\n )\n }\n }\n\n let signatureResult = { present: false, verified: true } as XISFUnit['signature']\n if (detachedSignaturePresent && readOptions.signaturePolicy === 'ignore') {\n signatureResult = {\n present: true,\n verified: false,\n reason: 'Signature verification skipped by signaturePolicy=ignore',\n }\n } else if (readOptions.verifySignatures) {\n signatureResult = await verifyDetachedSignature(doc)\n if (signatureResult.present && !signatureResult.verified) {\n if (readOptions.signaturePolicy === 'require') {\n throw new XISFSignatureError(signatureResult.reason ?? 'Signature verification failed')\n }\n warn(readOptions, {\n code: 'signature_verification_failed',\n message: signatureResult.reason ?? 'Signature verification failed',\n })\n }\n }\n\n return new XISF({\n metadata: metadataProperties,\n images,\n standaloneProperties,\n standaloneTables,\n version: root.getAttribute('version') ?? '1.0',\n signature: signatureResult,\n })\n }\n\n static async fromBlob(blob: Blob, options?: XISFReadOptions): Promise<XISF> {\n const buffer = await blob.arrayBuffer()\n return XISF.fromArrayBuffer(buffer, options)\n }\n\n static async fromURL(url: string, options?: XISFReadOptions): Promise<XISF> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new XISFResourceError(\n `Failed to fetch XISF file: ${response.status} ${response.statusText}`,\n )\n }\n const buffer = await response.arrayBuffer()\n\n const headerDir = options?.headerDir ?? XISF.deriveHeaderDirFromURL(url)\n return XISF.fromArrayBuffer(buffer, {\n ...options,\n baseUrl: options?.baseUrl ?? url,\n headerDir,\n })\n }\n\n static fromNodeBuffer(\n nodeBuffer: { buffer: ArrayBuffer; byteOffset: number; byteLength: number },\n options?: XISFReadOptions,\n ): Promise<XISF> {\n const buffer = nodeBuffer.buffer.slice(\n nodeBuffer.byteOffset,\n nodeBuffer.byteOffset + nodeBuffer.byteLength,\n )\n return XISF.fromArrayBuffer(buffer, options)\n }\n\n getImage(index: number = 0) {\n return this.unit.images[index]\n }\n\n getMetadata(): XISFProperty[] {\n return this.unit.metadata\n }\n\n private static async resolveExternalLocation(\n location: Extract<XISFLocation, { type: 'url' | 'path' }>,\n options: Required<XISFReadOptions>,\n ): Promise<Uint8Array> {\n if (location.type === 'url') {\n const data = await options.resourceResolver.resolveURL(location.url)\n if (!location.indexId) return data\n return XISF.sliceIndexedBlock(toArrayBuffer(data), location.indexId)\n }\n\n const pathSpec = resolveHeaderRelativePath(location.path, options.headerDir || undefined)\n const data = await options.resourceResolver.resolvePath(pathSpec)\n if (!location.indexId) return data\n return XISF.sliceIndexedBlock(toArrayBuffer(data), location.indexId)\n }\n\n private static sliceIndexedBlock(buffer: ArrayBuffer, indexId: bigint): Uint8Array {\n const index = parseXISBIndex(buffer)\n const element = index.byId.get(indexId)\n if (!element) {\n throw new XISFValidationError(`Missing XISB block for indexId ${indexId.toString(16)}`)\n }\n return sliceXISBBlock(buffer, element)\n }\n\n private static deriveHeaderDirFromURL(url: string): string {\n try {\n const parsed = new URL(url)\n const path = parsed.pathname\n const slash = path.lastIndexOf('/')\n if (slash < 0) return ''\n const dirPath = path.slice(0, slash)\n return `${parsed.protocol}//${parsed.host}${dirPath}`\n } catch {\n return ''\n }\n }\n}\n\nexport function parseXISFLocationString(location: string): XISFLocation {\n return parseXISFLocation(location)\n}\n","import { buildMonolithicContainer } from './xisf-container'\nimport { buildXISBFile } from './xisb-index'\nimport { createDocument, serializeXML } from './xisf-xml'\nimport { DefaultXISFCodecProvider, encodeCompressedBlock } from './xisf-codec'\nimport { computeChecksum } from './xisf-checksum'\nimport { bytesToBase64 } from '../core/base64'\nimport type { XISFImage, XISFProperty, XISFTable, XISFUnit, XISFWriteOptions } from './xisf-types'\nimport { XISFValidationError } from './xisf-errors'\n\ninterface PendingAttachment {\n element: Element\n data: Uint8Array\n}\n\ninterface DistributedBlockRef {\n element: Element\n data: Uint8Array\n}\n\ntype PropertyScalarType =\n | 'Boolean'\n | 'Int8'\n | 'UInt8'\n | 'Int16'\n | 'UInt16'\n | 'Int32'\n | 'UInt32'\n | 'Int64'\n | 'UInt64'\n | 'Float32'\n | 'Float64'\n | 'Complex32'\n | 'Complex64'\n\nconst PROPERTY_VECTOR_BASE: Record<string, PropertyScalarType> = {\n I8Vector: 'Int8',\n UI8Vector: 'UInt8',\n ByteArray: 'UInt8',\n I16Vector: 'Int16',\n UI16Vector: 'UInt16',\n I32Vector: 'Int32',\n UI32Vector: 'UInt32',\n I64Vector: 'Int64',\n UI64Vector: 'UInt64',\n IVector: 'Int32',\n UIVector: 'UInt32',\n F32Vector: 'Float32',\n F64Vector: 'Float64',\n Vector: 'Float64',\n C32Vector: 'Complex32',\n C64Vector: 'Complex64',\n}\n\nconst PROPERTY_MATRIX_BASE: Record<string, PropertyScalarType> = {\n I8Matrix: 'Int8',\n UI8Matrix: 'UInt8',\n ByteMatrix: 'UInt8',\n I16Matrix: 'Int16',\n UI16Matrix: 'UInt16',\n I32Matrix: 'Int32',\n UI32Matrix: 'UInt32',\n I64Matrix: 'Int64',\n UI64Matrix: 'UInt64',\n IMatrix: 'Int32',\n UIMatrix: 'UInt32',\n F32Matrix: 'Float32',\n F64Matrix: 'Float64',\n Matrix: 'Float64',\n C32Matrix: 'Complex32',\n C64Matrix: 'Complex64',\n}\n\nconst IMAGE_SAMPLE_FORMATS = new Set([\n 'UInt8',\n 'UInt16',\n 'UInt32',\n 'UInt64',\n 'Float32',\n 'Float64',\n 'Complex32',\n 'Complex64',\n])\nconst IMAGE_COLOR_SPACES = new Set(['Gray', 'RGB', 'CIELab'])\nconst IMAGE_PIXEL_STORAGES = new Set(['Planar', 'Normal'])\n\nfunction withDefaults(options?: XISFWriteOptions): Required<XISFWriteOptions> {\n return {\n strictValidation: options?.strictValidation ?? true,\n blockAlignment: options?.blockAlignment ?? 4096,\n maxInlineBlockSize: options?.maxInlineBlockSize ?? 3072,\n compression: options?.compression ?? null,\n compressionLevel: options?.compressionLevel ?? 0,\n checksumAlgorithm: options?.checksumAlgorithm ?? 'sha1',\n codecProvider: options?.codecProvider ?? DefaultXISFCodecProvider,\n }\n}\n\nfunction parseScalarValue(value: unknown): string {\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'bigint') return value.toString(10)\n return String(value)\n}\n\nfunction scalarByteSize(type: PropertyScalarType): number {\n switch (type) {\n case 'Boolean':\n case 'Int8':\n case 'UInt8':\n return 1\n case 'Int16':\n case 'UInt16':\n return 2\n case 'Int32':\n case 'UInt32':\n case 'Float32':\n return 4\n case 'Int64':\n case 'UInt64':\n case 'Float64':\n return 8\n case 'Complex32':\n return 8\n case 'Complex64':\n return 16\n }\n}\n\nfunction imageSampleByteSize(sampleFormat: XISFImage['sampleFormat']): number {\n switch (sampleFormat) {\n case 'UInt8':\n return 1\n case 'UInt16':\n return 2\n case 'UInt32':\n case 'Float32':\n return 4\n case 'UInt64':\n case 'Float64':\n return 8\n case 'Complex32':\n return 8\n case 'Complex64':\n return 16\n }\n}\n\nfunction propertyByteOrderRelevant(type: string): boolean {\n const base = PROPERTY_VECTOR_BASE[type] ?? PROPERTY_MATRIX_BASE[type]\n if (base) return scalarByteSize(base) > 1\n return false\n}\n\nfunction setScalar(\n view: DataView,\n type: PropertyScalarType,\n offset: number,\n value: number | bigint,\n little: boolean,\n): void {\n switch (type) {\n case 'Boolean':\n case 'UInt8':\n view.setUint8(offset, Number(value))\n break\n case 'Int8':\n view.setInt8(offset, Number(value))\n break\n case 'Int16':\n view.setInt16(offset, Number(value), little)\n break\n case 'UInt16':\n view.setUint16(offset, Number(value), little)\n break\n case 'Int32':\n view.setInt32(offset, Number(value), little)\n break\n case 'UInt32':\n view.setUint32(offset, Number(value), little)\n break\n case 'Int64':\n view.setBigInt64(offset, BigInt(value), little)\n break\n case 'UInt64':\n view.setBigUint64(offset, BigInt(value), little)\n break\n case 'Float32':\n view.setFloat32(offset, Number(value), little)\n break\n case 'Float64':\n view.setFloat64(offset, Number(value), little)\n break\n case 'Complex32':\n case 'Complex64':\n break\n }\n}\n\nfunction normalizeComplexValue(value: unknown): { real: number; imag: number } {\n if (Array.isArray(value) && value.length >= 2) {\n return { real: Number(value[0]), imag: Number(value[1]) }\n }\n if (value && typeof value === 'object') {\n const record = value as Record<string, unknown>\n return {\n real: Number(record.real ?? 0),\n imag: Number(record.imag ?? 0),\n }\n }\n return { real: Number(value ?? 0), imag: 0 }\n}\n\nfunction flattenPropertyValue(\n value: unknown,\n): Array<number | bigint | { real: number; imag: number }> {\n if (ArrayBuffer.isView(value)) {\n return Array.from(value as unknown as ArrayLike<number | bigint>)\n }\n if (!Array.isArray(value)) {\n return []\n }\n if (value.length > 0 && Array.isArray(value[0])) {\n return (value as unknown[]).flat() as Array<number | bigint | { real: number; imag: number }>\n }\n return value as Array<number | bigint | { real: number; imag: number }>\n}\n\nfunction encodeStructuredPropertyValue(\n property: XISFProperty,\n): { bytes: Uint8Array; itemCount: number; rows?: number; columns?: number } | undefined {\n const byteOrder = property.dataBlock?.byteOrder === 'big' ? 'big' : 'little'\n const little = byteOrder === 'little'\n\n const encode = (\n baseType: PropertyScalarType,\n flatValues: Array<number | bigint | { real: number; imag: number }>,\n ): Uint8Array => {\n if (baseType === 'Complex32' || baseType === 'Complex64') {\n const componentSize = baseType === 'Complex32' ? 4 : 8\n const out = new Uint8Array(flatValues.length * componentSize * 2)\n const view = new DataView(out.buffer)\n for (let i = 0; i < flatValues.length; i++) {\n const complex = normalizeComplexValue(flatValues[i])\n const baseOffset = i * componentSize * 2\n if (baseType === 'Complex32') {\n view.setFloat32(baseOffset, complex.real, little)\n view.setFloat32(baseOffset + 4, complex.imag, little)\n } else {\n view.setFloat64(baseOffset, complex.real, little)\n view.setFloat64(baseOffset + 8, complex.imag, little)\n }\n }\n return out\n }\n const out = new Uint8Array(flatValues.length * scalarByteSize(baseType))\n const view = new DataView(out.buffer)\n const itemSize = scalarByteSize(baseType)\n for (let i = 0; i < flatValues.length; i++) {\n setScalar(view, baseType, i * itemSize, flatValues[i] as number | bigint, little)\n }\n return out\n }\n\n const vectorBase = PROPERTY_VECTOR_BASE[property.type]\n if (vectorBase) {\n const flat = flattenPropertyValue(property.value)\n return {\n bytes: encode(vectorBase, flat),\n itemCount: flat.length,\n }\n }\n\n const matrixBase = PROPERTY_MATRIX_BASE[property.type]\n if (matrixBase) {\n const matrixLike = property.value as\n | { rows?: number; columns?: number; values?: unknown }\n | undefined\n const rows = property.rows ?? matrixLike?.rows\n const columns = property.columns ?? matrixLike?.columns\n const rawValues = matrixLike?.values ?? property.value\n const flat = flattenPropertyValue(rawValues)\n return {\n bytes: encode(matrixBase, flat),\n itemCount: flat.length,\n rows,\n columns,\n }\n }\n\n return undefined\n}\n\nfunction validateImageForWrite(image: XISFImage, strictValidation: boolean): void {\n if (!IMAGE_SAMPLE_FORMATS.has(image.sampleFormat)) {\n throw new XISFValidationError(`Unsupported image sampleFormat: ${image.sampleFormat}`)\n }\n if (!IMAGE_COLOR_SPACES.has(image.colorSpace ?? 'Gray')) {\n throw new XISFValidationError(`Unsupported image colorSpace: ${image.colorSpace}`)\n }\n if (!IMAGE_PIXEL_STORAGES.has(image.pixelStorage ?? 'Planar')) {\n throw new XISFValidationError(`Unsupported image pixelStorage: ${image.pixelStorage}`)\n }\n if (image.geometry.length === 0 || image.geometry.some((d) => !Number.isInteger(d) || d <= 0)) {\n throw new XISFValidationError('Image geometry must contain positive integers')\n }\n if (!Number.isInteger(image.channelCount) || image.channelCount <= 0) {\n throw new XISFValidationError('Image channelCount must be a positive integer')\n }\n if (\n strictValidation &&\n (image.sampleFormat === 'Float32' || image.sampleFormat === 'Float64') &&\n !image.bounds\n ) {\n throw new XISFValidationError('bounds is required for Float32/Float64 images')\n }\n}\n\nasync function maybeApplyCompressionAndChecksum(\n data: Uint8Array,\n element: Element,\n options: Required<XISFWriteOptions>,\n itemSize: number,\n): Promise<Uint8Array> {\n let out = data\n if (options.compression) {\n const compressed = encodeCompressedBlock(\n out,\n options.compression,\n options.codecProvider,\n options.compressionLevel,\n itemSize,\n )\n out = compressed.data\n const spec = compressed.spec\n const compressionAttr = spec.itemSize\n ? `${spec.codec}:${spec.uncompressedSize}:${spec.itemSize}`\n : `${spec.codec}:${spec.uncompressedSize}`\n element.setAttribute('compression', compressionAttr)\n }\n\n if (options.checksumAlgorithm) {\n const digest = await computeChecksum(out, options.checksumAlgorithm)\n element.setAttribute('checksum', `${options.checksumAlgorithm}:${digest}`)\n }\n\n return out\n}\n\nfunction appendPropertyElement(\n doc: Document,\n parent: Element,\n property: XISFProperty,\n pendingAttachments: PendingAttachment[],\n maxInlineSize: number,\n): void {\n const element = doc.createElement('Property')\n element.setAttribute('id', property.id)\n element.setAttribute('type', property.type)\n if (property.format) element.setAttribute('format', property.format)\n if (property.comment) element.setAttribute('comment', property.comment)\n\n const value = property.value\n if (value === undefined || value === null) {\n // no-op\n } else if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n if (property.type === 'String' && typeof value === 'string' && value.length > maxInlineSize) {\n const bytes = new TextEncoder().encode(String(value))\n element.setAttribute('location', `attachment:0:${bytes.byteLength}`)\n pendingAttachments.push({ element, data: bytes })\n } else if (property.type === 'String' && !property.dataBlock) {\n element.appendChild(doc.createTextNode(String(value)))\n } else {\n element.setAttribute('value', parseScalarValue(value))\n }\n } else if (ArrayBuffer.isView(value)) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n if (bytes.byteLength <= maxInlineSize) {\n element.setAttribute(\n 'length',\n String((value as ArrayLike<number>).length ?? bytes.byteLength),\n )\n element.setAttribute('location', 'inline:base64')\n element.appendChild(doc.createTextNode(encodeBase64(bytes)))\n } else {\n element.setAttribute(\n 'length',\n String((value as ArrayLike<number>).length ?? bytes.byteLength),\n )\n element.setAttribute('location', `attachment:0:${bytes.byteLength}`)\n pendingAttachments.push({ element, data: bytes })\n }\n if (propertyByteOrderRelevant(property.type) && property.dataBlock?.byteOrder) {\n element.setAttribute('byteOrder', property.dataBlock.byteOrder)\n }\n } else {\n const encoded = encodeStructuredPropertyValue(property)\n if (encoded) {\n if (encoded.rows !== undefined) element.setAttribute('rows', String(encoded.rows))\n if (encoded.columns !== undefined) element.setAttribute('columns', String(encoded.columns))\n if (property.type in PROPERTY_VECTOR_BASE) {\n element.setAttribute('length', String(encoded.itemCount))\n }\n if (encoded.bytes.byteLength <= maxInlineSize) {\n element.setAttribute('location', 'inline:base64')\n element.appendChild(doc.createTextNode(encodeBase64(encoded.bytes)))\n } else {\n element.setAttribute('location', `attachment:0:${encoded.bytes.byteLength}`)\n pendingAttachments.push({ element, data: encoded.bytes })\n }\n if (propertyByteOrderRelevant(property.type) && property.dataBlock?.byteOrder) {\n element.setAttribute('byteOrder', property.dataBlock.byteOrder)\n }\n }\n }\n\n if (property.rows !== undefined) element.setAttribute('rows', String(property.rows))\n if (property.columns !== undefined) element.setAttribute('columns', String(property.columns))\n\n parent.appendChild(element)\n}\n\nfunction appendTableElement(\n doc: Document,\n parent: Element,\n table: XISFTable,\n pendingAttachments: PendingAttachment[],\n maxInlineSize: number,\n): void {\n const tableElement = doc.createElement('Table')\n tableElement.setAttribute('id', table.id)\n if (table.caption) tableElement.setAttribute('caption', table.caption)\n if (table.comment) tableElement.setAttribute('comment', table.comment)\n tableElement.setAttribute('rows', String(table.dataRows.length))\n tableElement.setAttribute('columns', String(table.structure.length))\n\n const structureElement = doc.createElement('Structure')\n for (const field of table.structure) {\n const fieldElement = doc.createElement('Field')\n fieldElement.setAttribute('id', field.id)\n fieldElement.setAttribute('type', field.type)\n if (field.format) fieldElement.setAttribute('format', field.format)\n if (field.header) fieldElement.setAttribute('header', field.header)\n structureElement.appendChild(fieldElement)\n }\n tableElement.appendChild(structureElement)\n\n for (const row of table.dataRows) {\n const rowElement = doc.createElement('Row')\n for (let i = 0; i < row.cells.length; i++) {\n const cell = row.cells[i]!\n const field = table.structure[i]\n const cellElement = doc.createElement('Cell')\n const type = cell.type || field?.type\n if (type) cellElement.setAttribute('type', type)\n if (cell.id || field?.id) cellElement.setAttribute('id', cell.id || field!.id)\n if (cell.format || field?.format)\n cellElement.setAttribute('format', cell.format || field!.format!)\n if (cell.comment) cellElement.setAttribute('comment', cell.comment)\n if (cell.value !== undefined && cell.value !== null) {\n if (\n typeof cell.value === 'string' ||\n typeof cell.value === 'number' ||\n typeof cell.value === 'boolean' ||\n typeof cell.value === 'bigint'\n ) {\n cellElement.setAttribute('value', parseScalarValue(cell.value))\n } else if (ArrayBuffer.isView(cell.value)) {\n const bytes = new Uint8Array(\n cell.value.buffer,\n cell.value.byteOffset,\n cell.value.byteLength,\n )\n if (bytes.byteLength <= maxInlineSize) {\n cellElement.setAttribute('location', 'inline:base64')\n cellElement.appendChild(doc.createTextNode(encodeBase64(bytes)))\n } else {\n cellElement.setAttribute('location', `attachment:0:${bytes.byteLength}`)\n pendingAttachments.push({ element: cellElement, data: bytes })\n }\n if (type && propertyByteOrderRelevant(type) && cell.dataBlock?.byteOrder) {\n cellElement.setAttribute('byteOrder', cell.dataBlock.byteOrder)\n }\n } else if (type) {\n const encoded = encodeStructuredPropertyValue({\n ...cell,\n type,\n })\n if (encoded) {\n if (encoded.rows !== undefined) cellElement.setAttribute('rows', String(encoded.rows))\n if (encoded.columns !== undefined)\n cellElement.setAttribute('columns', String(encoded.columns))\n if (type in PROPERTY_VECTOR_BASE) {\n cellElement.setAttribute('length', String(encoded.itemCount))\n }\n if (encoded.bytes.byteLength <= maxInlineSize) {\n cellElement.setAttribute('location', 'inline:base64')\n cellElement.appendChild(doc.createTextNode(encodeBase64(encoded.bytes)))\n } else {\n cellElement.setAttribute('location', `attachment:0:${encoded.bytes.byteLength}`)\n pendingAttachments.push({ element: cellElement, data: encoded.bytes })\n }\n if (propertyByteOrderRelevant(type) && cell.dataBlock?.byteOrder) {\n cellElement.setAttribute('byteOrder', cell.dataBlock.byteOrder)\n }\n }\n }\n }\n rowElement.appendChild(cellElement)\n }\n tableElement.appendChild(rowElement)\n }\n\n parent.appendChild(tableElement)\n}\n\nfunction addImageChildren(\n doc: Document,\n imageElement: Element,\n image: XISFImage,\n pendingAttachments: PendingAttachment[],\n maxInlineSize: number,\n): void {\n for (const keyword of image.fitsKeywords) {\n const node = doc.createElement('FITSKeyword')\n node.setAttribute('name', keyword.name)\n node.setAttribute('value', keyword.value)\n node.setAttribute('comment', keyword.comment)\n imageElement.appendChild(node)\n }\n\n for (const property of image.properties) {\n appendPropertyElement(doc, imageElement, property, pendingAttachments, maxInlineSize)\n }\n\n for (const table of image.tables) {\n appendTableElement(doc, imageElement, table, pendingAttachments, maxInlineSize)\n }\n\n if (image.iccProfile) {\n const node = doc.createElement('ICCProfile')\n node.setAttribute('location', `attachment:0:${image.iccProfile.byteLength}`)\n pendingAttachments.push({ element: node, data: image.iccProfile })\n imageElement.appendChild(node)\n }\n\n if (image.rgbWorkingSpace) {\n const node = doc.createElement('RGBWorkingSpace')\n node.setAttribute('gamma', image.rgbWorkingSpace.gamma)\n node.setAttribute('x', image.rgbWorkingSpace.x.join(':'))\n node.setAttribute('y', image.rgbWorkingSpace.y.join(':'))\n node.setAttribute('Y', image.rgbWorkingSpace.Y.join(':'))\n if (image.rgbWorkingSpace.name) node.setAttribute('name', image.rgbWorkingSpace.name)\n imageElement.appendChild(node)\n }\n\n if (image.displayFunction) {\n const node = doc.createElement('DisplayFunction')\n node.setAttribute('m', image.displayFunction.m.join(':'))\n node.setAttribute('s', image.displayFunction.s.join(':'))\n node.setAttribute('h', image.displayFunction.h.join(':'))\n node.setAttribute('l', image.displayFunction.l.join(':'))\n node.setAttribute('r', image.displayFunction.r.join(':'))\n if (image.displayFunction.name) node.setAttribute('name', image.displayFunction.name)\n imageElement.appendChild(node)\n }\n\n if (image.colorFilterArray) {\n const node = doc.createElement('ColorFilterArray')\n node.setAttribute('pattern', image.colorFilterArray.pattern)\n node.setAttribute('width', String(image.colorFilterArray.width))\n node.setAttribute('height', String(image.colorFilterArray.height))\n if (image.colorFilterArray.name) node.setAttribute('name', image.colorFilterArray.name)\n imageElement.appendChild(node)\n }\n\n if (image.resolution) {\n const node = doc.createElement('Resolution')\n node.setAttribute('horizontal', String(image.resolution.horizontal))\n node.setAttribute('vertical', String(image.resolution.vertical))\n if (image.resolution.unit) node.setAttribute('unit', image.resolution.unit)\n imageElement.appendChild(node)\n }\n}\n\nfunction encodeBase64(bytes: Uint8Array): string {\n try {\n return bytesToBase64(bytes)\n } catch (error) {\n throw new XISFValidationError(\n `No base64 encoder available in this environment: ${(error as Error).message}`,\n )\n }\n}\n\nasync function assignAttachmentPositions(\n options: Required<XISFWriteOptions>,\n root: Element,\n attachments: PendingAttachment[],\n): Promise<Array<{ position: number; data: Uint8Array }>> {\n let previousHeaderLength = -1\n let headerXml = ''\n let headerLength = 0\n\n while (headerLength !== previousHeaderLength) {\n const doc = root.ownerDocument\n headerXml = serializeXML(doc)\n const headerBytes = new TextEncoder().encode(headerXml)\n headerLength = headerBytes.byteLength\n\n if (headerLength === previousHeaderLength) break\n previousHeaderLength = headerLength\n let position = 16 + headerLength\n const aligned = (n: number): number =>\n options.blockAlignment > 1\n ? Math.ceil(n / options.blockAlignment) * options.blockAlignment\n : n\n\n position = aligned(position)\n for (const attachment of attachments) {\n attachment.element.setAttribute(\n 'location',\n `attachment:${position}:${attachment.data.byteLength}`,\n )\n position = aligned(position + attachment.data.byteLength)\n }\n }\n\n const resolved: Array<{ position: number; data: Uint8Array }> = []\n for (const attachment of attachments) {\n const location = attachment.element.getAttribute('location')\n if (!location) continue\n const parts = location.split(':')\n const position = Number(parts[1])\n resolved.push({ position, data: attachment.data })\n }\n return resolved\n}\n\nexport class XISFWriter {\n static async toMonolithic(unit: XISFUnit, options?: XISFWriteOptions): Promise<ArrayBuffer> {\n const writeOptions = withDefaults(options)\n const doc = createDocument()\n const root = doc.documentElement\n\n const metadataElement = doc.createElement('Metadata')\n const attachments: PendingAttachment[] = []\n\n for (const property of unit.metadata) {\n appendPropertyElement(\n doc,\n metadataElement,\n property,\n attachments,\n writeOptions.maxInlineBlockSize,\n )\n }\n root.appendChild(metadataElement)\n\n for (const standaloneProperty of unit.standaloneProperties) {\n appendPropertyElement(\n doc,\n root,\n standaloneProperty,\n attachments,\n writeOptions.maxInlineBlockSize,\n )\n }\n\n for (const standaloneTable of unit.standaloneTables) {\n appendTableElement(doc, root, standaloneTable, attachments, writeOptions.maxInlineBlockSize)\n }\n\n for (const image of unit.images) {\n validateImageForWrite(image, writeOptions.strictValidation)\n if (!image.data) {\n throw new XISFValidationError('Image data is required for monolithic writing')\n }\n\n const imageElement = doc.createElement('Image')\n imageElement.setAttribute('geometry', [...image.geometry, image.channelCount].join(':'))\n imageElement.setAttribute('sampleFormat', image.sampleFormat)\n imageElement.setAttribute('colorSpace', image.colorSpace ?? 'Gray')\n imageElement.setAttribute('pixelStorage', image.pixelStorage ?? 'Planar')\n if (image.bounds) imageElement.setAttribute('bounds', `${image.bounds[0]}:${image.bounds[1]}`)\n if (image.id) imageElement.setAttribute('id', image.id)\n if (image.uuid) imageElement.setAttribute('uuid', image.uuid)\n if (image.imageType) imageElement.setAttribute('imageType', image.imageType)\n if (image.offset !== undefined) imageElement.setAttribute('offset', String(image.offset))\n if (image.orientation) imageElement.setAttribute('orientation', image.orientation)\n if (image.dataBlock.byteOrder && imageSampleByteSize(image.sampleFormat) > 1) {\n imageElement.setAttribute('byteOrder', image.dataBlock.byteOrder)\n }\n\n const itemSize = imageSampleByteSize(image.sampleFormat)\n const storedData = await maybeApplyCompressionAndChecksum(\n image.data,\n imageElement,\n writeOptions,\n Math.max(1, itemSize),\n )\n imageElement.setAttribute('location', `attachment:0:${storedData.byteLength}`)\n attachments.push({ element: imageElement, data: storedData })\n\n addImageChildren(doc, imageElement, image, attachments, writeOptions.maxInlineBlockSize)\n root.appendChild(imageElement)\n }\n\n const positioned = await assignAttachmentPositions(writeOptions, root, attachments)\n const headerXml = serializeXML(doc)\n const bytes = buildMonolithicContainer(headerXml, positioned)\n return bytes.slice().buffer\n }\n\n static async toDistributed(\n unit: XISFUnit,\n options?: XISFWriteOptions,\n ): Promise<{ header: Uint8Array; blocks: Record<string, Uint8Array> }> {\n const writeOptions = withDefaults(options)\n const doc = createDocument()\n const root = doc.documentElement\n\n const blockRefs: DistributedBlockRef[] = []\n const pendingAttachments: PendingAttachment[] = []\n const metadataElement = doc.createElement('Metadata')\n root.appendChild(metadataElement)\n\n const attachExternalBlock = (element: Element, data: Uint8Array): void => {\n blockRefs.push({ element, data })\n }\n\n for (const property of unit.metadata) {\n appendPropertyElement(\n doc,\n metadataElement,\n property,\n pendingAttachments,\n writeOptions.maxInlineBlockSize,\n )\n }\n\n for (const standaloneProperty of unit.standaloneProperties) {\n appendPropertyElement(\n doc,\n root,\n standaloneProperty,\n pendingAttachments,\n writeOptions.maxInlineBlockSize,\n )\n }\n\n for (const standaloneTable of unit.standaloneTables) {\n appendTableElement(\n doc,\n root,\n standaloneTable,\n pendingAttachments,\n writeOptions.maxInlineBlockSize,\n )\n }\n\n for (const image of unit.images) {\n validateImageForWrite(image, writeOptions.strictValidation)\n if (!image.data) {\n throw new XISFValidationError('Image data is required for distributed writing')\n }\n const imageElement = doc.createElement('Image')\n imageElement.setAttribute('geometry', [...image.geometry, image.channelCount].join(':'))\n imageElement.setAttribute('sampleFormat', image.sampleFormat)\n imageElement.setAttribute('colorSpace', image.colorSpace ?? 'Gray')\n imageElement.setAttribute('pixelStorage', image.pixelStorage ?? 'Planar')\n if (image.bounds) imageElement.setAttribute('bounds', `${image.bounds[0]}:${image.bounds[1]}`)\n if (image.id) imageElement.setAttribute('id', image.id)\n if (image.uuid) imageElement.setAttribute('uuid', image.uuid)\n if (image.imageType) imageElement.setAttribute('imageType', image.imageType)\n if (image.offset !== undefined) imageElement.setAttribute('offset', String(image.offset))\n if (image.orientation) imageElement.setAttribute('orientation', image.orientation)\n if (image.dataBlock.byteOrder && imageSampleByteSize(image.sampleFormat) > 1) {\n imageElement.setAttribute('byteOrder', image.dataBlock.byteOrder)\n }\n\n const itemSize = imageSampleByteSize(image.sampleFormat)\n const storedData = await maybeApplyCompressionAndChecksum(\n image.data,\n imageElement,\n writeOptions,\n Math.max(1, itemSize),\n )\n imageElement.setAttribute('location', `attachment:0:${storedData.byteLength}`)\n pendingAttachments.push({ element: imageElement, data: storedData })\n\n addImageChildren(\n doc,\n imageElement,\n image,\n pendingAttachments,\n writeOptions.maxInlineBlockSize,\n )\n root.appendChild(imageElement)\n }\n\n for (const attachment of pendingAttachments) {\n attachExternalBlock(attachment.element, attachment.data)\n }\n\n const { bytes: xisbBytes, ids } = buildXISBFile(blockRefs.map((r) => r.data))\n for (let i = 0; i < blockRefs.length; i++) {\n const id = ids[i]!\n blockRefs[i]!.element.setAttribute(\n 'location',\n `path(@header_dir/blocks.xisb):0x${id.toString(16)}`,\n )\n }\n\n const header = new TextEncoder().encode(serializeXML(doc))\n return {\n header,\n blocks: {\n 'blocks.xisb': xisbBytes,\n },\n }\n }\n}\n","import { BLOCK_LENGTH, LINE_WIDTH } from '../core/constants'\n\nexport interface FITSHeaderCard {\n key: string\n value?: string | number | boolean | bigint | null\n comment?: string\n}\n\nexport interface FITSWriteHDU {\n cards: FITSHeaderCard[]\n data?: Uint8Array\n}\n\nfunction padCard(text: string): string {\n return text.padEnd(LINE_WIDTH, ' ').slice(0, LINE_WIDTH)\n}\n\nfunction formatValue(value: string | number | boolean | bigint | null | undefined): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') {\n const escaped = value.replaceAll(\"'\", \"''\")\n return `'${escaped}'`\n }\n if (typeof value === 'boolean') {\n return value ? 'T' : 'F'\n }\n if (typeof value === 'bigint') {\n return value.toString(10)\n }\n if (Number.isFinite(value)) {\n return Number.isInteger(value) ? value.toString(10) : value.toExponential().replace('e', 'E')\n }\n return String(value)\n}\n\nfunction formatCard(card: FITSHeaderCard): string {\n const key = card.key.toUpperCase().slice(0, 8).padEnd(8, ' ')\n if (card.key === 'END') return padCard('END')\n if (card.value === undefined) {\n return padCard(`${key} ${card.comment ?? ''}`)\n }\n\n const valueText = formatValue(card.value)\n const body = `${key}= ${valueText}`\n if (card.comment) {\n return padCard(`${body} / ${card.comment}`)\n }\n return padCard(body)\n}\n\nfunction padBlockLength(length: number): number {\n return length + ((BLOCK_LENGTH - (length % BLOCK_LENGTH)) % BLOCK_LENGTH)\n}\n\nfunction buildHeader(cards: FITSHeaderCard[]): Uint8Array {\n const withEnd = [...cards]\n if (!withEnd.some((c) => c.key === 'END')) {\n withEnd.push({ key: 'END' })\n }\n const header = withEnd.map(formatCard).join('')\n const padded = header.padEnd(padBlockLength(header.length), ' ')\n return new TextEncoder().encode(padded)\n}\n\nexport function writeFITS(hdus: FITSWriteHDU[]): ArrayBuffer {\n const headerBlocks = hdus.map((hdu) => buildHeader(hdu.cards))\n const dataBlocks = hdus.map((hdu) => {\n const data = hdu.data ?? new Uint8Array(0)\n const paddedLength = padBlockLength(data.byteLength)\n const out = new Uint8Array(paddedLength)\n out.set(data)\n return out\n })\n\n const total =\n headerBlocks.reduce((sum, h) => sum + h.byteLength, 0) +\n dataBlocks.reduce((sum, d) => sum + d.byteLength, 0)\n\n const out = new Uint8Array(total)\n let offset = 0\n for (let i = 0; i < hdus.length; i++) {\n const header = headerBlocks[i]!\n const data = dataBlocks[i]!\n out.set(header, offset)\n offset += header.byteLength\n out.set(data, offset)\n offset += data.byteLength\n }\n\n return out.buffer\n}\n\nexport function createImageBytesFromArray(\n values: ArrayLike<number> | ArrayLike<bigint>,\n bitpix: 8 | 16 | 32 | 64 | -32 | -64,\n): Uint8Array {\n const bytesPerSample = Math.abs(bitpix) / 8\n const out = new Uint8Array(values.length * bytesPerSample)\n const view = new DataView(out.buffer)\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]!\n const pos = i * bytesPerSample\n switch (bitpix) {\n case 8:\n view.setUint8(pos, Number(value))\n break\n case 16:\n view.setInt16(pos, Number(value), false)\n break\n case 32:\n view.setInt32(pos, Number(value), false)\n break\n case 64:\n view.setBigInt64(pos, BigInt(value as bigint | number), false)\n break\n case -32:\n view.setFloat32(pos, Number(value), false)\n break\n case -64:\n view.setFloat64(pos, Number(value), false)\n break\n }\n }\n\n return out\n}\n\nexport function createImageHDU(params: {\n primary?: boolean\n extensionType?: 'IMAGE'\n width: number\n height: number\n depth?: number\n bitpix: 8 | 16 | 32 | 64 | -32 | -64\n data: Uint8Array\n bzero?: number | bigint\n bscale?: number\n extname?: string\n additionalCards?: FITSHeaderCard[]\n}): FITSWriteHDU {\n const naxis = params.depth && params.depth > 1 ? 3 : 2\n const cards: FITSHeaderCard[] = []\n\n if (params.primary !== false) {\n cards.push({ key: 'SIMPLE', value: true, comment: 'Standard FITS' })\n } else {\n cards.push({\n key: 'XTENSION',\n value: params.extensionType ?? 'IMAGE',\n comment: 'Image extension',\n })\n }\n\n cards.push({ key: 'BITPIX', value: params.bitpix, comment: 'Bits per pixel' })\n cards.push({ key: 'NAXIS', value: naxis, comment: 'Number of axes' })\n cards.push({ key: 'NAXIS1', value: params.width })\n cards.push({ key: 'NAXIS2', value: params.height })\n if (naxis === 3) cards.push({ key: 'NAXIS3', value: params.depth ?? 1 })\n if (params.primary !== false) {\n cards.push({ key: 'EXTEND', value: true })\n } else {\n cards.push({ key: 'PCOUNT', value: 0 })\n cards.push({ key: 'GCOUNT', value: 1 })\n }\n if (params.bscale !== undefined) cards.push({ key: 'BSCALE', value: params.bscale })\n if (params.bzero !== undefined) cards.push({ key: 'BZERO', value: params.bzero })\n if (params.extname) cards.push({ key: 'EXTNAME', value: params.extname })\n if (params.additionalCards) cards.push(...params.additionalCards)\n\n return {\n cards,\n data: params.data,\n }\n}\n","import { FITS } from '../fits'\nimport { BinaryTable } from '../fits/binary-table'\nimport { Image } from '../fits/image'\nimport { XISF } from './'\nimport { XISFWriter } from './xisf-writer'\nimport {\n createImageBytesFromArray,\n createImageHDU,\n writeFITS,\n type FITSWriteHDU,\n} from '../fits/fits-writer'\nimport { base64ToBytes, bytesToBase64 } from '../core/base64'\nimport { XISFConversionError } from './xisf-errors'\nimport type { ConversionOptions, XISFImage, XISFUnit, XISFWriteOptions } from './xisf-types'\n\nconst U16_BZERO = 32768\nconst U32_BZERO = 2147483648\nconst U64_BZERO = 9223372036854775808n\nconst FITS_PRESERVED_LAYOUT_PROPERTY = 'FITS:PreservedHDULayout'\n\ninterface PreservedCard {\n key: string\n value?: string | number | boolean | null\n comment?: string\n}\n\ninterface PreservedHDU {\n index: number\n cards: PreservedCard[]\n dataBase64: string\n}\n\ninterface PreservedHDULayout {\n imageSourceIndices: number[]\n nonImageHDUs: PreservedHDU[]\n}\n\nfunction product(values: number[]): number {\n return values.reduce((a, b) => a * b, 1)\n}\n\nfunction readViewValue(\n view: DataView,\n offset: number,\n format: XISFImage['sampleFormat'],\n little: boolean,\n): number | bigint {\n switch (format) {\n case 'UInt8':\n return view.getUint8(offset)\n case 'UInt16':\n return view.getUint16(offset, little)\n case 'UInt32':\n return view.getUint32(offset, little)\n case 'UInt64':\n return view.getBigUint64(offset, little)\n case 'Float32':\n return view.getFloat32(offset, little)\n case 'Float64':\n return view.getFloat64(offset, little)\n default:\n return view.getFloat32(offset, little)\n }\n}\n\nfunction sampleSize(format: XISFImage['sampleFormat']): number {\n switch (format) {\n case 'UInt8':\n return 1\n case 'UInt16':\n return 2\n case 'UInt32':\n case 'Float32':\n return 4\n case 'UInt64':\n case 'Float64':\n return 8\n case 'Complex32':\n return 8\n case 'Complex64':\n return 16\n }\n}\n\nfunction decodeXISFImageValues(image: XISFImage): Array<number | bigint> {\n if (!image.data) {\n throw new XISFConversionError('XISF image data was not decoded')\n }\n\n const size = sampleSize(image.sampleFormat)\n const view = new DataView(image.data.buffer, image.data.byteOffset, image.data.byteLength)\n const count = image.data.byteLength / size\n const little = image.dataBlock.byteOrder !== 'big'\n\n if (image.sampleFormat === 'Complex32' || image.sampleFormat === 'Complex64') {\n const scalarFormat = image.sampleFormat === 'Complex32' ? 'Float32' : 'Float64'\n const scalarSize = sampleSize(scalarFormat)\n const out: number[] = new Array((count * size) / scalarSize)\n let oi = 0\n for (let i = 0; i < count; i++) {\n const base = i * size\n out[oi++] = Number(readViewValue(view, base, scalarFormat, little))\n out[oi++] = Number(readViewValue(view, base + scalarSize, scalarFormat, little))\n }\n return out\n }\n\n const out: Array<number | bigint> = new Array(count)\n for (let i = 0; i < count; i++) {\n out[i] = readViewValue(view, i * size, image.sampleFormat, little)\n }\n\n if (image.pixelStorage === 'Normal' && image.channelCount > 1) {\n const pixels = count / image.channelCount\n const deinterleaved: Array<number | bigint> = new Array(count)\n let di = 0\n for (let c = 0; c < image.channelCount; c++) {\n for (let p = 0; p < pixels; p++) {\n deinterleaved[di++] = out[p * image.channelCount + c]!\n }\n }\n return deinterleaved\n }\n\n return out\n}\n\nfunction encodeLittleEndian(\n values: ArrayLike<number | bigint>,\n format: XISFImage['sampleFormat'],\n): Uint8Array {\n const size = sampleSize(format)\n const out = new Uint8Array(values.length * size)\n const view = new DataView(out.buffer)\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]!\n const offset = i * size\n switch (format) {\n case 'UInt8':\n view.setUint8(offset, Number(value))\n break\n case 'UInt16':\n view.setUint16(offset, Number(value), true)\n break\n case 'UInt32':\n view.setUint32(offset, Number(value), true)\n break\n case 'UInt64':\n view.setBigUint64(offset, BigInt(value), true)\n break\n case 'Float32':\n view.setFloat32(offset, Number(value), true)\n break\n case 'Float64':\n view.setFloat64(offset, Number(value), true)\n break\n case 'Complex32':\n case 'Complex64':\n break\n }\n }\n\n return out\n}\n\nfunction encodeComplexLittleEndian(\n values: ArrayLike<number>,\n format: 'Complex32' | 'Complex64',\n): Uint8Array {\n const bytesPerComponent = format === 'Complex32' ? 4 : 8\n const out = new Uint8Array(values.length * bytesPerComponent)\n const view = new DataView(out.buffer)\n for (let i = 0; i < values.length; i++) {\n const value = values[i]!\n const offset = i * bytesPerComponent\n if (format === 'Complex32') {\n view.setFloat32(offset, value, true)\n } else {\n view.setFloat64(offset, value, true)\n }\n }\n return out\n}\n\nfunction normalizeInputToArrayBuffer(\n input: ArrayBuffer | Blob,\n): Promise<ArrayBuffer> | ArrayBuffer {\n if (input instanceof ArrayBuffer) return input\n return input.arrayBuffer()\n}\n\nasync function encodeBase64(bytes: Uint8Array): Promise<string> {\n return bytesToBase64(bytes)\n}\n\nasync function decodeBase64(payload: string): Promise<Uint8Array> {\n return base64ToBytes(payload)\n}\n\nfunction buildXISFMetaJSON(xisf: XISF): string {\n return JSON.stringify(\n {\n metadata: xisf.unit.metadata,\n standaloneProperties: xisf.unit.standaloneProperties,\n standaloneTables: xisf.unit.standaloneTables,\n },\n null,\n 0,\n )\n}\n\nfunction geometryFromImage(image: XISFImage): { width: number; height: number; depth: number } {\n if (image.geometry.length === 1) {\n return { width: image.geometry[0]!, height: 1, depth: image.channelCount }\n }\n if (image.geometry.length === 2) {\n return { width: image.geometry[0]!, height: image.geometry[1]!, depth: image.channelCount }\n }\n const width = image.geometry[0]!\n const height = image.geometry[1]!\n const extraDepth = product(image.geometry.slice(2))\n return { width, height, depth: image.channelCount * extraDepth }\n}\n\nfunction isStrict(options?: ConversionOptions): boolean {\n return options?.strictValidation ?? options?.relaxed !== true\n}\n\nfunction isHeaderTrue(fits: FITS['hdus'][number]['header'], key: string): boolean {\n const value = fits.get(key)\n return value === true || value === 'T' || value === 'true' || value === 1\n}\n\nfunction parseHeaderValuePortion(rawValue: string): string {\n if (rawValue.trimStart().startsWith(\"'\")) {\n const openQuote = rawValue.indexOf(\"'\")\n let closeQuote = -1\n let pos = openQuote + 1\n while (pos < rawValue.length) {\n const q = rawValue.indexOf(\"'\", pos)\n if (q === -1) break\n if (q + 1 < rawValue.length && rawValue[q + 1] === \"'\") {\n pos = q + 2\n continue\n }\n closeQuote = q\n break\n }\n if (closeQuote === -1) return rawValue.trim()\n return rawValue.slice(0, closeQuote + 1).trim()\n }\n const slashIdx = rawValue.indexOf(' /')\n return (slashIdx === -1 ? rawValue : rawValue.slice(0, slashIdx)).trim()\n}\n\nfunction getRawHeaderValue(header: FITS['hdus'][number]['header'], key: string): string | null {\n const lineWidth = 80\n const block = header.block\n for (let i = 0; i + lineWidth <= block.length; i += lineWidth) {\n const line = block.slice(i, i + lineWidth)\n const cardKey = line.slice(0, 8).trim()\n if (cardKey !== key) continue\n if (line.slice(8, 10) !== '= ') return null\n return parseHeaderValuePortion(line.slice(10))\n }\n return null\n}\n\nfunction parseStrictIntegerLiteral(raw: string | null): bigint | null {\n if (!raw) return null\n const normalized = raw.trim()\n if (!/^[-+]?\\d+$/u.test(normalized)) return null\n try {\n return BigInt(normalized)\n } catch {\n return null\n }\n}\n\nfunction isCanonicalUInt64BITPIX64(header: FITS['hdus'][number]['header'], image: Image): boolean {\n if (image.bitpix !== 64) return false\n const bscaleRaw = getRawHeaderValue(header, 'BSCALE')\n const bzeroRaw = getRawHeaderValue(header, 'BZERO')\n const bscale = bscaleRaw ? Number(bscaleRaw) : 1\n if (bscale !== 1) return false\n const bzero = parseStrictIntegerLiteral(bzeroRaw)\n return bzero === U64_BZERO\n}\n\nfunction formatFITSKeywordValue(value: unknown): string {\n if (value === true) return 'T'\n if (value === false) return 'F'\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nfunction upsertMetadataString(\n metadata: XISFUnit['metadata'],\n id: string,\n value: string,\n): XISFUnit['metadata'] {\n const out = metadata.filter((property) => property.id !== id)\n out.push({\n id,\n type: 'String',\n value,\n })\n return out\n}\n\nfunction readPreservedLayoutFromMetadata(\n metadata: XISFUnit['metadata'],\n): PreservedHDULayout | null {\n const property = metadata.find((item) => item.id === FITS_PRESERVED_LAYOUT_PROPERTY)\n if (!property || typeof property.value !== 'string') return null\n try {\n const parsed = JSON.parse(property.value) as PreservedHDULayout\n if (!Array.isArray(parsed.imageSourceIndices) || !Array.isArray(parsed.nonImageHDUs))\n return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction toFITSWriteHDU(preserved: PreservedHDU, data: Uint8Array): FITSWriteHDU {\n return {\n cards: preserved.cards.map((card) => ({\n key: card.key,\n value: card.value,\n comment: card.comment,\n })),\n data,\n }\n}\n\nasync function toPreservedHDU(hdu: FITS['hdus'][number], index: number): Promise<PreservedHDU> {\n const cards = hdu.header.getCards().map((card) => ({\n key: card.key,\n value: typeof card.value === 'bigint' ? Number(card.value) : card.value,\n comment: card.comment || undefined,\n }))\n\n let bytes = new Uint8Array(0)\n if (hdu.data?.buffer) {\n bytes = new Uint8Array(hdu.data.buffer)\n } else if (hdu.data?.blob) {\n bytes = new Uint8Array(await hdu.data.blob.arrayBuffer())\n }\n\n return {\n index,\n cards,\n dataBase64: await encodeBase64(bytes),\n }\n}\n\nexport async function convertXisfToFits(\n input: ArrayBuffer | Blob | XISF,\n options?: ConversionOptions,\n): Promise<ArrayBuffer> {\n const strictValidation = isStrict(options)\n const xisf =\n input instanceof XISF\n ? input\n : await XISF.fromArrayBuffer(await normalizeInputToArrayBuffer(input), {\n strictValidation,\n })\n\n const imageHDUs: FITSWriteHDU[] = []\n\n for (let i = 0; i < xisf.unit.images.length; i++) {\n const image = xisf.unit.images[i]!\n const values = decodeXISFImageValues(image)\n const { width, height, depth } = geometryFromImage(image)\n const additionalCards = image.fitsKeywords.map((kw) => ({\n key: kw.name,\n value: kw.value,\n comment: kw.comment,\n }))\n\n if (image.sampleFormat === 'Complex32' || image.sampleFormat === 'Complex64') {\n const data = createImageBytesFromArray(\n values as ArrayLike<number>,\n image.sampleFormat === 'Complex32' ? -32 : -64,\n )\n const rowSize = image.sampleFormat === 'Complex32' ? 8 : 16\n const rowCount = width * height * depth\n imageHDUs.push({\n cards: [\n { key: 'XTENSION', value: 'BINTABLE', comment: 'Binary table extension' },\n { key: 'BITPIX', value: 8, comment: '8-bit bytes' },\n { key: 'NAXIS', value: 2, comment: 'Table axes' },\n { key: 'NAXIS1', value: rowSize, comment: 'Bytes per row' },\n { key: 'NAXIS2', value: rowCount, comment: 'Rows' },\n { key: 'PCOUNT', value: 0 },\n { key: 'GCOUNT', value: 1 },\n { key: 'TFIELDS', value: 1 },\n { key: 'TTYPE1', value: 'XISFCPLX' },\n { key: 'TFORM1', value: image.sampleFormat === 'Complex32' ? '1C' : '1M' },\n { key: 'EXTNAME', value: i === 0 ? 'XISF_COMPLEX' : `XISF_COMPLEX_${i}` },\n { key: 'XISFCPLX', value: true },\n { key: 'XISFSFMT', value: image.sampleFormat },\n { key: 'XISFWID', value: width },\n { key: 'XISFHEI', value: height },\n { key: 'XISFDEP', value: depth },\n { key: 'XISFCHN', value: image.channelCount },\n ...additionalCards,\n ],\n data,\n })\n continue\n }\n\n let bitpix: 8 | 16 | 32 | 64 | -32 | -64\n let bzero: number | bigint | undefined\n let data: Uint8Array\n\n switch (image.sampleFormat) {\n case 'UInt8':\n bitpix = 8\n data = createImageBytesFromArray(values as ArrayLike<number>, 8)\n break\n case 'UInt16': {\n bitpix = 16\n bzero = U16_BZERO\n const raw = Array.from(values as ArrayLike<number>, (v) => Number(v) - U16_BZERO)\n data = createImageBytesFromArray(raw, 16)\n break\n }\n case 'UInt32': {\n bitpix = 32\n bzero = U32_BZERO\n const raw = Array.from(values as ArrayLike<number>, (v) => Number(v) - U32_BZERO)\n data = createImageBytesFromArray(raw, 32)\n break\n }\n case 'UInt64': {\n bitpix = 64\n bzero = U64_BZERO\n const raw = Array.from(values as ArrayLike<bigint>, (v) => BigInt(v) - U64_BZERO)\n data = createImageBytesFromArray(raw, 64)\n break\n }\n case 'Float32':\n bitpix = -32\n data = createImageBytesFromArray(values as ArrayLike<number>, -32)\n break\n case 'Float64':\n bitpix = -64\n data = createImageBytesFromArray(values as ArrayLike<number>, -64)\n break\n default:\n throw new XISFConversionError(`Unsupported sample format: ${image.sampleFormat}`)\n }\n\n imageHDUs.push(\n createImageHDU({\n primary: i === 0,\n extensionType: 'IMAGE',\n width,\n height,\n depth,\n bitpix,\n data,\n bzero,\n bscale: 1,\n extname: i === 0 ? undefined : (image.id ?? `IMAGE_${i}`),\n additionalCards,\n }),\n )\n }\n\n const preservedLayout = readPreservedLayoutFromMetadata(xisf.unit.metadata)\n const preservedHDUs: Array<{ index: number; hdu: FITSWriteHDU }> = []\n if (preservedLayout) {\n for (const preserved of preservedLayout.nonImageHDUs) {\n preservedHDUs.push({\n index: preserved.index,\n hdu: toFITSWriteHDU(preserved, await decodeBase64(preserved.dataBase64)),\n })\n }\n }\n\n if (xisf.unit.images.length === 0) {\n if (preservedHDUs.length === 0) {\n throw new XISFConversionError('No images or preserved FITS HDUs found in XISF unit')\n }\n const ordered = preservedLayout\n ? preservedHDUs.sort((a, b) => a.index - b.index).map((item) => item.hdu)\n : preservedHDUs.map((item) => item.hdu)\n return writeFITS(ordered)\n }\n\n let hdus: FITSWriteHDU[] = imageHDUs\n if (preservedLayout && preservedLayout.imageSourceIndices.length === imageHDUs.length) {\n const byIndex = new Map<number, FITSWriteHDU>()\n for (let i = 0; i < imageHDUs.length; i++) {\n byIndex.set(preservedLayout.imageSourceIndices[i]!, imageHDUs[i]!)\n }\n for (const preserved of preservedHDUs) {\n byIndex.set(preserved.index, preserved.hdu)\n }\n const maxIndex = Math.max(...byIndex.keys())\n const ordered: FITSWriteHDU[] = []\n for (let i = 0; i <= maxIndex; i++) {\n const hdu = byIndex.get(i)\n if (hdu) ordered.push(hdu)\n }\n hdus = ordered\n } else if (preservedHDUs.length > 0) {\n hdus = [\n ...imageHDUs,\n ...preservedHDUs.sort((a, b) => a.index - b.index).map((item) => item.hdu),\n ]\n }\n\n const includeMeta = options?.includeXisfMetaExtension ?? true\n if (includeMeta) {\n const metaJson = new TextEncoder().encode(buildXISFMetaJSON(xisf))\n hdus.push(\n createImageHDU({\n primary: false,\n extensionType: 'IMAGE',\n width: metaJson.byteLength,\n height: 1,\n bitpix: 8,\n data: metaJson,\n extname: 'XISF_META',\n }),\n )\n }\n\n return writeFITS(hdus)\n}\n\nasync function collectImageFrames(image: Image): Promise<Array<number | bigint>> {\n const values: Array<number | bigint> = []\n const depth = image.depth\n for (let i = 0; i < depth; i++) {\n const frame = await image.getFrame(i)\n for (let p = 0; p < frame.length; p++) {\n const value = frame[p]!\n values.push(typeof value === 'bigint' ? value : Number(value))\n }\n }\n return values\n}\n\nasync function collectCanonicalUInt64Frames(image: Image): Promise<Array<bigint>> {\n const values: bigint[] = []\n for (let frameIndex = 0; frameIndex < image.depth; frameIndex++) {\n const frameInfo = image.frameOffsets[frameIndex]!\n let frameBuffer = frameInfo.buffers?.[0]\n if (!frameBuffer) {\n if (image.buffer) {\n frameBuffer = image.buffer.slice(frameInfo.begin, frameInfo.begin + image.frameLength)\n } else if (image.blob) {\n frameBuffer = await image.blob\n .slice(frameInfo.begin, frameInfo.begin + image.frameLength)\n .arrayBuffer()\n } else {\n throw new XISFConversionError('Image data source is unavailable for UInt64 conversion')\n }\n frameInfo.buffers = [frameBuffer]\n }\n\n const view = new DataView(frameBuffer)\n const count = frameBuffer.byteLength / 8\n for (let i = 0; i < count; i++) {\n values.push(view.getBigInt64(i * 8, false) + U64_BZERO)\n }\n }\n return values\n}\n\nfunction imageSampleFormatFromFITS(\n header: FITS['hdus'][number]['header'],\n image: Image,\n): XISFImage['sampleFormat'] {\n const bzero = image.bzero\n if (image.bitpix === 8) return 'UInt8'\n if (image.bitpix === 16 && bzero === U16_BZERO) return 'UInt16'\n if (image.bitpix === 32 && bzero === U32_BZERO) return 'UInt32'\n if (isCanonicalUInt64BITPIX64(header, image)) return 'UInt64'\n if (image.bitpix === -32) return 'Float32'\n if (image.bitpix === -64) return 'Float64'\n return 'Float64'\n}\n\nexport async function convertFitsToXisf(\n input: ArrayBuffer | Blob | FITS,\n options?: ConversionOptions & { distributed?: boolean; writeOptions?: XISFWriteOptions },\n): Promise<ArrayBuffer | { header: Uint8Array; blocks: Record<string, Uint8Array> }> {\n const strictValidation = isStrict(options)\n const writeOptions = options?.writeOptions\n const fits =\n input instanceof FITS\n ? input\n : FITS.fromArrayBuffer(await normalizeInputToArrayBuffer(input), {\n onWarning: strictValidation ? undefined : () => undefined,\n })\n\n const images: XISFImage[] = []\n const imageSourceIndices: number[] = []\n const preservedNonImageHDUs: PreservedHDU[] = []\n let restoredMeta: Partial<XISFUnit> = {}\n\n for (let i = 0; i < fits.hdus.length; i++) {\n const hdu = fits.hdus[i]!\n const header = hdu.header\n const extname = header.getString('EXTNAME', '')\n\n if (hdu.data && hdu.data instanceof BinaryTable && isHeaderTrue(header, 'XISFCPLX')) {\n const sampleFormat =\n header.getString('XISFSFMT', 'Complex32') === 'Complex64' ? 'Complex64' : 'Complex32'\n const width = header.getNumber('XISFWID')\n const height = header.getNumber('XISFHEI', 1)\n const depth = header.getNumber('XISFDEP', 1)\n const channelCount = header.getNumber('XISFCHN', 1)\n const rows = await hdu.data.getRows(0, hdu.data.rows)\n const rowObjects = rows as Array<Record<string, unknown>>\n const complexColumn = hdu.data.columns?.[0] ?? 'XISFCPLX'\n\n const components: number[] = []\n for (const row of rowObjects) {\n const pair = row[complexColumn]\n if (!Array.isArray(pair) || pair.length !== 2) {\n throw new XISFConversionError('Invalid complex payload in BINTABLE extension')\n }\n components.push(Number(pair[0]), Number(pair[1]))\n }\n\n images.push({\n id: extname || (i === 0 ? 'PRIMARY' : `IMAGE_${i}`),\n geometry: depth > 1 ? [width, height, depth] : [width, height],\n channelCount,\n sampleFormat,\n pixelStorage: 'Planar',\n colorSpace: 'Gray',\n dataBlock: {\n location: {\n type: 'attachment',\n position: 0,\n size: components.length * (sampleFormat === 'Complex32' ? 4 : 8),\n },\n byteOrder: 'little',\n },\n data: encodeComplexLittleEndian(components, sampleFormat),\n properties: [],\n tables: [],\n fitsKeywords: [],\n })\n imageSourceIndices.push(i)\n continue\n }\n\n if (!hdu.data || !(hdu.data instanceof Image)) {\n preservedNonImageHDUs.push(await toPreservedHDU(hdu, i))\n continue\n }\n\n if (extname === 'XISF_META') {\n const frame = await hdu.data.getFrame(0)\n const bytes = new Uint8Array(frame.length)\n for (let j = 0; j < frame.length; j++) {\n bytes[j] = Number(frame[j]!) & 0xff\n }\n try {\n const decoded = JSON.parse(new TextDecoder('utf-8').decode(bytes)) as Partial<XISFUnit>\n restoredMeta = decoded\n } catch {\n // ignore malformed metadata extension in relaxed conversion\n }\n continue\n }\n\n const sampleFormat = imageSampleFormatFromFITS(header, hdu.data)\n if (strictValidation && hdu.data.bitpix === 64 && sampleFormat !== 'UInt64') {\n throw new XISFConversionError(\n 'FITS BITPIX=64 without canonical UInt64 BZERO cannot be converted losslessly',\n )\n }\n const values =\n sampleFormat === 'UInt64'\n ? await collectCanonicalUInt64Frames(hdu.data)\n : await collectImageFrames(hdu.data)\n const data = encodeLittleEndian(values, sampleFormat)\n\n const fitsKeywords = header.getCards().map((card) => {\n return {\n name: card.key,\n value: formatFITSKeywordValue(card.value),\n comment: card.comment,\n }\n })\n\n const geometry: number[] = [hdu.data.width, hdu.data.height]\n if (hdu.data.depth > 1) {\n geometry.push(hdu.data.depth)\n }\n\n images.push({\n id: extname || (i === 0 ? 'PRIMARY' : `IMAGE_${i}`),\n geometry,\n channelCount: 1,\n sampleFormat,\n bounds: sampleFormat.startsWith('Float') ? [0, 1] : undefined,\n pixelStorage: 'Planar',\n colorSpace: 'Gray',\n dataBlock: {\n location: { type: 'attachment', position: 0, size: data.byteLength },\n byteOrder: 'little',\n },\n data,\n properties: [],\n tables: [],\n fitsKeywords,\n })\n imageSourceIndices.push(i)\n }\n\n if (images.length === 0) {\n if (preservedNonImageHDUs.length === 0) {\n throw new XISFConversionError('No convertible FITS image HDUs found')\n }\n }\n\n let metadata: XISFUnit['metadata'] = restoredMeta.metadata ?? [\n { id: 'XISF:CreatorApplication', type: 'String', value: 'fitsjs-ng conversion' },\n { id: 'XISF:CreationTime', type: 'TimePoint', value: new Date().toISOString() },\n ]\n if (preservedNonImageHDUs.length > 0) {\n const layout: PreservedHDULayout = {\n imageSourceIndices,\n nonImageHDUs: preservedNonImageHDUs,\n }\n metadata = upsertMetadataString(\n metadata,\n FITS_PRESERVED_LAYOUT_PROPERTY,\n JSON.stringify(layout),\n )\n }\n\n const unit: XISFUnit = {\n metadata,\n images,\n standaloneProperties: restoredMeta.standaloneProperties ?? [],\n standaloneTables: restoredMeta.standaloneTables ?? [],\n version: '1.0',\n signature: { present: false, verified: true },\n }\n\n if (options?.distributed) {\n return XISFWriter.toDistributed(unit, writeOptions)\n }\n return XISFWriter.toMonolithic(unit, writeOptions)\n}\n","import { FITSError } from '../core/errors'\n\nexport class SERError extends FITSError {\n constructor(message: string) {\n super(message)\n this.name = 'SERError'\n }\n}\n\nexport class SERParseError extends SERError {\n constructor(message: string) {\n super(message)\n this.name = 'SERParseError'\n }\n}\n\nexport class SERValidationError extends SERError {\n constructor(message: string) {\n super(message)\n this.name = 'SERValidationError'\n }\n}\n\nexport class SERConversionError extends SERError {\n constructor(message: string) {\n super(message)\n this.name = 'SERConversionError'\n }\n}\n","import type { XISFWriteOptions } from '../xisf/xisf-types'\n\nexport type SERColorId = 0 | 8 | 9 | 10 | 11 | 16 | 17 | 18 | 19 | 100 | 101\n\nexport type SERByteOrder = 'little' | 'big'\n\nexport type SEREndiannessPolicy = 'compat' | 'spec' | 'auto'\n\nexport type SERSampleArray = Uint8Array | Uint16Array\n\nexport interface SERWarning {\n code: string\n message: string\n}\n\nexport type SERWarningCallback = (warning: SERWarning) => void\n\nexport interface SERReadOptions {\n strictValidation?: boolean\n endiannessPolicy?: SEREndiannessPolicy\n onWarning?: SERWarningCallback\n}\n\nexport interface SERHeader {\n fileId: string\n luId: number\n colorId: SERColorId\n littleEndianFlag: number\n byteOrder: SERByteOrder\n width: number\n height: number\n pixelDepth: number\n frameCount: number\n observer: string\n instrument: string\n telescope: string\n startTime: bigint\n startTimeUtc: bigint\n channelCount: number\n bytesPerSample: 1 | 2\n frameByteLength: number\n}\n\nexport interface SERFrameInfo {\n index: number\n offset: number\n byteLength: number\n timestamp?: bigint\n}\n\nexport interface SERFrameData {\n info: SERFrameInfo\n raw: Uint8Array\n samples: SERSampleArray\n width: number\n height: number\n channelCount: number\n interleaved: boolean\n colorId: SERColorId\n pixelDepth: number\n byteOrder: SERByteOrder\n}\n\nexport interface SERParsedFile {\n header: SERHeader\n frameInfos: SERFrameInfo[]\n timestamps: bigint[]\n timestampsPresent: boolean\n buffer?: ArrayBuffer\n blob?: Blob\n}\n\nexport interface SERWriteHeader {\n luId?: number\n colorId: SERColorId\n width: number\n height: number\n pixelDepth: number\n frameCount?: number\n observer?: string\n instrument?: string\n telescope?: string\n startTime?: bigint | number\n startTimeUtc?: bigint | number\n littleEndian?: boolean\n}\n\nexport interface SERWriteInput {\n header: SERWriteHeader\n frames: Uint8Array[]\n timestamps?: Array<bigint | number>\n}\n\nexport interface SERWriteOptions {\n strictValidation?: boolean\n endiannessPolicy?: Exclude<SEREndiannessPolicy, 'auto'>\n onWarning?: SERWarningCallback\n}\n\nexport interface SERConversionOptions {\n strictValidation?: boolean\n relaxed?: boolean\n endiannessPolicy?: SEREndiannessPolicy\n onWarning?: SERWarningCallback\n}\n\nexport interface SerToFitsOptions extends SERConversionOptions {\n includeTimestampExtension?: boolean\n layout?: 'cube' | 'multi-hdu'\n}\n\nexport interface FitsToSerOptions extends SERConversionOptions {\n sourceLayout?: 'auto' | 'cube' | 'multi-hdu'\n}\n\nexport interface SerToXisfOptions extends SERConversionOptions {\n distributed?: boolean\n writeOptions?: XISFWriteOptions\n}\n\nexport interface XisfToSerOptions extends SERConversionOptions {\n imageIndex?: number\n}\n\nexport const SER_HEADER_LENGTH = 178\nexport const SER_FILE_ID = 'LUCAM-RECORDER'\nexport const SER_SUPPORTED_COLOR_IDS: SERColorId[] = [0, 8, 9, 10, 11, 16, 17, 18, 19, 100, 101]\n\nexport const SER_COLOR_CHANNELS: Record<SERColorId, 1 | 3> = {\n 0: 1,\n 8: 1,\n 9: 1,\n 10: 1,\n 11: 1,\n 16: 1,\n 17: 1,\n 18: 1,\n 19: 1,\n 100: 3,\n 101: 3,\n}\n\nexport const SER_BAYER_OR_CMY_PATTERN: Partial<Record<SERColorId, string>> = {\n 8: 'RGGB',\n 9: 'GRBG',\n 10: 'GBRG',\n 11: 'BGGR',\n 16: 'CYYM',\n 17: 'YCMY',\n 18: 'YMCY',\n 19: 'MYYC',\n}\n\nexport const SER_TICKS_AT_UNIX_EPOCH = 621355968000000000n\n","import {\n SER_COLOR_CHANNELS,\n SER_FILE_ID,\n SER_HEADER_LENGTH,\n SER_SUPPORTED_COLOR_IDS,\n type SERByteOrder,\n type SERColorId,\n type SERFrameInfo,\n type SERParsedFile,\n type SERReadOptions,\n type SERWarning,\n} from './ser-types'\nimport { SERParseError, SERValidationError } from './ser-errors'\n\nconst NOOP_WARNING = (_warning: SERWarning): void => undefined\n\ninterface ParserDefaults {\n strictValidation: boolean\n endiannessPolicy: NonNullable<SERReadOptions['endiannessPolicy']>\n onWarning: NonNullable<SERReadOptions['onWarning']>\n}\n\nfunction withDefaults(options?: SERReadOptions): ParserDefaults {\n return {\n strictValidation: options?.strictValidation ?? true,\n endiannessPolicy: options?.endiannessPolicy ?? 'compat',\n onWarning: options?.onWarning ?? NOOP_WARNING,\n }\n}\n\nfunction warn(options: ParserDefaults, code: string, message: string): void {\n options.onWarning({ code, message })\n}\n\nfunction readFixedAscii(bytes: Uint8Array): string {\n let end = bytes.length\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === 0) {\n end = i\n break\n }\n }\n return new TextDecoder('ascii').decode(bytes.slice(0, end)).trim()\n}\n\nfunction isSupportedColorId(value: number): value is SERColorId {\n return SER_SUPPORTED_COLOR_IDS.includes(value as SERColorId)\n}\n\nfunction deriveByteOrderFromFlag(\n littleEndianFlag: number,\n policy: ParserDefaults['endiannessPolicy'],\n frameBytes: Uint8Array | null,\n): SERByteOrder {\n if (policy === 'spec') {\n return littleEndianFlag !== 0 ? 'little' : 'big'\n }\n\n if (policy === 'compat') {\n return littleEndianFlag === 0 ? 'little' : 'big'\n }\n\n // policy === 'auto'\n const compat = littleEndianFlag === 0 ? 'little' : 'big'\n const spec = littleEndianFlag !== 0 ? 'little' : 'big'\n if (!frameBytes || frameBytes.byteLength < 4) {\n return compat\n }\n\n const score = (endian: SERByteOrder): number => {\n const view = new DataView(frameBytes.buffer, frameBytes.byteOffset, frameBytes.byteLength)\n const little = endian === 'little'\n const sampleCount = Math.min(4096, Math.floor(frameBytes.byteLength / 2))\n if (sampleCount <= 0) return 0\n\n let multiplesOf256 = 0\n let prev = view.getUint16(0, little)\n let smoothness = 0\n const seenLowBytes = new Set<number>()\n\n for (let i = 0; i < sampleCount; i++) {\n const value = view.getUint16(i * 2, little)\n if (value % 256 === 0) multiplesOf256++\n seenLowBytes.add(value & 0xff)\n smoothness += Math.abs(value - prev)\n prev = value\n }\n\n const uniqueness = seenLowBytes.size / 256\n const nonMultipleRatio = 1 - multiplesOf256 / sampleCount\n const smoothRatio = 1 / (1 + smoothness / sampleCount)\n return nonMultipleRatio * 0.5 + uniqueness * 0.4 + smoothRatio * 0.1\n }\n\n const compatScore = score(compat)\n const specScore = score(spec)\n return compatScore >= specScore ? compat : spec\n}\n\nfunction resolveFrameCountRelaxed(\n declaredFrameCount: number,\n availablePayloadBytes: number,\n frameByteLength: number,\n): number {\n if (frameByteLength <= 0) return 0\n if (declaredFrameCount <= 0) return 0\n\n const byFrameOnly = Math.floor(availablePayloadBytes / frameByteLength)\n const byFrameAndTs = Math.floor(availablePayloadBytes / (frameByteLength + 8))\n return Math.max(0, Math.min(declaredFrameCount, Math.max(byFrameAndTs, 1), byFrameOnly))\n}\n\nfunction parseFromArrayBuffer(\n buffer: ArrayBuffer,\n options?: SERReadOptions,\n sourceBlob?: Blob,\n): SERParsedFile {\n const cfg = withDefaults(options)\n const bytes = new Uint8Array(buffer)\n if (bytes.byteLength < SER_HEADER_LENGTH) {\n throw new SERParseError(\n `SER buffer is too short: expected at least ${SER_HEADER_LENGTH} bytes, got ${bytes.byteLength}`,\n )\n }\n\n const view = new DataView(buffer)\n const fileId = readFixedAscii(bytes.slice(0, 14))\n if (fileId !== SER_FILE_ID) {\n throw new SERParseError(`Invalid SER FileID: expected \"${SER_FILE_ID}\", got \"${fileId}\"`)\n }\n\n const luId = view.getInt32(14, true)\n const colorIdRaw = view.getInt32(18, true)\n const littleEndianFlag = view.getInt32(22, true)\n const width = view.getInt32(26, true)\n const height = view.getInt32(30, true)\n const pixelDepth = view.getInt32(34, true)\n const declaredFrameCount = view.getInt32(38, true)\n const observer = readFixedAscii(bytes.slice(42, 82))\n const instrument = readFixedAscii(bytes.slice(82, 122))\n const telescope = readFixedAscii(bytes.slice(122, 162))\n const startTime = view.getBigUint64(162, true)\n const startTimeUtc = view.getBigUint64(170, true)\n\n if (!Number.isInteger(width) || width <= 0) {\n throw new SERValidationError(`Invalid SER width: ${width}`)\n }\n if (!Number.isInteger(height) || height <= 0) {\n throw new SERValidationError(`Invalid SER height: ${height}`)\n }\n if (!Number.isInteger(pixelDepth) || pixelDepth < 1 || pixelDepth > 16) {\n throw new SERValidationError(`Invalid SER pixel depth: ${pixelDepth}`)\n }\n if (!Number.isInteger(declaredFrameCount) || declaredFrameCount < 0) {\n throw new SERValidationError(`Invalid SER frame count: ${declaredFrameCount}`)\n }\n\n if (!isSupportedColorId(colorIdRaw)) {\n const message = `Unsupported SER color ID: ${colorIdRaw}`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'unsupported_color_id', `${message}; falling back to monochrome (0)`)\n }\n\n const colorId = (isSupportedColorId(colorIdRaw) ? colorIdRaw : 0) as SERColorId\n const channelCount = SER_COLOR_CHANNELS[colorId]\n const bytesPerSample = (pixelDepth <= 8 ? 1 : 2) as 1 | 2\n const frameByteLength = width * height * channelCount * bytesPerSample\n\n if (!Number.isSafeInteger(frameByteLength) || frameByteLength <= 0) {\n throw new SERValidationError(`Invalid SER frame byte length: ${frameByteLength}`)\n }\n\n const availablePayloadBytes = bytes.byteLength - SER_HEADER_LENGTH\n let frameCount = declaredFrameCount\n\n if (frameCount * frameByteLength > availablePayloadBytes) {\n const message = `SER frame count exceeds payload capacity (declared=${frameCount}, frameBytes=${frameByteLength}, payload=${availablePayloadBytes})`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n const fixedFrameCount = resolveFrameCountRelaxed(\n frameCount,\n availablePayloadBytes,\n frameByteLength,\n )\n warn(cfg, 'frame_count_adjusted', `${message}; adjusted to ${fixedFrameCount}`)\n frameCount = fixedFrameCount\n }\n\n if (frameCount === 0) {\n warn(cfg, 'empty_sequence', 'SER sequence has zero frames')\n }\n\n const firstFrameBytes =\n frameCount > 0\n ? bytes.slice(SER_HEADER_LENGTH, SER_HEADER_LENGTH + Math.min(frameByteLength, 8192))\n : null\n const byteOrder = deriveByteOrderFromFlag(littleEndianFlag, cfg.endiannessPolicy, firstFrameBytes)\n\n const dataPayloadLength = frameCount * frameByteLength\n const trailerStart = SER_HEADER_LENGTH + dataPayloadLength\n const trailerLength = bytes.byteLength - trailerStart\n\n let timestampsPresent = false\n const timestamps: bigint[] = []\n if (frameCount > 0 && trailerLength >= frameCount * 8) {\n timestampsPresent = true\n const tsView = new DataView(buffer, trailerStart, frameCount * 8)\n for (let i = 0; i < frameCount; i++) {\n timestamps.push(tsView.getBigUint64(i * 8, true))\n }\n\n let ordered = true\n for (let i = 1; i < timestamps.length; i++) {\n if (timestamps[i]! < timestamps[i - 1]!) {\n ordered = false\n break\n }\n }\n if (!ordered) {\n warn(cfg, 'timestamps_not_ordered', 'SER frame timestamps are not in ascending order')\n }\n\n if (trailerLength !== frameCount * 8) {\n const message = `SER trailer contains extra bytes (${trailerLength - frameCount * 8}) beyond timestamps`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'extra_trailer_bytes', message)\n }\n } else if (trailerLength > 0) {\n const message = `SER trailer has ${trailerLength} bytes but expected 0 or ${frameCount * 8}`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'truncated_timestamps', message)\n }\n\n const frameInfos: SERFrameInfo[] = []\n for (let i = 0; i < frameCount; i++) {\n frameInfos.push({\n index: i,\n offset: SER_HEADER_LENGTH + i * frameByteLength,\n byteLength: frameByteLength,\n timestamp: timestamps[i],\n })\n }\n\n return {\n header: {\n fileId,\n luId,\n colorId,\n littleEndianFlag,\n byteOrder,\n width,\n height,\n pixelDepth,\n frameCount,\n observer,\n instrument,\n telescope,\n startTime,\n startTimeUtc,\n channelCount,\n bytesPerSample,\n frameByteLength,\n },\n frameInfos,\n timestamps,\n timestampsPresent,\n buffer,\n blob: sourceBlob,\n }\n}\n\nexport function parseSERBuffer(buffer: ArrayBuffer, options?: SERReadOptions): SERParsedFile {\n return parseFromArrayBuffer(buffer, options)\n}\n\nexport async function parseSERBlob(blob: Blob, options?: SERReadOptions): Promise<SERParsedFile> {\n const buffer = await blob.arrayBuffer()\n return parseFromArrayBuffer(buffer, options, blob)\n}\n","import { SERParseError, SERValidationError } from './ser-errors'\nimport { parseSERBlob, parseSERBuffer } from './ser-parser'\nimport {\n SER_BAYER_OR_CMY_PATTERN,\n SER_TICKS_AT_UNIX_EPOCH,\n type SERByteOrder,\n type SERColorId,\n type SERFrameData,\n type SERFrameInfo,\n type SERParsedFile,\n type SERReadOptions,\n type SERSampleArray,\n} from './ser-types'\n\ninterface SERFrameReadOptions {\n asRGB?: boolean\n}\n\nfunction decodeFrameSamples(\n raw: Uint8Array,\n bytesPerSample: 1 | 2,\n byteOrder: SERByteOrder,\n): SERSampleArray {\n if (bytesPerSample === 1) {\n return raw\n }\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength)\n const samples = new Uint16Array(raw.byteLength / 2)\n const little = byteOrder === 'little'\n for (let i = 0; i < samples.length; i++) {\n samples[i] = view.getUint16(i * 2, little)\n }\n return samples\n}\n\nfunction getCfaPattern(colorId: SERColorId): string | undefined {\n return SER_BAYER_OR_CMY_PATTERN[colorId]\n}\n\nfunction sampleAt(samples: SERSampleArray, x: number, y: number, width: number): number {\n return Number(samples[y * width + x] ?? 0)\n}\n\nfunction rgbChannelsForSymbol(symbol: string): [boolean, boolean, boolean] {\n switch (symbol) {\n case 'R':\n return [true, false, false]\n case 'G':\n return [false, true, false]\n case 'B':\n return [false, false, true]\n case 'C':\n return [false, true, true]\n case 'M':\n return [true, false, true]\n case 'Y':\n return [true, true, false]\n case 'W':\n return [true, true, true]\n default:\n return [false, false, false]\n }\n}\n\nfunction decodeCfaToRGB(\n samples: SERSampleArray,\n width: number,\n height: number,\n pattern: string,\n bytesPerSample: 1 | 2,\n): SERSampleArray {\n const out =\n bytesPerSample === 1 ? new Uint8Array(width * height * 3) : new Uint16Array(width * height * 3)\n\n const symbolAt = (x: number, y: number): string => pattern[(y % 2) * 2 + (x % 2)] ?? 'R'\n\n const nearest = (x: number, y: number, channel: 0 | 1 | 2): number => {\n const maxRadius = 3\n for (let radius = 0; radius <= maxRadius; radius++) {\n const minX = Math.max(0, x - radius)\n const maxX = Math.min(width - 1, x + radius)\n const minY = Math.max(0, y - radius)\n const maxY = Math.min(height - 1, y + radius)\n\n for (let yy = minY; yy <= maxY; yy++) {\n for (let xx = minX; xx <= maxX; xx++) {\n const [hasR, hasG, hasB] = rgbChannelsForSymbol(symbolAt(xx, yy))\n const hasChannel = channel === 0 ? hasR : channel === 1 ? hasG : hasB\n if (hasChannel) {\n return sampleAt(samples, xx, yy, width)\n }\n }\n }\n }\n return sampleAt(samples, x, y, width)\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 3\n const symbol = symbolAt(x, y)\n const [hasR, hasG, hasB] = rgbChannelsForSymbol(symbol)\n out[idx] = hasR ? sampleAt(samples, x, y, width) : nearest(x, y, 0)\n out[idx + 1] = hasG ? sampleAt(samples, x, y, width) : nearest(x, y, 1)\n out[idx + 2] = hasB ? sampleAt(samples, x, y, width) : nearest(x, y, 2)\n }\n }\n\n return out\n}\n\nexport class SER {\n readonly parsed: SERParsedFile\n\n private constructor(parsed: SERParsedFile) {\n this.parsed = parsed\n }\n\n static fromArrayBuffer(buffer: ArrayBuffer, options?: SERReadOptions): SER {\n return new SER(parseSERBuffer(buffer, options))\n }\n\n static async fromBlob(blob: Blob, options?: SERReadOptions): Promise<SER> {\n return new SER(await parseSERBlob(blob, options))\n }\n\n static async fromURL(\n url: string,\n options?: SERReadOptions & { requestInit?: RequestInit },\n ): Promise<SER> {\n const response = await fetch(url, options?.requestInit)\n if (!response.ok) {\n throw new SERParseError(`Failed to fetch SER file: ${response.status} ${response.statusText}`)\n }\n const buffer = await response.arrayBuffer()\n return SER.fromArrayBuffer(buffer, options)\n }\n\n static fromNodeBuffer(\n nodeBuffer: { buffer: ArrayBuffer; byteOffset: number; byteLength: number },\n options?: SERReadOptions,\n ): SER {\n const buffer = nodeBuffer.buffer.slice(\n nodeBuffer.byteOffset,\n nodeBuffer.byteOffset + nodeBuffer.byteLength,\n )\n return SER.fromArrayBuffer(buffer, options)\n }\n\n getHeader() {\n return this.parsed.header\n }\n\n getFrameCount(): number {\n return this.parsed.header.frameCount\n }\n\n getFrameInfo(index: number): SERFrameInfo {\n const info = this.parsed.frameInfos[index]\n if (!info) {\n throw new SERValidationError(`Frame index out of range: ${index}`)\n }\n return info\n }\n\n getTimestamp(index: number): bigint | undefined {\n return this.getFrameInfo(index).timestamp\n }\n\n getTimestampDate(index: number): Date | undefined {\n const ts = this.getTimestamp(index)\n if (ts === undefined) return undefined\n const unixTicks = ts - SER_TICKS_AT_UNIX_EPOCH\n const ms = Number(unixTicks / 10000n)\n return new Date(ms)\n }\n\n getDurationTicks(): bigint | undefined {\n if (this.parsed.timestamps.length < 2) return undefined\n const first = this.parsed.timestamps[0]!\n const last = this.parsed.timestamps[this.parsed.timestamps.length - 1]!\n if (last < first) return undefined\n return last - first\n }\n\n getDurationSeconds(): number | undefined {\n const ticks = this.getDurationTicks()\n if (ticks === undefined) return undefined\n return Number(ticks) / 10_000_000\n }\n\n getEstimatedFPS(): number | undefined {\n const duration = this.getDurationSeconds()\n const frameCount = this.getFrameCount()\n if (!duration || duration <= 0 || frameCount < 2) return undefined\n return (frameCount - 1) / duration\n }\n\n private readFrameRawBytes(info: SERFrameInfo): Uint8Array {\n if (!this.parsed.buffer) {\n throw new SERParseError('SER source buffer is unavailable')\n }\n return new Uint8Array(this.parsed.buffer.slice(info.offset, info.offset + info.byteLength))\n }\n\n private samplesToRGB(samples: SERSampleArray, colorId: SERColorId): SERSampleArray {\n const { width, height, bytesPerSample } = this.parsed.header\n const framePixels = width * height\n\n if (colorId === 100 || colorId === 101) {\n const out =\n bytesPerSample === 1 ? new Uint8Array(framePixels * 3) : new Uint16Array(framePixels * 3)\n for (let i = 0; i < framePixels; i++) {\n const s = i * 3\n if (colorId === 100) {\n out[s] = samples[s] ?? 0\n out[s + 1] = samples[s + 1] ?? 0\n out[s + 2] = samples[s + 2] ?? 0\n } else {\n out[s] = samples[s + 2] ?? 0\n out[s + 1] = samples[s + 1] ?? 0\n out[s + 2] = samples[s] ?? 0\n }\n }\n return out\n }\n\n if (colorId === 0) {\n const out =\n bytesPerSample === 1 ? new Uint8Array(framePixels * 3) : new Uint16Array(framePixels * 3)\n for (let i = 0; i < framePixels; i++) {\n const value = Number(samples[i] ?? 0)\n const s = i * 3\n out[s] = value\n out[s + 1] = value\n out[s + 2] = value\n }\n return out\n }\n\n const pattern = getCfaPattern(colorId)\n if (!pattern) {\n throw new SERValidationError(`No RGB decode helper available for color ID ${colorId}`)\n }\n return decodeCfaToRGB(samples, width, height, pattern, bytesPerSample)\n }\n\n getFrame(index: number, options?: SERFrameReadOptions): SERFrameData {\n const info = this.getFrameInfo(index)\n const raw = this.readFrameRawBytes(info)\n const samples = decodeFrameSamples(\n raw,\n this.parsed.header.bytesPerSample,\n this.parsed.header.byteOrder,\n )\n const frameSamples = options?.asRGB\n ? this.samplesToRGB(samples, this.parsed.header.colorId)\n : samples\n const channelCount = options?.asRGB ? 3 : this.parsed.header.channelCount\n\n return {\n info,\n raw,\n samples: frameSamples,\n width: this.parsed.header.width,\n height: this.parsed.header.height,\n channelCount,\n interleaved: channelCount > 1,\n colorId: this.parsed.header.colorId,\n pixelDepth: this.parsed.header.pixelDepth,\n byteOrder: this.parsed.header.byteOrder,\n }\n }\n\n getFrameRGB(index: number): SERSampleArray {\n const frame = this.getFrame(index)\n return this.samplesToRGB(frame.samples, this.parsed.header.colorId)\n }\n\n getFrames(startFrame: number, count: number, options?: SERFrameReadOptions): SERFrameData[] {\n const frames: SERFrameData[] = []\n for (let i = 0; i < count; i++) {\n frames.push(this.getFrame(startFrame + i, options))\n }\n return frames\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<SERFrameData> {\n for (let i = 0; i < this.parsed.header.frameCount; i++) {\n yield this.getFrame(i)\n }\n }\n}\n","import {\n SER_COLOR_CHANNELS,\n SER_FILE_ID,\n SER_HEADER_LENGTH,\n type SERWarning,\n type SERWriteInput,\n type SERWriteOptions,\n} from './ser-types'\nimport { SERValidationError } from './ser-errors'\n\nconst NOOP_WARNING = (_warning: SERWarning): void => undefined\n\ninterface WriterDefaults {\n strictValidation: boolean\n endiannessPolicy: NonNullable<SERWriteOptions['endiannessPolicy']>\n onWarning: NonNullable<SERWriteOptions['onWarning']>\n}\n\nfunction withDefaults(options?: SERWriteOptions): WriterDefaults {\n return {\n strictValidation: options?.strictValidation ?? true,\n endiannessPolicy: options?.endiannessPolicy ?? 'compat',\n onWarning: options?.onWarning ?? NOOP_WARNING,\n }\n}\n\nfunction warn(options: WriterDefaults, code: string, message: string): void {\n options.onWarning({ code, message })\n}\n\nfunction encodeFixedAscii(target: Uint8Array, offset: number, length: number, value: string): void {\n const encoder = new TextEncoder()\n const encoded = encoder.encode(value)\n for (let i = 0; i < length; i++) {\n target[offset + i] = encoded[i] ?? 0\n }\n}\n\nfunction asBigInt(value: bigint | number | undefined, fallback: bigint): bigint {\n if (value === undefined) return fallback\n return typeof value === 'bigint' ? value : BigInt(Math.trunc(value))\n}\n\nfunction encodeLittleEndianFlag(\n littleEndian: boolean,\n policy: WriterDefaults['endiannessPolicy'],\n): number {\n if (policy === 'spec') {\n return littleEndian ? 1 : 0\n }\n return littleEndian ? 0 : 1\n}\n\nfunction normalizeFrameData(\n frame: Uint8Array,\n expectedLength: number,\n cfg: WriterDefaults,\n index: number,\n): Uint8Array {\n if (frame.byteLength === expectedLength) {\n return frame\n }\n\n const message = `Frame ${index} byte length mismatch: expected ${expectedLength}, got ${frame.byteLength}`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'frame_length_adjusted', `${message}; applying truncation/padding`)\n\n const out = new Uint8Array(expectedLength)\n out.set(frame.subarray(0, Math.min(frame.byteLength, expectedLength)))\n return out\n}\n\nexport function writeSER(input: SERWriteInput, options?: SERWriteOptions): ArrayBuffer {\n const cfg = withDefaults(options)\n const header = input.header\n const frameCount = header.frameCount ?? input.frames.length\n\n if (!Number.isInteger(frameCount) || frameCount < 0) {\n throw new SERValidationError(`Invalid SER frame count: ${frameCount}`)\n }\n if (!Number.isInteger(header.width) || header.width <= 0) {\n throw new SERValidationError(`Invalid SER width: ${header.width}`)\n }\n if (!Number.isInteger(header.height) || header.height <= 0) {\n throw new SERValidationError(`Invalid SER height: ${header.height}`)\n }\n if (!Number.isInteger(header.pixelDepth) || header.pixelDepth < 1 || header.pixelDepth > 16) {\n throw new SERValidationError(`Invalid SER pixel depth: ${header.pixelDepth}`)\n }\n\n const channelCount = SER_COLOR_CHANNELS[header.colorId]\n if (!channelCount) {\n throw new SERValidationError(`Unsupported SER color ID: ${header.colorId}`)\n }\n\n if (input.frames.length !== frameCount) {\n const message = `SER frame array length mismatch: header frameCount=${frameCount}, frames=${input.frames.length}`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'frame_count_mismatch', message)\n }\n\n const bytesPerSample = header.pixelDepth <= 8 ? 1 : 2\n const expectedFrameLength = header.width * header.height * channelCount * bytesPerSample\n if (!Number.isSafeInteger(expectedFrameLength) || expectedFrameLength <= 0) {\n throw new SERValidationError(`Invalid computed frame length: ${expectedFrameLength}`)\n }\n\n const normalizedFrames: Uint8Array[] = []\n for (let i = 0; i < frameCount; i++) {\n const frame = input.frames[i] ?? new Uint8Array(0)\n normalizedFrames.push(normalizeFrameData(frame, expectedFrameLength, cfg, i))\n }\n\n let timestamps: bigint[] | undefined\n if (input.timestamps) {\n if (input.timestamps.length !== frameCount) {\n const message = `Timestamp count mismatch: expected ${frameCount}, got ${input.timestamps.length}`\n if (cfg.strictValidation) {\n throw new SERValidationError(message)\n }\n warn(cfg, 'timestamp_count_mismatch', message)\n }\n timestamps = new Array(frameCount)\n for (let i = 0; i < frameCount; i++) {\n timestamps[i] = asBigInt(input.timestamps[i], 0n)\n }\n }\n\n const payloadSize = frameCount * expectedFrameLength\n const trailerSize = timestamps ? frameCount * 8 : 0\n const totalSize = SER_HEADER_LENGTH + payloadSize + trailerSize\n const out = new Uint8Array(totalSize)\n const view = new DataView(out.buffer)\n\n encodeFixedAscii(out, 0, 14, SER_FILE_ID)\n view.setInt32(14, header.luId ?? 0, true)\n view.setInt32(18, header.colorId, true)\n\n const littleEndian = header.littleEndian ?? true\n view.setInt32(22, encodeLittleEndianFlag(littleEndian, cfg.endiannessPolicy), true)\n\n view.setInt32(26, header.width, true)\n view.setInt32(30, header.height, true)\n view.setInt32(34, header.pixelDepth, true)\n view.setInt32(38, frameCount, true)\n\n encodeFixedAscii(out, 42, 40, header.observer ?? '')\n encodeFixedAscii(out, 82, 40, header.instrument ?? '')\n encodeFixedAscii(out, 122, 40, header.telescope ?? '')\n\n view.setBigUint64(162, asBigInt(header.startTime, 0n), true)\n view.setBigUint64(170, asBigInt(header.startTimeUtc, 0n), true)\n\n let offset = SER_HEADER_LENGTH\n for (const frame of normalizedFrames) {\n out.set(frame, offset)\n offset += expectedFrameLength\n }\n\n if (timestamps) {\n for (let i = 0; i < timestamps.length; i++) {\n view.setBigUint64(offset + i * 8, timestamps[i]!, true)\n }\n }\n\n return out.buffer\n}\n","import { FITS } from '../fits'\nimport { Image } from '../fits/image'\nimport { BinaryTable } from '../fits/binary-table'\nimport { XISF } from '../xisf'\nimport { XISFWriter } from '../xisf/xisf-writer'\nimport {\n createImageBytesFromArray,\n createImageHDU,\n type FITSWriteHDU,\n writeFITS,\n} from '../fits/fits-writer'\nimport { writeSER } from './ser-writer'\nimport { SER } from './'\nimport { SERConversionError } from './ser-errors'\nimport {\n SER_BAYER_OR_CMY_PATTERN,\n SER_COLOR_CHANNELS,\n type FitsToSerOptions,\n type SERColorId,\n type SERConversionOptions,\n type SERFrameData,\n type SerToFitsOptions,\n type SerToXisfOptions,\n type XisfToSerOptions,\n} from './ser-types'\nimport type { XISFImage, XISFProperty, XISFUnit } from '../xisf/xisf-types'\n\nconst SER_COLOR_CARD = 'SERCOLOR'\nconst SER_PIXEL_DEPTH_CARD = 'SERPDEP'\nconst SER_FRAME_COUNT_CARD = 'SERFRMS'\nconst SER_CHANNELS_CARD = 'SERCHANS'\nconst SER_CHANNEL_ORDER_CARD = 'SERCHORD'\nconst SER_LUID_CARD = 'SERLUID'\nconst SER_BYTE_ORDER_CARD = 'SERBYORD'\nconst SER_OBSERVER_CARD = 'SEROBS'\nconst SER_INSTRUMENT_CARD = 'SERINST'\nconst SER_TELESCOPE_CARD = 'SERTEL'\nconst SER_START_TIME_CARD = 'SERSTRT'\nconst SER_START_TIME_UTC_CARD = 'SERSTUTC'\nconst SER_CFA_CARD = 'SERCFAP'\nconst SER_FRAME_CARD = 'SERFRAME'\nconst SER_TS_EXTNAME = 'SER_TSTP'\n\nconst U16_BZERO = 32768\n\nfunction isStrict(options?: SERConversionOptions): boolean {\n return options?.strictValidation ?? options?.relaxed !== true\n}\n\nfunction toArrayBufferLike(input: ArrayBuffer | Blob): Promise<ArrayBuffer> {\n if (input instanceof ArrayBuffer) return Promise.resolve(input)\n return input.arrayBuffer()\n}\n\nfunction asSER(input: ArrayBuffer | Blob | SER, options?: SERConversionOptions): Promise<SER> {\n if (input instanceof SER) return Promise.resolve(input)\n if (input instanceof ArrayBuffer) {\n return Promise.resolve(\n SER.fromArrayBuffer(input, {\n strictValidation: isStrict(options),\n endiannessPolicy: options?.endiannessPolicy,\n onWarning: options?.onWarning,\n }),\n )\n }\n return SER.fromBlob(input, {\n strictValidation: isStrict(options),\n endiannessPolicy: options?.endiannessPolicy,\n onWarning: options?.onWarning,\n })\n}\n\nfunction asFits(input: ArrayBuffer | Blob | FITS): Promise<FITS> {\n if (input instanceof FITS) return Promise.resolve(input)\n if (input instanceof ArrayBuffer) {\n return Promise.resolve(FITS.fromArrayBuffer(input))\n }\n return toArrayBufferLike(input).then((buffer) => FITS.fromArrayBuffer(buffer))\n}\n\nfunction toBigInt(value: unknown): bigint | null {\n if (typeof value === 'bigint') return value\n if (typeof value === 'number' && Number.isFinite(value)) return BigInt(Math.trunc(value))\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n try {\n return BigInt(trimmed)\n } catch {\n return null\n }\n }\n return null\n}\n\nfunction getMetadata(unit: XISFUnit, id: string): XISFProperty | undefined {\n return unit.metadata.find((item) => item.id === id)\n}\n\nfunction getImageProperty(image: XISFImage, id: string): XISFProperty | undefined {\n return image.properties.find((item) => item.id === id)\n}\n\nfunction getSerMetadataScalar(unit: XISFUnit, image: XISFImage, id: string): unknown {\n const imageProperty = getImageProperty(image, id)\n if (imageProperty?.value !== undefined) {\n return imageProperty.value\n }\n return getMetadata(unit, id)?.value\n}\n\nfunction getSerMetadataBigIntArray(unit: XISFUnit, image: XISFImage, id: string): bigint[] {\n const value = getSerMetadataScalar(unit, image, id)\n if (!value) return []\n\n if (ArrayBuffer.isView(value)) {\n const arr = value as unknown as ArrayLike<number | bigint>\n const out: bigint[] = []\n for (let i = 0; i < arr.length; i++) {\n out.push(BigInt(arr[i]!))\n }\n return out\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toBigInt(item)).filter((item): item is bigint => item !== null)\n }\n\n return []\n}\n\nfunction emitConversionWarning(\n options: SERConversionOptions | undefined,\n code: string,\n message: string,\n): void {\n options?.onWarning?.({ code, message })\n}\n\nfunction pushSERMetadataProperties(\n unitMetadata: XISFUnit['metadata'],\n ser: SER,\n): XISFUnit['metadata'] {\n const header = ser.getHeader()\n const out = [...unitMetadata]\n out.push({ id: 'SER:ColorID', type: 'Int32', value: header.colorId })\n out.push({ id: 'SER:PixelDepth', type: 'Int32', value: header.pixelDepth })\n out.push({ id: 'SER:FrameCount', type: 'Int32', value: header.frameCount })\n out.push({ id: 'SER:ChannelCount', type: 'Int32', value: header.channelCount })\n out.push({ id: 'SER:LittleEndian', type: 'Boolean', value: header.byteOrder === 'little' })\n out.push({ id: 'SER:LuID', type: 'Int32', value: header.luId })\n out.push({ id: 'SER:Observer', type: 'String', value: header.observer })\n out.push({ id: 'SER:Instrument', type: 'String', value: header.instrument })\n out.push({ id: 'SER:Telescope', type: 'String', value: header.telescope })\n out.push({ id: 'SER:StartTime', type: 'String', value: header.startTime.toString() })\n out.push({ id: 'SER:StartTimeUTC', type: 'String', value: header.startTimeUtc.toString() })\n\n const timestamps = ser.parsed.timestamps\n if (timestamps.length > 0) {\n const vec = new BigUint64Array(timestamps.length)\n for (let i = 0; i < timestamps.length; i++) {\n vec[i] = timestamps[i]!\n }\n out.push({\n id: 'SER:FrameTimestamps',\n type: 'UI64Vector',\n value: vec,\n dataBlock: {\n location: { type: 'attachment', position: 0, size: vec.byteLength },\n byteOrder: 'little',\n },\n })\n }\n return out\n}\n\nfunction frameSamplesToU8(frame: SERFrameData): Uint8Array {\n if (frame.samples instanceof Uint8Array) return frame.samples\n const out = new Uint8Array(frame.samples.length)\n for (let i = 0; i < frame.samples.length; i++) {\n out[i] = Number(frame.samples[i] ?? 0) & 0xff\n }\n return out\n}\n\nfunction frameSamplesToU16(frame: SERFrameData): Uint16Array {\n if (frame.samples instanceof Uint16Array) return frame.samples\n const out = new Uint16Array(frame.samples.length)\n for (let i = 0; i < frame.samples.length; i++) {\n out[i] = Number(frame.samples[i] ?? 0)\n }\n return out\n}\n\nfunction buildTimestampExtension(timestamps: bigint[]): FITSWriteHDU {\n const data = new Uint8Array(timestamps.length * 8)\n const view = new DataView(data.buffer)\n for (let i = 0; i < timestamps.length; i++) {\n view.setBigInt64(i * 8, BigInt(timestamps[i]!), false)\n }\n\n return {\n cards: [\n { key: 'XTENSION', value: 'BINTABLE', comment: 'Binary table extension' },\n { key: 'BITPIX', value: 8, comment: '8-bit bytes' },\n { key: 'NAXIS', value: 2, comment: 'Table axes' },\n { key: 'NAXIS1', value: 8, comment: 'Bytes per row' },\n { key: 'NAXIS2', value: timestamps.length, comment: 'Rows' },\n { key: 'PCOUNT', value: 0 },\n { key: 'GCOUNT', value: 1 },\n { key: 'TFIELDS', value: 1 },\n { key: 'TTYPE1', value: 'TIMESTAMP' },\n { key: 'TFORM1', value: '1K' },\n { key: 'EXTNAME', value: SER_TS_EXTNAME },\n ],\n data,\n }\n}\n\nfunction inferColorIdFromXisf(image: XISFImage): SERColorId {\n if (image.channelCount === 3) return 100\n const pattern = image.colorFilterArray?.pattern\n if (!pattern) return 0\n const entry = Object.entries(SER_BAYER_OR_CMY_PATTERN).find(([, value]) => value === pattern)\n if (!entry) return 0\n return Number(entry[0]) as SERColorId\n}\n\nfunction parseHeaderCardBigInt(\n header: FITS['hdus'][number]['header'],\n key: string,\n): bigint | undefined {\n const raw = header.get(key)\n const parsed = toBigInt(raw)\n return parsed ?? undefined\n}\n\nfunction parseHeaderCardNumber(\n header: FITS['hdus'][number]['header'],\n key: string,\n): number | undefined {\n const raw = header.get(key)\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw\n if (typeof raw === 'string' && raw.trim() !== '') {\n const num = Number(raw)\n if (Number.isFinite(num)) return num\n }\n return undefined\n}\n\nfunction parseHeaderCardString(\n header: FITS['hdus'][number]['header'],\n key: string,\n): string | undefined {\n const raw = header.get(key)\n return typeof raw === 'string' ? raw : undefined\n}\n\nfunction buildSerMetadataCards(ser: SER): FITSWriteHDU['cards'] {\n const header = ser.getHeader()\n const cfaPattern = SER_BAYER_OR_CMY_PATTERN[header.colorId]\n return [\n { key: SER_COLOR_CARD, value: header.colorId },\n { key: SER_PIXEL_DEPTH_CARD, value: header.pixelDepth },\n { key: SER_FRAME_COUNT_CARD, value: header.frameCount },\n { key: SER_CHANNELS_CARD, value: header.channelCount },\n { key: SER_CHANNEL_ORDER_CARD, value: header.colorId === 101 ? 'BGR' : 'RGB' },\n { key: SER_LUID_CARD, value: header.luId },\n { key: SER_BYTE_ORDER_CARD, value: header.byteOrder },\n { key: SER_OBSERVER_CARD, value: header.observer },\n { key: SER_INSTRUMENT_CARD, value: header.instrument },\n { key: SER_TELESCOPE_CARD, value: header.telescope },\n { key: SER_START_TIME_CARD, value: header.startTime.toString() },\n { key: SER_START_TIME_UTC_CARD, value: header.startTimeUtc.toString() },\n ...(cfaPattern ? [{ key: SER_CFA_CARD, value: cfaPattern }] : []),\n ]\n}\n\nfunction toPlanarFrameValues(frame: SERFrameData): number[] {\n const out: number[] = []\n if (frame.channelCount === 1) {\n for (let p = 0; p < frame.samples.length; p++) {\n out.push(Number(frame.samples[p] ?? 0))\n }\n return out\n }\n\n const pixels = frame.width * frame.height\n for (let ch = 0; ch < 3; ch++) {\n for (let p = 0; p < pixels; p++) {\n out.push(Number(frame.samples[p * 3 + ch] ?? 0))\n }\n }\n return out\n}\n\nfunction applyU16FitsOffset(values: number[]): number[] {\n return values.map((value) => value - U16_BZERO)\n}\n\ntype ImageHDUWithImage = {\n header: FITS['hdus'][number]['header']\n image: Image\n}\n\nfunction getImageHDUs(fits: FITS): ImageHDUWithImage[] {\n return fits.hdus\n .filter((hdu): hdu is FITS['hdus'][number] & { data: Image } => hdu.data instanceof Image)\n .map((hdu) => ({ header: hdu.header, image: hdu.data }))\n}\n\nfunction inferFitsSourceLayout(\n options: FitsToSerOptions | undefined,\n imageHDUs: ImageHDUWithImage[],\n metadataFrameCount: number | undefined,\n): 'cube' | 'multi-hdu' {\n if (options?.sourceLayout === 'cube' || options?.sourceLayout === 'multi-hdu') {\n return options.sourceLayout\n }\n\n if (imageHDUs.length <= 1) return 'cube'\n\n const hasFrameMarkers = imageHDUs.some(({ header }) => {\n const extname = header.getString('EXTNAME', '').trim().toUpperCase()\n return (\n header.contains(SER_FRAME_CARD) || extname.startsWith('SER_FRAME_') || extname === 'SER_FRAME'\n )\n })\n if (hasFrameMarkers) return 'multi-hdu'\n\n if (metadataFrameCount !== undefined) {\n if (imageHDUs.length === metadataFrameCount || imageHDUs.length === metadataFrameCount * 3) {\n return 'multi-hdu'\n }\n }\n\n const first = imageHDUs[0]!\n const sameShape = imageHDUs.every(\n (item) =>\n item.image.width === first.image.width &&\n item.image.height === first.image.height &&\n item.image.bitpix === first.image.bitpix,\n )\n return sameShape ? 'multi-hdu' : 'cube'\n}\n\nfunction normalizeMultiHduImages(\n imageHDUs: ImageHDUWithImage[],\n strictValidation: boolean,\n options?: SERConversionOptions,\n): ImageHDUWithImage[] {\n const reference = imageHDUs[0]?.image\n if (!reference) return imageHDUs\n\n const compatible = imageHDUs.filter((hdu, index) => {\n const sameShape =\n hdu.image.width === reference.width &&\n hdu.image.height === reference.height &&\n hdu.image.bitpix === reference.bitpix\n if (sameShape) return true\n\n const message = `Skipping incompatible image HDU #${index} (${hdu.image.width}x${hdu.image.height}, BITPIX=${hdu.image.bitpix}); expected ${reference.width}x${reference.height}, BITPIX=${reference.bitpix}`\n if (strictValidation) {\n throw new SERConversionError(message)\n }\n emitConversionWarning(options, 'fits_multi_hdu_incompatible', message)\n return false\n })\n\n if (compatible.length === 0) {\n throw new SERConversionError('No compatible image HDUs available for multi-HDU FITS conversion')\n }\n return compatible\n}\n\nasync function extractMonoFrameBytes(\n image: Image,\n frameIndex: number,\n bytesPerSample: 1 | 2,\n littleEndian: boolean,\n): Promise<Uint8Array> {\n const pixelsPerFrame = image.width * image.height\n const out = new Uint8Array(pixelsPerFrame * bytesPerSample)\n const samples = await image.getFrame(frameIndex)\n if (bytesPerSample === 1) {\n for (let i = 0; i < pixelsPerFrame; i++) out[i] = Number(samples[i] ?? 0) & 0xff\n return out\n }\n\n const view = new DataView(out.buffer)\n for (let i = 0; i < pixelsPerFrame; i++) {\n view.setUint16(i * 2, Number(samples[i] ?? 0), littleEndian)\n }\n return out\n}\n\nasync function extractRgbFrameBytesFromCube(\n image: Image,\n frameIndex: number,\n bytesPerSample: 1 | 2,\n littleEndian: boolean,\n): Promise<Uint8Array> {\n const pixelsPerFrame = image.width * image.height\n const out = new Uint8Array(pixelsPerFrame * 3 * bytesPerSample)\n const channelFrames = await Promise.all([\n image.getFrame(frameIndex * 3),\n image.getFrame(frameIndex * 3 + 1),\n image.getFrame(frameIndex * 3 + 2),\n ])\n if (bytesPerSample === 1) {\n for (let p = 0; p < pixelsPerFrame; p++) {\n out[p * 3] = Number(channelFrames[0]![p] ?? 0) & 0xff\n out[p * 3 + 1] = Number(channelFrames[1]![p] ?? 0) & 0xff\n out[p * 3 + 2] = Number(channelFrames[2]![p] ?? 0) & 0xff\n }\n return out\n }\n\n const view = new DataView(out.buffer)\n for (let p = 0; p < pixelsPerFrame; p++) {\n view.setUint16(p * 6, Number(channelFrames[0]![p] ?? 0), littleEndian)\n view.setUint16(p * 6 + 2, Number(channelFrames[1]![p] ?? 0), littleEndian)\n view.setUint16(p * 6 + 4, Number(channelFrames[2]![p] ?? 0), littleEndian)\n }\n return out\n}\n\nasync function extractRgbFrameBytesFromHduTriplet(\n rImage: Image,\n gImage: Image,\n bImage: Image,\n bytesPerSample: 1 | 2,\n littleEndian: boolean,\n): Promise<Uint8Array> {\n const pixelsPerFrame = rImage.width * rImage.height\n const out = new Uint8Array(pixelsPerFrame * 3 * bytesPerSample)\n const [rFrame, gFrame, bFrame] = await Promise.all([\n rImage.getFrame(0),\n gImage.getFrame(0),\n bImage.getFrame(0),\n ])\n if (bytesPerSample === 1) {\n for (let p = 0; p < pixelsPerFrame; p++) {\n out[p * 3] = Number(rFrame[p] ?? 0) & 0xff\n out[p * 3 + 1] = Number(gFrame[p] ?? 0) & 0xff\n out[p * 3 + 2] = Number(bFrame[p] ?? 0) & 0xff\n }\n return out\n }\n\n const view = new DataView(out.buffer)\n for (let p = 0; p < pixelsPerFrame; p++) {\n view.setUint16(p * 6, Number(rFrame[p] ?? 0), littleEndian)\n view.setUint16(p * 6 + 2, Number(gFrame[p] ?? 0), littleEndian)\n view.setUint16(p * 6 + 4, Number(bFrame[p] ?? 0), littleEndian)\n }\n return out\n}\n\nexport async function convertSerToFits(\n input: ArrayBuffer | Blob | SER,\n options?: SerToFitsOptions,\n): Promise<ArrayBuffer> {\n const ser = await asSER(input, options)\n const header = ser.getHeader()\n const frameCount = header.frameCount\n\n const cards = buildSerMetadataCards(ser)\n const layout = options?.layout ?? 'cube'\n const bitpix: 8 | 16 = header.bytesPerSample === 1 ? 8 : 16\n const bzero = bitpix === 16 ? U16_BZERO : undefined\n\n const hdus: FITSWriteHDU[] = []\n if (layout === 'multi-hdu') {\n for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {\n const frame = ser.getFrame(frameIndex)\n const baseValues = toPlanarFrameValues(frame)\n const values = bitpix === 16 ? applyU16FitsOffset(baseValues) : baseValues\n const data = createImageBytesFromArray(values, bitpix)\n hdus.push(\n createImageHDU({\n primary: frameIndex === 0,\n extensionType: 'IMAGE',\n width: header.width,\n height: header.height,\n depth: header.channelCount === 3 ? 3 : undefined,\n bitpix,\n bzero,\n bscale: bzero !== undefined ? 1 : undefined,\n data,\n extname: frameIndex === 0 ? undefined : `SER_FRAME_${frameIndex}`,\n additionalCards:\n frameIndex === 0\n ? cards\n : [\n { key: SER_FRAME_CARD, value: frameIndex },\n { key: SER_FRAME_COUNT_CARD, value: frameCount },\n { key: SER_CHANNELS_CARD, value: header.channelCount },\n ],\n }),\n )\n }\n } else {\n const depth = header.channelCount === 1 ? frameCount : frameCount * 3\n const values: number[] = []\n for (let i = 0; i < frameCount; i++) {\n const frame = ser.getFrame(i)\n const baseValues = toPlanarFrameValues(frame)\n const mapped = bitpix === 16 ? applyU16FitsOffset(baseValues) : baseValues\n values.push(...mapped)\n }\n const imageData = createImageBytesFromArray(values, bitpix)\n hdus.push(\n createImageHDU({\n width: header.width,\n height: header.height,\n depth,\n bitpix,\n bzero,\n bscale: bzero !== undefined ? 1 : undefined,\n data: imageData,\n additionalCards: cards,\n }),\n )\n }\n\n if ((options?.includeTimestampExtension ?? true) && ser.parsed.timestamps.length === frameCount) {\n hdus.push(buildTimestampExtension(ser.parsed.timestamps))\n }\n\n return writeFITS(hdus)\n}\n\nexport async function convertFitsToSer(\n input: ArrayBuffer | Blob | FITS,\n options?: FitsToSerOptions,\n): Promise<ArrayBuffer> {\n const strictValidation = isStrict(options)\n const fits = await asFits(input)\n const imageHDUs = getImageHDUs(fits)\n const imageHDU = imageHDUs[0]\n if (!imageHDU) {\n throw new SERConversionError('No FITS image HDU found for SER conversion')\n }\n\n const header = imageHDU.header\n const image = imageHDU.image\n const colorId = (parseHeaderCardNumber(header, SER_COLOR_CARD) ?? 0) as SERColorId\n const channelCount = SER_COLOR_CHANNELS[colorId] ?? 1\n\n let pixelDepth = parseHeaderCardNumber(header, SER_PIXEL_DEPTH_CARD)\n if (!pixelDepth) {\n if (image.bitpix === 8) pixelDepth = 8\n else if (image.bitpix === 16) pixelDepth = 16\n else {\n throw new SERConversionError(\n `Cannot infer SER pixel depth from FITS BITPIX=${image.bitpix}; metadata is missing`,\n )\n }\n }\n\n const metadataFrameCount = parseHeaderCardNumber(header, SER_FRAME_COUNT_CARD)\n const sourceLayout = inferFitsSourceLayout(options, imageHDUs, metadataFrameCount)\n const bytesPerSample = pixelDepth <= 8 ? 1 : (2 as 1 | 2)\n const layoutImageHDUs =\n sourceLayout === 'multi-hdu'\n ? normalizeMultiHduImages(imageHDUs, strictValidation, options)\n : imageHDUs\n\n const littleEndian = (parseHeaderCardString(header, SER_BYTE_ORDER_CARD) ?? 'little') !== 'big'\n const observer = parseHeaderCardString(header, SER_OBSERVER_CARD) ?? ''\n const instrument = parseHeaderCardString(header, SER_INSTRUMENT_CARD) ?? ''\n const telescope = parseHeaderCardString(header, SER_TELESCOPE_CARD) ?? ''\n const luId = parseHeaderCardNumber(header, SER_LUID_CARD) ?? 0\n const startTime = parseHeaderCardBigInt(header, SER_START_TIME_CARD) ?? 0n\n const startTimeUtc = parseHeaderCardBigInt(header, SER_START_TIME_UTC_CARD) ?? startTime\n\n const frames: Uint8Array[] = []\n let frameCount = metadataFrameCount ?? 0\n if (sourceLayout === 'cube') {\n if (channelCount === 1) {\n frameCount = metadataFrameCount ?? image.depth\n for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {\n frames.push(await extractMonoFrameBytes(image, frameIndex, bytesPerSample, littleEndian))\n }\n } else {\n frameCount = metadataFrameCount ?? image.depth\n if (!metadataFrameCount) {\n if (image.depth % 3 !== 0) {\n if (strictValidation) {\n throw new SERConversionError(\n `FITS depth ${image.depth} is not divisible by 3 for RGB/BGR SER reconstruction`,\n )\n }\n frameCount = Math.floor(image.depth / 3)\n } else {\n frameCount = image.depth / 3\n }\n }\n for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {\n frames.push(\n await extractRgbFrameBytesFromCube(image, frameIndex, bytesPerSample, littleEndian),\n )\n }\n }\n } else {\n if (channelCount === 1) {\n for (const hdu of layoutImageHDUs) {\n if (hdu.image.depth > 1) {\n for (let frameIndex = 0; frameIndex < hdu.image.depth; frameIndex++) {\n frames.push(\n await extractMonoFrameBytes(hdu.image, frameIndex, bytesPerSample, littleEndian),\n )\n }\n } else {\n frames.push(await extractMonoFrameBytes(hdu.image, 0, bytesPerSample, littleEndian))\n }\n }\n } else {\n const allDepth3 = layoutImageHDUs.every((hdu) => hdu.image.depth === 3)\n const allDepth1 = layoutImageHDUs.every((hdu) => hdu.image.depth === 1)\n if (allDepth3) {\n for (const hdu of layoutImageHDUs) {\n frames.push(\n await extractRgbFrameBytesFromCube(hdu.image, 0, bytesPerSample, littleEndian),\n )\n }\n } else if (allDepth1) {\n let frameHduCount = layoutImageHDUs.length\n if (frameHduCount % 3 !== 0) {\n const message = `RGB/BGR multi-HDU layout has ${frameHduCount} channels; expected multiple of 3`\n if (strictValidation) {\n throw new SERConversionError(message)\n }\n emitConversionWarning(options, 'fits_multi_hdu_rgb_tail_drop', message)\n frameHduCount -= frameHduCount % 3\n }\n for (let i = 0; i + 2 < frameHduCount; i += 3) {\n frames.push(\n await extractRgbFrameBytesFromHduTriplet(\n layoutImageHDUs[i]!.image,\n layoutImageHDUs[i + 1]!.image,\n layoutImageHDUs[i + 2]!.image,\n bytesPerSample,\n littleEndian,\n ),\n )\n }\n } else {\n throw new SERConversionError(\n 'Cannot decode RGB/BGR sequence from multi-HDU FITS layout; expected depth=3 per HDU or HDU triplets',\n )\n }\n }\n frameCount = frames.length\n }\n\n let timestamps: bigint[] | undefined\n const tsHdu = fits.hdus.find(\n (hdu) =>\n hdu.data instanceof BinaryTable &&\n hdu.header.getString('EXTNAME', '').trim().toUpperCase() === SER_TS_EXTNAME,\n )\n if (tsHdu && tsHdu.data instanceof BinaryTable) {\n const colName = tsHdu.data.columns?.[0]\n if (colName) {\n const values = await tsHdu.data.getColumn(colName)\n timestamps = values\n .map((item) => toBigInt(item))\n .filter((item): item is bigint => item !== null)\n if (timestamps.length !== frameCount) {\n if (strictValidation) {\n throw new SERConversionError(\n `SER timestamp extension row count mismatch: expected ${frameCount}, got ${timestamps.length}`,\n )\n }\n timestamps = timestamps.slice(0, frameCount)\n }\n }\n }\n\n return writeSER(\n {\n header: {\n colorId,\n width: image.width,\n height: image.height,\n pixelDepth,\n frameCount,\n littleEndian,\n luId,\n observer,\n instrument,\n telescope,\n startTime,\n startTimeUtc,\n },\n frames,\n timestamps,\n },\n {\n strictValidation,\n endiannessPolicy: options?.endiannessPolicy === 'spec' ? 'spec' : 'compat',\n onWarning: options?.onWarning,\n },\n )\n}\n\nfunction sampleFormatFromSerBytes(bytesPerSample: number): XISFImage['sampleFormat'] {\n return bytesPerSample === 1 ? 'UInt8' : 'UInt16'\n}\n\nfunction buildSerImageDataForXisf(ser: SER): Uint8Array {\n const header = ser.getHeader()\n const frameCount = header.frameCount\n const frameSamples = header.width * header.height * header.channelCount\n const totalSamples = frameSamples * frameCount\n\n if (header.bytesPerSample === 1) {\n const out = new Uint8Array(totalSamples)\n let offset = 0\n for (let i = 0; i < frameCount; i++) {\n const frame = ser.getFrame(i)\n const samples = frameSamplesToU8(frame)\n out.set(samples, offset)\n offset += samples.length\n }\n return out\n }\n\n const out = new Uint8Array(totalSamples * 2)\n const outView = new DataView(out.buffer)\n let sampleOffset = 0\n for (let i = 0; i < frameCount; i++) {\n const frame = ser.getFrame(i)\n const samples = frameSamplesToU16(frame)\n for (let s = 0; s < samples.length; s++) {\n outView.setUint16(sampleOffset * 2, samples[s]!, true)\n sampleOffset++\n }\n }\n return out\n}\n\nexport async function convertSerToXisf(\n input: ArrayBuffer | Blob | SER,\n options?: SerToXisfOptions,\n): Promise<ArrayBuffer | { header: Uint8Array; blocks: Record<string, Uint8Array> }> {\n const ser = await asSER(input, options)\n const header = ser.getHeader()\n const imageData = buildSerImageDataForXisf(ser)\n\n const image: XISFImage = {\n id: 'SER_SEQUENCE',\n geometry: [header.width, header.height, header.frameCount],\n channelCount: header.channelCount,\n sampleFormat: sampleFormatFromSerBytes(header.bytesPerSample),\n pixelStorage: header.channelCount === 3 ? 'Normal' : 'Planar',\n colorSpace: header.channelCount === 3 ? 'RGB' : 'Gray',\n dataBlock: {\n location: { type: 'attachment', position: 0, size: imageData.byteLength },\n byteOrder: 'little',\n },\n data: imageData,\n properties: [],\n tables: [],\n fitsKeywords: [],\n }\n\n const cfaPattern = SER_BAYER_OR_CMY_PATTERN[header.colorId]\n if (cfaPattern) {\n image.colorFilterArray = { pattern: cfaPattern, width: 2, height: 2 }\n }\n\n let metadata: XISFUnit['metadata'] = [\n { id: 'XISF:CreatorApplication', type: 'String', value: 'fitsjs-ng SER conversion' },\n { id: 'XISF:CreationTime', type: 'TimePoint', value: new Date().toISOString() },\n ]\n metadata = pushSERMetadataProperties(metadata, ser)\n\n const unit: XISFUnit = {\n metadata,\n images: [image],\n standaloneProperties: [],\n standaloneTables: [],\n version: '1.0',\n signature: { present: false, verified: true },\n }\n\n if (options?.distributed) {\n return XISFWriter.toDistributed(unit, options.writeOptions)\n }\n return XISFWriter.toMonolithic(unit, options?.writeOptions)\n}\n\nfunction extractImageBytes(image: XISFImage): Uint8Array {\n if (!image.data) {\n throw new SERConversionError('XISF image data is not decoded')\n }\n return image.data\n}\n\nfunction decodeXisfImageFramesToSer(\n image: XISFImage,\n frameCount: number,\n channelCount: number,\n littleEndianOut: boolean,\n): Uint8Array[] {\n const width = image.geometry[0] ?? 0\n const height = image.geometry[1] ?? 0\n const pixels = width * height\n const sampleSize = image.sampleFormat === 'UInt16' ? 2 : 1\n const outFrameBytes = pixels * channelCount * sampleSize\n const bytes = extractImageBytes(image)\n const expectedLength = pixels * channelCount * frameCount * sampleSize\n if (bytes.byteLength < expectedLength) {\n throw new SERConversionError(\n `XISF image payload too short for SER conversion: expected at least ${expectedLength} bytes, got ${bytes.byteLength}`,\n )\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const inputLittle = image.dataBlock.byteOrder !== 'big'\n const frames: Uint8Array[] = []\n\n if (sampleSize === 1) {\n if (channelCount === 1) {\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n const offset = f * pixels\n frame.set(bytes.subarray(offset, offset + pixels))\n frames.push(frame)\n }\n } else if (image.pixelStorage === 'Normal') {\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n const offset = f * pixels * channelCount\n frame.set(bytes.subarray(offset, offset + pixels * channelCount))\n frames.push(frame)\n }\n } else {\n const planeSize = pixels * frameCount\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n for (let p = 0; p < pixels; p++) {\n frame[p * 3] = bytes[f * pixels + p] ?? 0\n frame[p * 3 + 1] = bytes[planeSize + f * pixels + p] ?? 0\n frame[p * 3 + 2] = bytes[planeSize * 2 + f * pixels + p] ?? 0\n }\n frames.push(frame)\n }\n }\n return frames\n }\n\n if (channelCount === 1) {\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n const outView = new DataView(frame.buffer)\n for (let p = 0; p < pixels; p++) {\n const value = view.getUint16((f * pixels + p) * 2, inputLittle)\n outView.setUint16(p * 2, value, littleEndianOut)\n }\n frames.push(frame)\n }\n return frames\n }\n\n if (image.pixelStorage === 'Normal') {\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n const outView = new DataView(frame.buffer)\n for (let p = 0; p < pixels; p++) {\n const baseIn = (f * pixels * channelCount + p * channelCount) * 2\n const baseOut = p * channelCount * 2\n outView.setUint16(baseOut, view.getUint16(baseIn, inputLittle), littleEndianOut)\n outView.setUint16(baseOut + 2, view.getUint16(baseIn + 2, inputLittle), littleEndianOut)\n outView.setUint16(baseOut + 4, view.getUint16(baseIn + 4, inputLittle), littleEndianOut)\n }\n frames.push(frame)\n }\n return frames\n }\n\n const planeSize = pixels * frameCount\n for (let f = 0; f < frameCount; f++) {\n const frame = new Uint8Array(outFrameBytes)\n const outView = new DataView(frame.buffer)\n for (let p = 0; p < pixels; p++) {\n const r = view.getUint16((f * pixels + p) * 2, inputLittle)\n const g = view.getUint16((planeSize + f * pixels + p) * 2, inputLittle)\n const b = view.getUint16((planeSize * 2 + f * pixels + p) * 2, inputLittle)\n const base = p * 6\n outView.setUint16(base, r, littleEndianOut)\n outView.setUint16(base + 2, g, littleEndianOut)\n outView.setUint16(base + 4, b, littleEndianOut)\n }\n frames.push(frame)\n }\n return frames\n}\n\nexport async function convertXisfToSer(\n input: ArrayBuffer | Blob | XISF,\n options?: XisfToSerOptions,\n): Promise<ArrayBuffer> {\n const strictValidation = isStrict(options)\n const xisf =\n input instanceof XISF\n ? input\n : await XISF.fromArrayBuffer(await toArrayBufferLike(input), {\n strictValidation,\n decodeImageData: true,\n })\n\n const imageIndex = options?.imageIndex ?? 0\n if (!Number.isInteger(imageIndex) || imageIndex < 0) {\n throw new SERConversionError(\n `XISF image index must be a non-negative integer, got ${imageIndex}`,\n )\n }\n const image = xisf.unit.images[imageIndex]\n if (!image) {\n throw new SERConversionError(`No XISF image available at index ${imageIndex}`)\n }\n\n if (image.sampleFormat !== 'UInt8' && image.sampleFormat !== 'UInt16') {\n throw new SERConversionError(\n `Unsupported XISF sample format for SER conversion: ${image.sampleFormat}`,\n )\n }\n\n const width = image.geometry[0] ?? 0\n const height = image.geometry[1] ?? 0\n if (!width || !height) {\n throw new SERConversionError('XISF image must have width and height geometry')\n }\n\n const metaColor = getSerMetadataScalar(xisf.unit, image, 'SER:ColorID')\n const colorId = (toBigInt(metaColor) ?? BigInt(inferColorIdFromXisf(image))) as bigint\n const color = Number(colorId) as SERColorId\n const channelCount = SER_COLOR_CHANNELS[color] ?? (image.channelCount === 3 ? 3 : 1)\n\n const frameCount = image.geometry[2] ?? 1\n const pixelDepthMeta = getSerMetadataScalar(xisf.unit, image, 'SER:PixelDepth')\n const pixelDepth =\n Number(toBigInt(pixelDepthMeta) ?? (image.sampleFormat === 'UInt8' ? 8n : 16n)) || 8\n\n const littleEndianMeta = getSerMetadataScalar(xisf.unit, image, 'SER:LittleEndian')\n const littleEndian =\n typeof littleEndianMeta === 'boolean'\n ? littleEndianMeta\n : String(littleEndianMeta ?? 'true').toLowerCase() !== 'false'\n\n const frames = decodeXisfImageFramesToSer(image, frameCount, channelCount, littleEndian)\n let timestamps = getSerMetadataBigIntArray(xisf.unit, image, 'SER:FrameTimestamps')\n if (timestamps.length > 0 && timestamps.length !== frameCount) {\n if (strictValidation) {\n throw new SERConversionError(\n `XISF SER:FrameTimestamps length mismatch: expected ${frameCount}, got ${timestamps.length}`,\n )\n }\n emitConversionWarning(\n options,\n 'xisf_timestamp_length_mismatch',\n `SER:FrameTimestamps length mismatch: expected ${frameCount}, got ${timestamps.length}; truncating`,\n )\n timestamps = timestamps.slice(0, frameCount)\n }\n\n const luId = Number(toBigInt(getSerMetadataScalar(xisf.unit, image, 'SER:LuID')) ?? 0n)\n const observer = String(getSerMetadataScalar(xisf.unit, image, 'SER:Observer') ?? '')\n const instrument = String(getSerMetadataScalar(xisf.unit, image, 'SER:Instrument') ?? '')\n const telescope = String(getSerMetadataScalar(xisf.unit, image, 'SER:Telescope') ?? '')\n const startTime = toBigInt(getSerMetadataScalar(xisf.unit, image, 'SER:StartTime')) ?? 0n\n const startTimeUtc =\n toBigInt(getSerMetadataScalar(xisf.unit, image, 'SER:StartTimeUTC')) ?? startTime\n\n return writeSER(\n {\n header: {\n colorId: color,\n width,\n height,\n pixelDepth,\n frameCount,\n littleEndian,\n luId,\n observer,\n instrument,\n telescope,\n startTime,\n startTimeUtc,\n },\n frames,\n timestamps: timestamps.length > 0 ? timestamps : undefined,\n },\n {\n strictValidation,\n endiannessPolicy: options?.endiannessPolicy === 'spec' ? 'spec' : 'compat',\n onWarning: options?.onWarning,\n },\n )\n}\n","import type { HiPSTileFormat, HiPSTileMeta } from './hips-types'\n\nconst FORMAT_EXTENSION: Record<HiPSTileFormat, string> = {\n fits: 'fits',\n png: 'png',\n jpeg: 'jpg',\n}\n\nexport function formatToExtension(format: HiPSTileFormat): string {\n return FORMAT_EXTENSION[format]\n}\n\nexport function extensionToFormat(extension: string): HiPSTileFormat | null {\n const normalized = extension.toLowerCase()\n if (normalized === 'fits') return 'fits'\n if (normalized === 'png') return 'png'\n if (normalized === 'jpg' || normalized === 'jpeg') return 'jpeg'\n return null\n}\n\nexport function hipsDirIndex(ipix: number): number {\n if (!Number.isInteger(ipix) || ipix < 0) {\n throw new Error(`Invalid ipix: ${ipix}`)\n }\n return Math.floor(ipix / 10_000) * 10_000\n}\n\nexport function hipsTilePath(meta: HiPSTileMeta): string {\n if (meta.spectralOrder !== undefined || meta.spectralIndex !== undefined) {\n const sOrder = meta.spectralOrder ?? 0\n const sIndex = meta.spectralIndex ?? 0\n const dir = `${hipsDirIndex(meta.ipix)}_${Math.floor(sIndex / 10) * 10}`\n return `Norder${meta.order}_${sOrder}/Dir${dir}/Npix${meta.ipix}_${sIndex}.${formatToExtension(meta.format)}`\n }\n return `Norder${meta.order}/Dir${hipsDirIndex(meta.ipix)}/Npix${meta.ipix}.${formatToExtension(meta.format)}`\n}\n\nexport function hipsAllskyPath(format: HiPSTileFormat): string {\n return `Norder3/Allsky.${formatToExtension(format)}`\n}\n\nexport function parseHiPSTilePath(path: string): HiPSTileMeta | null {\n const normalized = path.replaceAll('\\\\', '/')\n const cube = /^Norder(\\d+)_(\\d+)\\/Dir(\\d+)_(\\d+)\\/Npix(\\d+)_(\\d+)\\.(\\w+)$/i.exec(normalized)\n if (cube) {\n const format = extensionToFormat(cube[7]!)\n if (!format) return null\n return {\n order: Number(cube[1]),\n spectralOrder: Number(cube[2]),\n ipix: Number(cube[5]),\n spectralIndex: Number(cube[6]),\n frame: 'equatorial',\n format,\n }\n }\n\n const image = /^Norder(\\d+)\\/Dir(\\d+)\\/Npix(\\d+)\\.(\\w+)$/i.exec(normalized)\n if (!image) return null\n const format = extensionToFormat(image[4]!)\n if (!format) return null\n return {\n order: Number(image[1]),\n ipix: Number(image[3]),\n frame: 'equatorial',\n format,\n }\n}\n","import type { HiPSDataproductType, HiPSFrame, HiPSTileFormat } from './hips-types'\n\nconst REQUIRED_KEYS = [\n 'creator_did',\n 'obs_title',\n 'dataproduct_type',\n 'hips_version',\n 'hips_frame',\n 'hips_order',\n 'hips_tile_width',\n 'hips_tile_format',\n] as const\nconst CUBE_REQUIRED_KEYS = ['hips_cube_depth', 'hips_cube_firstframe'] as const\n\nconst VALID_FRAMES = new Set<HiPSFrame>(['equatorial', 'galactic', 'ecliptic'])\nconst VALID_DATAPRODUCT_TYPES = new Set<HiPSDataproductType>(['image', 'cube'])\nconst VALID_FORMATS = new Set<HiPSTileFormat>(['fits', 'png', 'jpeg'])\n\nexport interface HiPSValidationReport {\n ok: boolean\n missing: string[]\n invalid: string[]\n warnings: string[]\n}\n\nfunction normalizeValue(value: string): string {\n return value.trim()\n}\n\nexport class HiPSProperties {\n private readonly data = new Map<string, string>()\n\n constructor(values?: Record<string, string>) {\n if (values) {\n for (const [key, value] of Object.entries(values)) {\n this.data.set(key.trim(), normalizeValue(value))\n }\n }\n }\n\n static parse(text: string): HiPSProperties {\n const values: Record<string, string> = {}\n for (const line of text.split(/\\r?\\n/u)) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq <= 0) continue\n const key = trimmed.slice(0, eq).trim()\n const value = trimmed.slice(eq + 1).trim()\n values[key] = value\n }\n return new HiPSProperties(values)\n }\n\n static fromObject(values: Record<string, string | number | boolean>): HiPSProperties {\n const normalized: Record<string, string> = {}\n for (const [key, value] of Object.entries(values)) {\n normalized[key] = typeof value === 'string' ? value : String(value)\n }\n return new HiPSProperties(normalized)\n }\n\n get(key: string): string | undefined {\n return this.data.get(key)\n }\n\n set(key: string, value: string | number | boolean): this {\n this.data.set(key, typeof value === 'string' ? normalizeValue(value) : String(value))\n return this\n }\n\n has(key: string): boolean {\n return this.data.has(key)\n }\n\n delete(key: string): boolean {\n return this.data.delete(key)\n }\n\n keys(): string[] {\n return [...this.data.keys()]\n }\n\n toObject(): Record<string, string> {\n return Object.fromEntries(this.data.entries())\n }\n\n merge(values: Record<string, string | number | boolean>): this {\n for (const [key, value] of Object.entries(values)) {\n this.set(key, value)\n }\n return this\n }\n\n toString(): string {\n const entries = [...this.data.entries()].sort(([a], [b]) => a.localeCompare(b))\n return entries.map(([k, v]) => `${k.padEnd(20, ' ')} = ${v}`).join('\\n') + '\\n'\n }\n\n validate(): HiPSValidationReport {\n const missing: string[] = REQUIRED_KEYS.filter((key) => !this.data.has(key))\n const invalid: string[] = []\n const warnings: string[] = []\n\n const frame = this.get('hips_frame')\n if (frame && !VALID_FRAMES.has(frame as HiPSFrame)) {\n invalid.push(`hips_frame=${frame}`)\n }\n\n const dataproduct = this.get('dataproduct_type')\n if (dataproduct && !VALID_DATAPRODUCT_TYPES.has(dataproduct as HiPSDataproductType)) {\n invalid.push(`dataproduct_type=${dataproduct}`)\n }\n\n const formatValue = this.get('hips_tile_format')\n if (formatValue) {\n const formats = formatValue\n .split(/[,\\s]+/u)\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean)\n if (\n formats.length === 0 ||\n formats.some((fmt) => !VALID_FORMATS.has(fmt as HiPSTileFormat))\n ) {\n invalid.push(`hips_tile_format=${formatValue}`)\n }\n if (formats.includes('jpg')) {\n warnings.push('hips_tile_format contains jpg alias; prefer jpeg')\n }\n }\n\n const orderValue = Number(this.get('hips_order'))\n if (this.has('hips_order') && (!Number.isInteger(orderValue) || orderValue < 0)) {\n invalid.push(`hips_order=${this.get('hips_order')}`)\n }\n\n const tileWidthValue = Number(this.get('hips_tile_width'))\n if (this.has('hips_tile_width') && (!Number.isInteger(tileWidthValue) || tileWidthValue <= 0)) {\n invalid.push(`hips_tile_width=${this.get('hips_tile_width')}`)\n } else if (\n this.has('hips_tile_width') &&\n Number.isInteger(tileWidthValue) &&\n (tileWidthValue & (tileWidthValue - 1)) !== 0\n ) {\n warnings.push(`hips_tile_width=${tileWidthValue} is not a power of two`)\n }\n\n const minOrderRaw = this.get('hips_order_min')\n if (minOrderRaw !== undefined) {\n const minOrderValue = Number(minOrderRaw)\n if (!Number.isInteger(minOrderValue) || minOrderValue < 0) {\n invalid.push(`hips_order_min=${minOrderRaw}`)\n } else if (Number.isInteger(orderValue) && minOrderValue > orderValue) {\n invalid.push(`hips_order_min=${minOrderRaw} exceeds hips_order=${orderValue}`)\n }\n }\n\n const versionValue = this.get('hips_version')\n if (versionValue && !/^\\d+(\\.\\d+){0,2}$/u.test(versionValue)) {\n warnings.push(`hips_version=${versionValue} is not in expected numeric dotted form`)\n }\n\n if (dataproduct === 'cube') {\n for (const key of CUBE_REQUIRED_KEYS) {\n if (!this.has(key)) missing.push(key)\n }\n const depth = Number(this.get('hips_cube_depth'))\n if (this.has('hips_cube_depth') && (!Number.isInteger(depth) || depth <= 0)) {\n invalid.push(`hips_cube_depth=${this.get('hips_cube_depth')}`)\n }\n const firstFrame = Number(this.get('hips_cube_firstframe'))\n if (this.has('hips_cube_firstframe') && (!Number.isInteger(firstFrame) || firstFrame < 0)) {\n invalid.push(`hips_cube_firstframe=${this.get('hips_cube_firstframe')}`)\n }\n } else {\n if (this.has('hips_cube_depth')) {\n warnings.push('hips_cube_depth is set but dataproduct_type is not cube')\n }\n if (this.has('hips_cube_firstframe')) {\n warnings.push('hips_cube_firstframe is set but dataproduct_type is not cube')\n }\n }\n\n return {\n ok: missing.length === 0 && invalid.length === 0,\n missing: [...missing],\n invalid,\n warnings,\n }\n }\n\n withCompatibilityFields(): this {\n const frame = this.get('hips_frame')\n const order = this.get('hips_order')\n const format = this.get('hips_tile_format')\n if (frame) this.set('coordsys', frame)\n if (order) this.set('maxOrder', order)\n if (format) this.set('format', format)\n return this\n }\n}\n\nexport function createDefaultHiPSProperties(params: {\n creatorDid: string\n obsTitle: string\n dataproductType?: HiPSDataproductType\n frame?: HiPSFrame\n order: number\n tileWidth: number\n formats: HiPSTileFormat[]\n version?: string\n extras?: Record<string, string | number | boolean>\n}): HiPSProperties {\n const props = HiPSProperties.fromObject({\n creator_did: params.creatorDid,\n obs_title: params.obsTitle,\n dataproduct_type: params.dataproductType ?? 'image',\n hips_version: params.version ?? '1.4',\n hips_frame: params.frame ?? 'equatorial',\n hips_order: params.order,\n hips_tile_width: params.tileWidth,\n hips_tile_format: params.formats.join(' '),\n })\n if (params.extras) {\n props.merge(params.extras)\n }\n props.withCompatibilityFields()\n return props\n}\n","import { order2nside, pix2ang_nest, pixcoord2vec_nest, vec2ang } from '@hscmap/healpix'\nimport type { FITSHeaderCard } from '../fits/fits-writer'\nimport type { HiPSFrame, HiPSTileMeta, HiPSWCSDefinition } from './hips-types'\n\nexport interface LonLat {\n lon: number\n lat: number\n}\n\nexport interface LinearWCS {\n definition: HiPSWCSDefinition\n pixelToWorld(x: number, y: number): LonLat\n worldToPixel(lon: number, lat: number): { x: number; y: number }\n}\n\ninterface HeaderLike {\n getNumber(key: string, fallback?: number): number\n getString(key: string, fallback?: string): string\n}\n\nfunction wrap360(value: number): number {\n const wrapped = value % 360\n return wrapped < 0 ? wrapped + 360 : wrapped\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction frameCTypes(frame: HiPSFrame): { ctype1: string; ctype2: string } {\n if (frame === 'galactic') return { ctype1: 'GLON-HPX', ctype2: 'GLAT-HPX' }\n if (frame === 'ecliptic') return { ctype1: 'ELON-HPX', ctype2: 'ELAT-HPX' }\n return { ctype1: 'RA---HPX', ctype2: 'DEC--HPX' }\n}\n\nexport function inferFrameFromCType(ctype1: string, ctype2: string): HiPSFrame {\n const c1 = ctype1.toUpperCase()\n const c2 = ctype2.toUpperCase()\n if (c1.startsWith('GLON') || c2.startsWith('GLAT')) return 'galactic'\n if (c1.startsWith('ELON') || c2.startsWith('ELAT')) return 'ecliptic'\n return 'equatorial'\n}\n\nexport function createLinearWCS(definition: HiPSWCSDefinition): LinearWCS {\n const crpix1 = definition.crpix1\n const crpix2 = definition.crpix2\n const crval1 = definition.crval1\n const crval2 = definition.crval2\n\n let cd11 = definition.cd11\n let cd12 = definition.cd12\n let cd21 = definition.cd21\n let cd22 = definition.cd22\n\n const hasCD = [cd11, cd12, cd21, cd22].every(\n (value) => typeof value === 'number' && Number.isFinite(value),\n )\n\n if (!hasCD) {\n const cdelt1 = Number.isFinite(definition.cdelt1) ? definition.cdelt1! : -1\n const cdelt2 = Number.isFinite(definition.cdelt2) ? definition.cdelt2! : 1\n const theta = ((definition.crota2 ?? 0) * Math.PI) / 180\n const cos = Math.cos(theta)\n const sin = Math.sin(theta)\n cd11 = cdelt1 * cos\n cd12 = -cdelt2 * sin\n cd21 = cdelt1 * sin\n cd22 = cdelt2 * cos\n }\n\n const det = cd11! * cd22! - cd12! * cd21!\n if (Math.abs(det) < 1e-16) {\n throw new Error('WCS matrix is singular')\n }\n\n const inv11 = cd22! / det\n const inv12 = -cd12! / det\n const inv21 = -cd21! / det\n const inv22 = cd11! / det\n\n return {\n definition,\n pixelToWorld(x: number, y: number): LonLat {\n const dx = x + 1 - crpix1\n const dy = y + 1 - crpix2\n return {\n lon: wrap360(crval1 + cd11! * dx + cd12! * dy),\n lat: clamp(crval2 + cd21! * dx + cd22! * dy, -90, 90),\n }\n },\n worldToPixel(lon: number, lat: number): { x: number; y: number } {\n const dlon = ((lon - crval1 + 540) % 360) - 180\n const dlat = lat - crval2\n const dx = inv11 * dlon + inv12 * dlat\n const dy = inv21 * dlon + inv22 * dlat\n return {\n x: dx + crpix1 - 1,\n y: dy + crpix2 - 1,\n }\n },\n }\n}\n\nexport function readLinearWCSFromHeader(header: HeaderLike): LinearWCS {\n return createLinearWCS({\n ctype1: header.getString('CTYPE1', 'RA---CAR'),\n ctype2: header.getString('CTYPE2', 'DEC--CAR'),\n crpix1: header.getNumber('CRPIX1', 1),\n crpix2: header.getNumber('CRPIX2', 1),\n crval1: header.getNumber('CRVAL1', 0),\n crval2: header.getNumber('CRVAL2', 0),\n cd11: header.getNumber('CD1_1', Number.NaN),\n cd12: header.getNumber('CD1_2', Number.NaN),\n cd21: header.getNumber('CD2_1', Number.NaN),\n cd22: header.getNumber('CD2_2', Number.NaN),\n cdelt1: header.getNumber('CDELT1', Number.NaN),\n cdelt2: header.getNumber('CDELT2', Number.NaN),\n crota2: header.getNumber('CROTA2', 0),\n })\n}\n\nexport function readWCSFromCards(cards: Record<string, string | number>): LinearWCS {\n const getNumber = (key: string, fallback: number): number => {\n const value = cards[key]\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value)\n if (Number.isFinite(parsed)) return parsed\n }\n return fallback\n }\n const getString = (key: string, fallback: string): string => {\n const value = cards[key]\n return typeof value === 'string' ? value : fallback\n }\n return createLinearWCS({\n ctype1: getString('CTYPE1', 'RA---TAN'),\n ctype2: getString('CTYPE2', 'DEC--TAN'),\n crpix1: getNumber('CRPIX1', 1),\n crpix2: getNumber('CRPIX2', 1),\n crval1: getNumber('CRVAL1', 0),\n crval2: getNumber('CRVAL2', 0),\n cd11: getNumber('CD1_1', Number.NaN),\n cd12: getNumber('CD1_2', Number.NaN),\n cd21: getNumber('CD2_1', Number.NaN),\n cd22: getNumber('CD2_2', Number.NaN),\n cdelt1: getNumber('CDELT1', Number.NaN),\n cdelt2: getNumber('CDELT2', Number.NaN),\n crota2: getNumber('CROTA2', 0),\n })\n}\n\nexport function estimateOrderFromImageResolution(\n width: number,\n height: number,\n tileWidth: number,\n): number {\n const maxDim = Math.max(width, height)\n const order = Math.max(0, Math.ceil(Math.log2(Math.max(1, maxDim / tileWidth))))\n return Math.min(order, 13)\n}\n\nexport function tilePixelLonLat(\n meta: HiPSTileMeta,\n x: number,\n y: number,\n tileWidth: number,\n): LonLat {\n const nside = order2nside(meta.order)\n const ne = (x + 0.5) / tileWidth\n const nw = (y + 0.5) / tileWidth\n const [vx, vy, vz] = pixcoord2vec_nest(nside, meta.ipix, ne, nw)\n const { theta, phi } = vec2ang([vx, vy, vz])\n return { lon: (phi * 180) / Math.PI, lat: 90 - (theta * 180) / Math.PI }\n}\n\nexport function tileCenterLonLat(meta: HiPSTileMeta): LonLat {\n const nside = order2nside(meta.order)\n const { theta, phi } = pix2ang_nest(nside, meta.ipix)\n return { lon: (phi * 180) / Math.PI, lat: 90 - (theta * 180) / Math.PI }\n}\n\nexport function createHiPSTileHeader(\n meta: HiPSTileMeta,\n tileWidth: number,\n depth: number = 1,\n): FITSHeaderCard[] {\n const nside = order2nside(meta.order)\n const { ctype1, ctype2 } = frameCTypes(meta.frame)\n const res = 45 / tileWidth / nside\n const center = tileCenterLonLat(meta)\n\n const cards: FITSHeaderCard[] = [\n { key: 'CTYPE1', value: ctype1 },\n { key: 'CTYPE2', value: ctype2 },\n { key: 'CRPIX1', value: tileWidth / 2 + 0.5 },\n { key: 'CRPIX2', value: tileWidth / 2 + 0.5 },\n { key: 'CRVAL1', value: center.lon },\n { key: 'CRVAL2', value: center.lat },\n { key: 'CD1_1', value: -res },\n { key: 'CD1_2', value: 0 },\n { key: 'CD2_1', value: 0 },\n { key: 'CD2_2', value: res },\n { key: 'ORDER', value: meta.order },\n { key: 'NPIX', value: meta.ipix },\n { key: 'NSIDE', value: nside },\n { key: 'ORDERING', value: 'NESTED' },\n ]\n\n if (meta.spectralOrder !== undefined) cards.push({ key: 'FORDER', value: meta.spectralOrder })\n if (meta.spectralIndex !== undefined) cards.push({ key: 'FPIX', value: meta.spectralIndex })\n if (depth > 1) cards.push({ key: 'NAXIS3', value: depth })\n\n return cards\n}\n","import { decode as decodePng, encode as encodePng } from 'fast-png'\nimport { decode as decodeJpeg, encode as encodeJpeg } from 'jpeg-js'\nimport { FITS } from '../fits'\nimport { createImageBytesFromArray, createImageHDU, writeFITS } from '../fits/fits-writer'\nimport { Image } from '../fits/image'\nimport { createHiPSTileHeader } from './hips-wcs'\nimport type { HiPSReadTileResult, HiPSTileMeta } from './hips-types'\nimport type { TypedArray } from '../core/types'\n\nfunction finiteExtent(values: Float32Array | Float64Array): [number, number] {\n let min = Number.POSITIVE_INFINITY\n let max = Number.NEGATIVE_INFINITY\n for (let i = 0; i < values.length; i++) {\n const value = values[i]!\n if (!Number.isFinite(value)) continue\n if (value < min) min = value\n if (value > max) max = value\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1]\n if (min === max) return [min, min + 1]\n return [min, max]\n}\n\nfunction floatToBytePlane(values: Float32Array | Float64Array): Uint8Array {\n const [min, max] = finiteExtent(values)\n const scale = max === min ? 0 : 255 / (max - min)\n const out = new Uint8Array(values.length)\n for (let i = 0; i < values.length; i++) {\n const value = values[i]!\n if (!Number.isFinite(value)) {\n out[i] = 0\n continue\n }\n const normalized = Math.max(0, Math.min(255, Math.round((value - min) * scale)))\n out[i] = normalized\n }\n return out\n}\n\nfunction byteToFloatPlane(values: Uint8Array): Float32Array {\n const out = new Float32Array(values.length)\n for (let i = 0; i < values.length; i++) out[i] = values[i]!\n return out\n}\n\nfunction toFloat32(values: ArrayLike<number | bigint>): Float32Array {\n if (values instanceof Float32Array) return values\n const out = new Float32Array(values.length)\n for (let i = 0; i < values.length; i++) {\n out[i] = Number(values[i] ?? Number.NaN)\n }\n return out\n}\n\nfunction ensureUint8(data: Uint8Array | ArrayBuffer): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data)\n}\n\nfunction toArrayBuffer(data: Uint8Array): ArrayBuffer {\n if (\n data.buffer instanceof ArrayBuffer &&\n data.byteOffset === 0 &&\n data.byteLength === data.buffer.byteLength\n ) {\n return data.buffer\n }\n return data.slice().buffer\n}\n\nfunction rgbaToGray(\n data: Uint8Array,\n width: number,\n height: number,\n channels: number,\n): Float32Array {\n const out = new Float32Array(width * height)\n if (channels === 1) {\n for (let i = 0; i < out.length; i++) out[i] = data[i] ?? 0\n return out\n }\n for (let i = 0; i < out.length; i++) {\n const base = i * channels\n const r = data[base] ?? 0\n const g = data[base + 1] ?? r\n const b = data[base + 2] ?? r\n out[i] = 0.299 * r + 0.587 * g + 0.114 * b\n }\n return out\n}\n\nexport async function decodeHiPSTile(\n meta: HiPSTileMeta,\n tileData: Uint8Array | ArrayBuffer,\n): Promise<HiPSReadTileResult> {\n const bytes = ensureUint8(tileData)\n if (meta.format === 'fits') {\n const fits = FITS.fromArrayBuffer(toArrayBuffer(bytes))\n const image = fits.getDataUnit()\n if (!(image instanceof Image)) {\n throw new Error('FITS tile does not contain image data')\n }\n const frames: TypedArray[] = []\n const depth = image.depth\n for (let i = 0; i < depth; i++) {\n frames.push(await image.getFrame(i))\n }\n const planeSize = image.width * image.height\n const combined = new Float32Array(planeSize * depth)\n for (let z = 0; z < depth; z++) {\n const frame = frames[z]!\n for (let i = 0; i < planeSize; i++)\n combined[z * planeSize + i] = Number(frame[i] ?? Number.NaN)\n }\n return {\n meta,\n width: image.width,\n height: image.height,\n depth,\n data: combined,\n }\n }\n\n if (meta.format === 'png') {\n const decoded = decodePng(bytes)\n const gray = rgbaToGray(\n decoded.data as Uint8Array,\n decoded.width,\n decoded.height,\n decoded.channels,\n )\n return {\n meta,\n width: decoded.width,\n height: decoded.height,\n depth: 1,\n data: gray,\n }\n }\n\n const decoded = decodeJpeg(bytes, { useTArray: true, formatAsRGBA: true })\n const gray = rgbaToGray(decoded.data as Uint8Array, decoded.width, decoded.height, 4)\n return {\n meta,\n width: decoded.width,\n height: decoded.height,\n depth: 1,\n data: gray,\n }\n}\n\nexport function encodeHiPSTile(\n meta: HiPSTileMeta,\n pixels: Float32Array,\n tileWidth: number,\n depth: number,\n): Uint8Array {\n const planeLength = tileWidth * tileWidth\n if (pixels.length !== planeLength * depth) {\n throw new Error(\n `Tile pixel length mismatch: got=${pixels.length} expected=${planeLength * depth}`,\n )\n }\n\n if (meta.format === 'fits') {\n const bytes = createImageBytesFromArray(pixels, -32)\n const cards = createHiPSTileHeader(meta, tileWidth, depth)\n const hdu = createImageHDU({\n primary: true,\n width: tileWidth,\n height: tileWidth,\n depth,\n bitpix: -32,\n data: bytes,\n additionalCards: cards,\n })\n return new Uint8Array(writeFITS([hdu]))\n }\n\n const bytePlane = floatToBytePlane(pixels.subarray(0, planeLength))\n if (meta.format === 'png') {\n return encodePng({\n width: tileWidth,\n height: tileWidth,\n depth: 8,\n channels: 1,\n data: bytePlane,\n })\n }\n\n const rgba = new Uint8Array(tileWidth * tileWidth * 4)\n for (let i = 0; i < bytePlane.length; i++) {\n const value = bytePlane[i]!\n const base = i * 4\n rgba[base] = value\n rgba[base + 1] = value\n rgba[base + 2] = value\n rgba[base + 3] = 255\n }\n const encoded = encodeJpeg(\n {\n width: tileWidth,\n height: tileWidth,\n data: rgba,\n },\n 90,\n )\n return new Uint8Array(encoded.data)\n}\n\nexport function convertTileFormat(\n source: HiPSReadTileResult,\n targetMeta: HiPSTileMeta,\n): Uint8Array {\n const floatData = toFloat32(source.data)\n return encodeHiPSTile(targetMeta, floatData, source.width, source.depth)\n}\n\nexport function grayByteTileToFloat(tileBytes: Uint8Array): Float32Array {\n return byteToFloatPlane(tileBytes)\n}\n","import { hipsAllskyPath, hipsTilePath } from './hips-path'\nimport { HiPSProperties } from './hips-properties'\nimport { decodeHiPSTile } from './hips-tile'\nimport { importNodeModule } from '../core/runtime'\nimport type {\n HiPSExportTarget,\n HiPSInput,\n HiPSReadTileResult,\n HiPSTileFormat,\n HiPSTileMeta,\n} from './hips-types'\n\nfunction isUrlLike(value: string): boolean {\n return /^https?:\\/\\//iu.test(value)\n}\n\ninterface NodeFsLike {\n readFile(path: string): Promise<Uint8Array>\n readFile(path: string, encoding: 'utf8'): Promise<string>\n}\n\ninterface NodePathLike {\n join(...paths: string[]): string\n}\n\nasync function ensureNodeModules(): Promise<{\n fs: NodeFsLike\n path: NodePathLike\n}> {\n const [fs, path] = await Promise.all([\n importNodeModule<NodeFsLike>(\n 'fs/promises',\n 'HiPS local-path access',\n 'Use URL-based HiPS input or provide a custom HiPSExportTarget in browser/React Native.',\n ),\n importNodeModule<NodePathLike>(\n 'path',\n 'HiPS local-path access',\n 'Use URL-based HiPS input or provide a custom HiPSExportTarget in browser/React Native.',\n ),\n ])\n return { fs, path }\n}\n\nexport class HiPS {\n private cachedProperties?: HiPSProperties\n private readonly source: HiPSInput\n\n constructor(source: HiPSInput) {\n this.source = source\n }\n\n static async open(source: HiPSInput): Promise<HiPS> {\n const hips = new HiPS(source)\n await hips.getProperties()\n return hips\n }\n\n private async readText(path: string): Promise<string> {\n if (typeof this.source === 'object' && this.source !== null) {\n if ('readText' in this.source && typeof this.source.readText === 'function') {\n return this.source.readText(path)\n }\n if ('root' in this.source) {\n const root = this.source.root\n if (isUrlLike(root)) {\n const response = await fetch(new URL(path, `${root.replace(/\\/+$/u, '')}/`).toString())\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return response.text()\n }\n const { fs, path: pathApi } = await ensureNodeModules()\n return fs.readFile(pathApi.join(root, path), 'utf8')\n }\n }\n\n if (typeof this.source === 'string') {\n if (isUrlLike(this.source)) {\n const response = await fetch(\n new URL(path, `${this.source.replace(/\\/+$/u, '')}/`).toString(),\n )\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return response.text()\n }\n const { fs, path: pathApi } = await ensureNodeModules()\n return fs.readFile(pathApi.join(this.source, path), 'utf8')\n }\n\n if (this.source instanceof URL) {\n const response = await fetch(\n new URL(path, `${this.source.toString().replace(/\\/+$/u, '')}/`).toString(),\n )\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return response.text()\n }\n\n throw new Error('Unsupported HiPS source for text read')\n }\n\n private async readBinary(path: string): Promise<Uint8Array> {\n if (typeof this.source === 'object' && this.source !== null) {\n if ('readBinary' in this.source && typeof this.source.readBinary === 'function') {\n return this.source.readBinary(path)\n }\n if ('root' in this.source) {\n const root = this.source.root\n if (isUrlLike(root)) {\n const response = await fetch(new URL(path, `${root.replace(/\\/+$/u, '')}/`).toString())\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return new Uint8Array(await response.arrayBuffer())\n }\n const { fs, path: pathApi } = await ensureNodeModules()\n const content = await fs.readFile(pathApi.join(root, path))\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength)\n }\n }\n\n if (typeof this.source === 'string') {\n if (isUrlLike(this.source)) {\n const response = await fetch(\n new URL(path, `${this.source.replace(/\\/+$/u, '')}/`).toString(),\n )\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return new Uint8Array(await response.arrayBuffer())\n }\n const { fs, path: pathApi } = await ensureNodeModules()\n const content = await fs.readFile(pathApi.join(this.source, path))\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength)\n }\n\n if (this.source instanceof URL) {\n const response = await fetch(\n new URL(path, `${this.source.toString().replace(/\\/+$/u, '')}/`).toString(),\n )\n if (!response.ok) {\n throw new Error(`Failed to fetch ${path}: ${response.status}`)\n }\n return new Uint8Array(await response.arrayBuffer())\n }\n\n throw new Error('Unsupported HiPS source for binary read')\n }\n\n async getProperties(): Promise<HiPSProperties> {\n if (!this.cachedProperties) {\n const propertiesPath =\n typeof this.source === 'object' && this.source !== null && 'propertiesPath' in this.source\n ? (this.source.propertiesPath ?? 'properties')\n : 'properties'\n const text = await this.readText(propertiesPath)\n this.cachedProperties = HiPSProperties.parse(text)\n }\n return this.cachedProperties\n }\n\n async tileFormats(): Promise<HiPSTileFormat[]> {\n const props = await this.getProperties()\n const value = props.get('hips_tile_format') ?? 'fits'\n const formats = value\n .split(/\\s+/u)\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n const out: HiPSTileFormat[] = []\n for (const format of formats) {\n if (format === 'fits' || format === 'png' || format === 'jpeg' || format === 'jpg') {\n out.push(format === 'jpg' ? 'jpeg' : (format as HiPSTileFormat))\n }\n }\n return out.length > 0 ? out : ['fits']\n }\n\n async readTile(\n meta: Omit<HiPSTileMeta, 'frame' | 'format'> & {\n frame?: HiPSTileMeta['frame']\n format?: HiPSTileFormat\n },\n ): Promise<HiPSReadTileResult> {\n const props = await this.getProperties()\n const frame = meta.frame ?? (props.get('hips_frame') as HiPSTileMeta['frame']) ?? 'equatorial'\n\n const preferredFormats: HiPSTileFormat[] = meta.format\n ? [meta.format]\n : await this.tileFormats()\n\n let lastError: unknown\n for (const format of preferredFormats) {\n try {\n const tileMeta: HiPSTileMeta = { ...meta, frame, format }\n const bytes = await this.readBinary(hipsTilePath(tileMeta))\n return decodeHiPSTile(tileMeta, bytes)\n } catch (error) {\n lastError = error\n }\n }\n throw new Error(\n `Unable to read HiPS tile order=${meta.order} ipix=${meta.ipix}: ${String(lastError)}`,\n )\n }\n\n async readAllsky(format?: HiPSTileFormat): Promise<Uint8Array> {\n const formats = format ? [format] : await this.tileFormats()\n let lastError: unknown\n for (const fmt of formats) {\n try {\n return await this.readBinary(hipsAllskyPath(fmt))\n } catch (error) {\n lastError = error\n }\n }\n throw new Error(`Allsky not found: ${String(lastError)}`)\n }\n\n async exportProperties(target: HiPSExportTarget): Promise<void> {\n await target.writeText('properties', (await this.getProperties()).toString())\n }\n}\n","import type { HiPSInterpolation, ReprojectOptions } from './hips-types'\nimport type { LinearWCS } from './hips-wcs'\nimport { tilePixelLonLat } from './hips-wcs'\nimport type { HiPSTileMeta } from './hips-types'\n\nexport interface ReprojectSource {\n width: number\n height: number\n depth: number\n planes: Float64Array[]\n wcs: LinearWCS\n blankValue?: number\n}\n\nfunction getValue(\n plane: Float64Array,\n width: number,\n height: number,\n x: number,\n y: number,\n blankValue: number,\n): number {\n if (x < 0 || y < 0 || x >= width || y >= height) return blankValue\n return plane[y * width + x] ?? blankValue\n}\n\nfunction nearestSample(\n plane: Float64Array,\n width: number,\n height: number,\n x: number,\n y: number,\n blankValue: number,\n): number {\n return getValue(plane, width, height, Math.round(x), Math.round(y), blankValue)\n}\n\nfunction bilinearSample(\n plane: Float64Array,\n width: number,\n height: number,\n x: number,\n y: number,\n blankValue: number,\n): number {\n const x0 = Math.floor(x)\n const y0 = Math.floor(y)\n const x1 = x0 + 1\n const y1 = y0 + 1\n const tx = x - x0\n const ty = y - y0\n\n const v00 = getValue(plane, width, height, x0, y0, Number.NaN)\n const v10 = getValue(plane, width, height, x1, y0, Number.NaN)\n const v01 = getValue(plane, width, height, x0, y1, Number.NaN)\n const v11 = getValue(plane, width, height, x1, y1, Number.NaN)\n\n let acc = 0\n let wsum = 0\n const pairs: Array<[number, number]> = [\n [v00, (1 - tx) * (1 - ty)],\n [v10, tx * (1 - ty)],\n [v01, (1 - tx) * ty],\n [v11, tx * ty],\n ]\n\n for (const [value, weight] of pairs) {\n if (!Number.isFinite(value)) continue\n acc += value * weight\n wsum += weight\n }\n\n if (wsum === 0) return blankValue\n return acc / wsum\n}\n\nfunction cubic1D(p0: number, p1: number, p2: number, p3: number, t: number): number {\n const a = -0.5 * p0 + 1.5 * p1 - 1.5 * p2 + 0.5 * p3\n const b = p0 - 2.5 * p1 + 2 * p2 - 0.5 * p3\n const c = -0.5 * p0 + 0.5 * p2\n return ((a * t + b) * t + c) * t + p1\n}\n\nfunction bicubicSample(\n plane: Float64Array,\n width: number,\n height: number,\n x: number,\n y: number,\n blankValue: number,\n): number {\n const xBase = Math.floor(x)\n const yBase = Math.floor(y)\n const tx = x - xBase\n const ty = y - yBase\n\n const rows = new Float64Array(4)\n for (let m = -1; m <= 2; m++) {\n const samples = new Float64Array(4)\n for (let n = -1; n <= 2; n++) {\n samples[n + 1] = getValue(plane, width, height, xBase + n, yBase + m, Number.NaN)\n }\n if ([samples[0], samples[1], samples[2], samples[3]].some((v) => !Number.isFinite(v))) {\n return bilinearSample(plane, width, height, x, y, blankValue)\n }\n rows[m + 1] = cubic1D(samples[0]!, samples[1]!, samples[2]!, samples[3]!, tx)\n }\n\n return cubic1D(rows[0]!, rows[1]!, rows[2]!, rows[3]!, ty)\n}\n\nexport function samplePlane(\n plane: Float64Array,\n width: number,\n height: number,\n x: number,\n y: number,\n interpolation: HiPSInterpolation,\n blankValue: number,\n): number {\n if (interpolation === 'nearest') {\n return nearestSample(plane, width, height, x, y, blankValue)\n }\n if (interpolation === 'bicubic') {\n return bicubicSample(plane, width, height, x, y, blankValue)\n }\n return bilinearSample(plane, width, height, x, y, blankValue)\n}\n\nexport function reprojectToHiPSTile(\n source: ReprojectSource,\n meta: HiPSTileMeta,\n tileWidth: number,\n options: ReprojectOptions = {},\n): Float32Array {\n const blankValue = options.blankValue ?? source.blankValue ?? Number.NaN\n const interpolation = options.interpolation ?? 'bilinear'\n const planeLength = tileWidth * tileWidth\n const output = new Float32Array(planeLength * source.depth)\n\n for (let y = 0; y < tileWidth; y++) {\n for (let x = 0; x < tileWidth; x++) {\n const { lon, lat } = tilePixelLonLat(meta, x, y, tileWidth)\n const inPixel = source.wcs.worldToPixel(lon, lat)\n for (let z = 0; z < source.depth; z++) {\n const plane = source.planes[z]!\n const value = samplePlane(\n plane,\n source.width,\n source.height,\n inPixel.x,\n inPixel.y,\n interpolation,\n blankValue,\n )\n output[z * planeLength + y * tileWidth + x] = value\n }\n }\n }\n\n return output\n}\n\nexport function downsampleTile(\n data: Float32Array,\n width: number,\n depth: number,\n mode: 'mean' | 'nearest' = 'mean',\n): Float32Array {\n const outWidth = Math.max(1, Math.floor(width / 2))\n const out = new Float32Array(outWidth * outWidth * depth)\n const srcPlaneLen = width * width\n const dstPlaneLen = outWidth * outWidth\n\n for (let z = 0; z < depth; z++) {\n const srcBase = z * srcPlaneLen\n const dstBase = z * dstPlaneLen\n for (let y = 0; y < outWidth; y++) {\n for (let x = 0; x < outWidth; x++) {\n const sx = x * 2\n const sy = y * 2\n if (mode === 'nearest') {\n out[dstBase + y * outWidth + x] = data[srcBase + sy * width + sx] ?? Number.NaN\n continue\n }\n let acc = 0\n let count = 0\n for (let dy = 0; dy < 2; dy++) {\n for (let dx = 0; dx < 2; dx++) {\n const v = data[srcBase + (sy + dy) * width + (sx + dx)]\n if (v !== undefined && Number.isFinite(v)) {\n acc += v\n count++\n }\n }\n }\n out[dstBase + y * outWidth + x] = count > 0 ? acc / count : Number.NaN\n }\n }\n }\n\n return out\n}\n","import {\n ang2vec,\n max_pixrad,\n order2nside,\n pix2ang_nest,\n query_disc_inclusive_nest,\n} from '@hscmap/healpix'\nimport { FITS } from '../fits'\nimport { hipsAllskyPath, hipsTilePath } from './hips-path'\nimport { createDefaultHiPSProperties, HiPSProperties } from './hips-properties'\nimport { downsampleTile, reprojectToHiPSTile } from './hips-reproject'\nimport { encodeHiPSTile } from './hips-tile'\nimport type { ConvertFitsToHiPSOptions, FITSInput, HiPSBuildOptions } from './hips-types'\nimport { estimateOrderFromImageResolution, readLinearWCSFromHeader } from './hips-wcs'\nimport type { Image } from '../fits/image'\n\nfunction degToRad(value: number): number {\n return (value * Math.PI) / 180\n}\n\nfunction angularDistanceDeg(aLon: number, aLat: number, bLon: number, bLat: number): number {\n const aLonRad = degToRad(aLon)\n const aLatRad = degToRad(aLat)\n const bLonRad = degToRad(bLon)\n const bLatRad = degToRad(bLat)\n const cosD =\n Math.sin(aLatRad) * Math.sin(bLatRad) +\n Math.cos(aLatRad) * Math.cos(bLatRad) * Math.cos(aLonRad - bLonRad)\n const clamped = Math.max(-1, Math.min(1, cosD))\n return (Math.acos(clamped) * 180) / Math.PI\n}\n\nfunction asArrayBuffer(input: ArrayBuffer | Blob): Promise<ArrayBuffer> | ArrayBuffer {\n if (input instanceof ArrayBuffer) return input\n return input.arrayBuffer()\n}\n\nasync function parseInputFITS(input: FITSInput): Promise<FITS> {\n if (input instanceof FITS) return input\n return FITS.fromArrayBuffer(await asArrayBuffer(input))\n}\n\nfunction normalizeBuildOptions(options: HiPSBuildOptions): Required<\n Omit<HiPSBuildOptions, 'output' | 'propertiesOverrides'>\n> & {\n propertiesOverrides?: Record<string, string>\n} {\n return {\n title: options.title ?? 'fitsjs-ng HiPS dataset',\n creatorDid: options.creatorDid ?? 'ivo://fitsjs-ng/generated',\n hipsOrder: options.hipsOrder ?? 0,\n minOrder: options.minOrder ?? 0,\n tileWidth: options.tileWidth ?? 512,\n frame: options.frame ?? 'equatorial',\n formats: options.formats && options.formats.length > 0 ? options.formats : ['fits'],\n includeCompatibilityFields: options.includeCompatibilityFields ?? true,\n includeMoc: options.includeMoc ?? true,\n includeAllsky: options.includeAllsky ?? true,\n includeIndexHtml: options.includeIndexHtml ?? true,\n includeTreeTiles: options.includeTreeTiles ?? true,\n interpolation: options.interpolation ?? 'bilinear',\n blankValue: options.blankValue ?? Number.NaN,\n maxTilesPerOrder: options.maxTilesPerOrder ?? 200_000,\n propertiesOverrides: options.propertiesOverrides,\n }\n}\n\nfunction asFloat64(frame: ArrayLike<number | bigint>): Float64Array {\n if (frame instanceof Float64Array) return frame\n const out = new Float64Array(frame.length)\n for (let i = 0; i < frame.length; i++) out[i] = Number(frame[i] ?? Number.NaN)\n return out\n}\n\nfunction reduceToAllskyTile(\n tile: Float32Array,\n tileWidth: number,\n depth: number,\n targetWidth: number = 64,\n): Float32Array {\n if (tileWidth <= targetWidth) return tile\n let current = tile\n let currentWidth = tileWidth\n while (currentWidth > targetWidth) {\n current = downsampleTile(current, currentWidth, depth, 'mean')\n currentWidth = Math.max(1, Math.floor(currentWidth / 2))\n }\n return current\n}\n\nasync function createMocFitsFromTileCenters(\n coordsDeg: number[],\n order: number,\n): Promise<Uint8Array> {\n if (coordsDeg.length === 0) {\n return new Uint8Array()\n }\n try {\n const moc = await import('@fxpineau/moc-wasm')\n const coverage = moc.MOC.fromCoo(Math.min(29, order), new Float64Array(coordsDeg))\n return coverage.toFits(true)\n } catch {\n return new Uint8Array()\n }\n}\n\nfunction makeIndexHtml(title: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${title}</title>\n</head>\n<body>\n <script src=\"https://aladin.cds.unistra.fr/hips-templates/hips-landing-page.js\"></script>\n <script>buildLandingPage({alScriptURL:'https://aladin.cds.unistra.fr/AladinLite/api/v3/latest/aladin.js'})</script>\n</body>\n</html>\n`\n}\n\nfunction assertImageDataUnit(image: unknown): asserts image is Image {\n if (\n !image ||\n typeof image !== 'object' ||\n !('width' in image) ||\n !('height' in image) ||\n !('getFrame' in image)\n ) {\n throw new Error('FITS input does not contain an image data unit')\n }\n}\n\nexport interface HiPSBuildResult {\n properties: HiPSProperties\n maxOrder: number\n minOrder: number\n generatedTiles: number\n}\n\nexport async function buildHiPSFromFITS(\n input: FITSInput,\n options: HiPSBuildOptions,\n): Promise<HiPSBuildResult> {\n const normalized = normalizeBuildOptions(options)\n const fits = await parseInputFITS(input)\n const hdu = fits.getHDU()\n if (!hdu?.data) {\n throw new Error('No image HDU found in FITS input')\n }\n assertImageDataUnit(hdu.data)\n\n const image = hdu.data\n const sourceWCS = readLinearWCSFromHeader(hdu.header)\n const depth = image.depth\n const planes: Float64Array[] = []\n for (let z = 0; z < depth; z++) {\n planes.push(asFloat64(await image.getFrame(z)))\n }\n\n const autoOrder = estimateOrderFromImageResolution(\n image.width,\n image.height,\n normalized.tileWidth,\n )\n const maxOrder = normalized.hipsOrder > 0 ? normalized.hipsOrder : autoOrder\n const minOrder = Math.max(0, Math.min(normalized.minOrder, maxOrder))\n const firstOrder = normalized.includeTreeTiles ? minOrder : maxOrder\n\n const center = sourceWCS.pixelToWorld((image.width - 1) / 2, (image.height - 1) / 2)\n const corners = [\n sourceWCS.pixelToWorld(0, 0),\n sourceWCS.pixelToWorld(image.width - 1, 0),\n sourceWCS.pixelToWorld(0, image.height - 1),\n sourceWCS.pixelToWorld(image.width - 1, image.height - 1),\n ]\n let radiusDeg = 0\n for (const corner of corners) {\n radiusDeg = Math.max(\n radiusDeg,\n angularDistanceDeg(center.lon, center.lat, corner.lon, corner.lat),\n )\n }\n\n const tileCentersForMoc: number[] = []\n const order3AllskyTiles = new Map<number, Float32Array>()\n let generatedTiles = 0\n\n for (let order = firstOrder; order <= maxOrder; order++) {\n const nside = order2nside(order)\n const radiusRad = Math.min(Math.PI, degToRad(radiusDeg) + max_pixrad(nside))\n const centerVec = ang2vec(degToRad(90 - center.lat), degToRad(center.lon))\n const candidates: number[] = []\n query_disc_inclusive_nest(nside, centerVec, radiusRad, (ipix) => {\n candidates.push(ipix)\n })\n\n if (candidates.length > normalized.maxTilesPerOrder) {\n throw new Error(\n `Order ${order} would generate ${candidates.length} tiles, above maxTilesPerOrder=${normalized.maxTilesPerOrder}`,\n )\n }\n\n for (const ipix of candidates) {\n const tileMetaBase = {\n order,\n ipix,\n frame: normalized.frame,\n } as const\n\n const tile = reprojectToHiPSTile(\n {\n width: image.width,\n height: image.height,\n depth,\n planes,\n wcs: sourceWCS,\n blankValue: normalized.blankValue,\n },\n {\n ...tileMetaBase,\n format: 'fits',\n },\n normalized.tileWidth,\n {\n interpolation: normalized.interpolation,\n blankValue: normalized.blankValue,\n },\n )\n\n for (const format of normalized.formats) {\n if (depth > 1 && format !== 'fits') continue\n const encoded = encodeHiPSTile(\n {\n ...tileMetaBase,\n format,\n },\n tile,\n normalized.tileWidth,\n depth,\n )\n await options.output.writeBinary(\n hipsTilePath({\n ...tileMetaBase,\n format,\n }),\n encoded,\n )\n }\n\n generatedTiles++\n if (order === maxOrder && normalized.includeMoc) {\n const { theta, phi } = pix2ang_nest(nside, ipix)\n tileCentersForMoc.push((phi * 180) / Math.PI, 90 - (theta * 180) / Math.PI)\n }\n if (order === 3 && normalized.includeAllsky) {\n order3AllskyTiles.set(ipix, reduceToAllskyTile(tile, normalized.tileWidth, depth, 64))\n }\n }\n }\n\n const properties = createDefaultHiPSProperties({\n creatorDid: normalized.creatorDid,\n obsTitle: normalized.title,\n dataproductType: depth > 1 ? 'cube' : 'image',\n frame: normalized.frame,\n order: maxOrder,\n tileWidth: normalized.tileWidth,\n formats: normalized.formats,\n extras: normalized.propertiesOverrides,\n })\n properties.set('hips_order_min', minOrder)\n if (normalized.includeCompatibilityFields) {\n properties.withCompatibilityFields()\n }\n if (depth > 1) {\n properties\n .set('hips_cube_depth', depth)\n .set('hips_cube_firstframe', 0)\n .set('hips_allsky_restriction', 'non-fits allsky not generated for cube dataproduct')\n }\n await options.output.writeText('properties', properties.toString())\n\n if (normalized.includeAllsky && order3AllskyTiles.size > 0) {\n const allskyOrder = 3\n const allskyTileWidth = 64\n const npix = order2nside(allskyOrder)\n const totalTiles = 12 * npix * npix\n const cols = Math.ceil(Math.sqrt(totalTiles))\n const rows = Math.ceil(totalTiles / cols)\n const width = cols * allskyTileWidth\n const height = rows * allskyTileWidth\n const planeLen = width * height\n const allskyData = new Float32Array(planeLen * depth)\n allskyData.fill(Number.NaN)\n for (const [ipix, tile] of order3AllskyTiles.entries()) {\n const row = Math.floor(ipix / cols)\n const col = ipix % cols\n const srcPlaneLen = allskyTileWidth * allskyTileWidth\n for (let z = 0; z < depth; z++) {\n const srcBase = z * srcPlaneLen\n const dstBase = z * planeLen\n for (let y = 0; y < allskyTileWidth; y++) {\n const dy = row * allskyTileWidth + y\n for (let x = 0; x < allskyTileWidth; x++) {\n const dx = col * allskyTileWidth + x\n allskyData[dstBase + dy * width + dx] =\n tile[srcBase + y * allskyTileWidth + x] ?? Number.NaN\n }\n }\n }\n }\n\n for (const format of normalized.formats) {\n if (depth > 1 && format !== 'fits') continue\n const encoded = encodeHiPSTile(\n {\n order: allskyOrder,\n ipix: 0,\n frame: normalized.frame,\n format,\n },\n allskyData,\n width,\n depth,\n )\n await options.output.writeBinary(hipsAllskyPath(format), encoded)\n }\n }\n\n if (normalized.includeMoc) {\n const mocFits = await createMocFitsFromTileCenters(tileCentersForMoc, maxOrder)\n if (mocFits.byteLength > 0) {\n await options.output.writeBinary('Moc.fits', mocFits)\n }\n }\n\n if (normalized.includeIndexHtml) {\n await options.output.writeText('index.html', makeIndexHtml(normalized.title))\n }\n\n return {\n properties,\n maxOrder,\n minOrder,\n generatedTiles,\n }\n}\n\nexport async function convertFitsToHiPS(\n input: FITSInput,\n options: ConvertFitsToHiPSOptions,\n): Promise<HiPSBuildResult> {\n return buildHiPSFromFITS(input, options)\n}\n","import type { HiPSCutoutOptions, HiPSRemoteOptions } from './hips-types'\n\nconst DEFAULT_ENDPOINT = 'https://alasky.cds.unistra.fr/hips-image-services/hips2fits'\nconst DEFAULT_ENDPOINT_FALLBACK = 'https://alaskybis.cds.unistra.fr/hips-image-services/hips2fits'\n\nfunction appendCutoutParams(url: URL, hipsId: string, cutout: HiPSCutoutOptions): void {\n url.searchParams.set('hips', hipsId)\n url.searchParams.set('width', String(cutout.width))\n url.searchParams.set('height', String(cutout.height))\n url.searchParams.set('format', cutout.format ?? 'fits')\n\n if (cutout.wcs) {\n url.searchParams.set('wcs', JSON.stringify(cutout.wcs))\n } else {\n url.searchParams.set('projection', cutout.projection ?? 'TAN')\n if (cutout.fov !== undefined) url.searchParams.set('fov', String(cutout.fov))\n if (cutout.ra !== undefined) url.searchParams.set('ra', String(cutout.ra))\n if (cutout.dec !== undefined) url.searchParams.set('dec', String(cutout.dec))\n if (cutout.coordsys) url.searchParams.set('coordsys', cutout.coordsys)\n if (cutout.rotationAngle !== undefined) {\n url.searchParams.set('rotation_angle', String(cutout.rotationAngle))\n }\n }\n}\n\nasync function fetchWithTimeout(url: URL, timeoutMs: number): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n try {\n return await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n headers: {\n Accept: 'application/fits,application/octet-stream,*/*',\n },\n })\n } finally {\n clearTimeout(timer)\n }\n}\n\nexport async function requestHiPS2FITS(\n hipsId: string,\n cutout: HiPSCutoutOptions,\n options: HiPSRemoteOptions = {},\n): Promise<ArrayBuffer> {\n const timeoutMs = options.timeoutMs ?? 25_000\n const endpoints = [\n options.endpoint ?? DEFAULT_ENDPOINT,\n options.endpointFallback ?? DEFAULT_ENDPOINT_FALLBACK,\n ]\n let lastError: unknown\n\n for (const endpoint of endpoints) {\n try {\n const url = new URL(endpoint)\n appendCutoutParams(url, hipsId, cutout)\n const response = await fetchWithTimeout(url, timeoutMs)\n if (!response.ok) {\n throw new Error(`hips2fits request failed (${response.status} ${response.statusText})`)\n }\n return await response.arrayBuffer()\n } catch (error) {\n lastError = error\n }\n }\n\n throw new Error(`hips2fits unavailable: ${String(lastError)}`)\n}\n","import { bit_combine, nside2npix, nest2ring, order2nside, za2tu } from '@hscmap/healpix'\nimport { createImageBytesFromArray, createImageHDU, writeFITS } from '../fits/fits-writer'\nimport { HiPS } from './'\nimport { samplePlane } from './hips-reproject'\nimport { requestHiPS2FITS } from './hips-remote'\nimport { encodeHiPSTile } from './hips-tile'\nimport type {\n ConvertHiPSToFITSOptions,\n HiPSCutoutOptions,\n HiPSInput,\n HiPSMapOrdering,\n HiPSMapResult,\n HiPSTileMeta,\n} from './hips-types'\nimport { createLinearWCS, readWCSFromCards } from './hips-wcs'\n\nfunction frameToCoordSys(frame: string): string {\n if (frame === 'galactic') return 'G'\n if (frame === 'ecliptic') return 'E'\n return 'C'\n}\n\nfunction wrap(value: number, modulo: number): number {\n return value < 0 ? modulo - (-value % modulo) : value % modulo\n}\n\nfunction clip(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value\n}\n\nfunction lonLatToNestedTileSample(\n order: number,\n tileWidth: number,\n lon: number,\n lat: number,\n): {\n ipix: number\n x: number\n y: number\n} {\n const theta = ((90 - lat) * Math.PI) / 180\n const phi = wrap((lon * Math.PI) / 180, 2 * Math.PI)\n const z = Math.cos(theta)\n const { t: tRaw, u: uRaw } = za2tu(z, phi)\n\n const pi4 = Math.PI / 4\n let t = tRaw / pi4\n let u = uRaw / pi4\n t = wrap(t, 8)\n t -= 4\n u += 5\n\n const pp = clip((u + t) / 2, 0, 5)\n const ppi = Math.floor(pp)\n const qq = clip((u - t) / 2, 3 - ppi, 6 - ppi)\n const qqi = Math.floor(qq)\n const v = 5 - (ppi + qqi)\n const h = ppi - qqi + 4\n const f = 4 * v + ((h >> 1) % 4)\n const p = pp - ppi\n const q = qq - qqi\n\n const nside = order2nside(order)\n const xFloat = nside * p\n const yFloat = nside * q\n const xInt = Math.max(0, Math.min(nside - 1, Math.floor(xFloat)))\n const yInt = Math.max(0, Math.min(nside - 1, Math.floor(yFloat)))\n const ipix = f * nside * nside + bit_combine(xInt, yInt)\n return {\n ipix,\n x: (xFloat - xInt) * tileWidth,\n y: (yFloat - yInt) * tileWidth,\n }\n}\n\nfunction buildCutoutWCS(cutout: HiPSCutoutOptions) {\n if (cutout.wcs) {\n return readWCSFromCards(\n Object.fromEntries(Object.entries(cutout.wcs).map(([k, v]) => [k.toUpperCase(), v])),\n )\n }\n const projection = (cutout.projection ?? 'TAN').toUpperCase()\n const half = Math.max(cutout.width, cutout.height)\n const fov = cutout.fov ?? 1\n const cdelt = fov / half\n return createLinearWCS({\n ctype1: `RA---${projection}`,\n ctype2: `DEC--${projection}`,\n crpix1: cutout.width / 2 + 0.5,\n crpix2: cutout.height / 2 + 0.5,\n crval1: cutout.ra ?? 0,\n crval2: cutout.dec ?? 0,\n cdelt1: -cdelt,\n cdelt2: cdelt,\n crota2: cutout.rotationAngle ?? 0,\n })\n}\n\nasync function exportTileFITS(\n hips: HiPS,\n options: NonNullable<ConvertHiPSToFITSOptions['tile']>,\n): Promise<ArrayBuffer> {\n const props = await hips.getProperties()\n const frame = (props.get('hips_frame') as HiPSTileMeta['frame']) ?? 'equatorial'\n const tile = await hips.readTile({\n order: options.order,\n ipix: options.ipix,\n frame,\n format: options.format,\n })\n const data = toFloat32Values(tile.data)\n const encoded = encodeHiPSTile(\n {\n order: options.order,\n ipix: options.ipix,\n frame,\n format: 'fits',\n },\n data,\n tile.width,\n tile.depth,\n )\n return encoded.slice().buffer\n}\n\nfunction encodeFloat32BigEndian(values: Float32Array): Uint8Array {\n const out = new Uint8Array(values.length * 4)\n const view = new DataView(out.buffer)\n for (let i = 0; i < values.length; i++) {\n view.setFloat32(i * 4, values[i] ?? Number.NaN, false)\n }\n return out\n}\n\nfunction createPrimaryNoDataHDU() {\n return {\n cards: [\n { key: 'SIMPLE', value: true, comment: 'Standard FITS' },\n { key: 'BITPIX', value: 8, comment: 'Character data' },\n { key: 'NAXIS', value: 0, comment: 'No data in primary HDU' },\n { key: 'EXTEND', value: true, comment: 'Extensions may be present' },\n ],\n }\n}\n\nfunction toFloat32Values(input: ArrayLike<number | bigint>): Float32Array {\n if (input instanceof Float32Array) return input\n const out = new Float32Array(input.length)\n for (let i = 0; i < input.length; i++) {\n out[i] = Number(input[i] ?? Number.NaN)\n }\n return out\n}\n\nfunction toFloat64Values(input: ArrayLike<number | bigint>): Float64Array {\n if (input instanceof Float64Array) return input\n const out = new Float64Array(input.length)\n for (let i = 0; i < input.length; i++) {\n out[i] = Number(input[i] ?? Number.NaN)\n }\n return out\n}\n\nasync function exportMapFITS(\n hips: HiPS,\n options: NonNullable<ConvertHiPSToFITSOptions['map']>,\n): Promise<{\n fits: ArrayBuffer\n map: HiPSMapResult\n}> {\n const props = await hips.getProperties()\n const order = options.order ?? Number(props.get('hips_order') ?? 0)\n const frame = options.frame ?? (props.get('hips_frame') as HiPSTileMeta['frame']) ?? 'equatorial'\n const ordering: HiPSMapOrdering = options.ordering ?? 'NESTED'\n const nside = order2nside(order)\n const npix = nside2npix(nside)\n const values = new Float32Array(npix)\n values.fill(Number.NaN)\n\n for (let ipix = 0; ipix < npix; ipix++) {\n try {\n const tile = await hips.readTile({ order, ipix, frame })\n const array = tile.data\n let sum = 0\n let count = 0\n for (let i = 0; i < array.length; i++) {\n const value = Number(array[i] ?? Number.NaN)\n if (!Number.isFinite(value)) continue\n sum += value\n count++\n }\n const targetIpix = ordering === 'RING' ? nest2ring(nside, ipix) : ipix\n values[targetIpix] = count > 0 ? sum / count : Number.NaN\n } catch {\n continue\n }\n }\n\n const bytes = encodeFloat32BigEndian(values)\n const bintableHDU = {\n cards: [\n { key: 'XTENSION', value: 'BINTABLE', comment: 'HEALPix map table' },\n { key: 'BITPIX', value: 8 },\n { key: 'NAXIS', value: 2 },\n { key: 'NAXIS1', value: 4 },\n { key: 'NAXIS2', value: npix },\n { key: 'PCOUNT', value: 0 },\n { key: 'GCOUNT', value: 1 },\n { key: 'TFIELDS', value: 1 },\n { key: 'TTYPE1', value: options.columnName ?? 'SIGNAL' },\n { key: 'TFORM1', value: 'E' },\n { key: 'ORDERING', value: ordering },\n { key: 'INDXSCHM', value: 'IMPLICIT' },\n { key: 'NSIDE', value: nside },\n { key: 'FIRSTPIX', value: 0 },\n { key: 'LASTPIX', value: npix - 1 },\n { key: 'COORDSYS', value: frameToCoordSys(frame) },\n ],\n data: bytes,\n }\n return {\n fits: writeFITS([createPrimaryNoDataHDU(), bintableHDU]),\n map: { order, nside, ordering, values },\n }\n}\n\nasync function sampleHiPS(\n hips: HiPS,\n lon: number,\n lat: number,\n order: number,\n tileWidth: number,\n frame: HiPSTileMeta['frame'],\n interpolation: NonNullable<HiPSCutoutOptions['interpolation']>,\n cache: Map<number, Float64Array>,\n): Promise<number> {\n const sample = lonLatToNestedTileSample(order, tileWidth, lon, lat)\n const ipix = sample.ipix\n let tile = cache.get(ipix)\n if (!tile) {\n const decoded = await hips.readTile({ order, ipix, frame })\n tile = toFloat64Values(decoded.data)\n cache.set(ipix, tile)\n }\n return samplePlane(tile, tileWidth, tileWidth, sample.x, sample.y, interpolation, Number.NaN)\n}\n\nasync function exportCutoutLocal(hips: HiPS, cutout: HiPSCutoutOptions): Promise<ArrayBuffer> {\n const props = await hips.getProperties()\n const frame = (props.get('hips_frame') as HiPSTileMeta['frame']) ?? 'equatorial'\n const order = Number(props.get('hips_order') ?? 0)\n const tileWidth = Number(props.get('hips_tile_width') ?? 512)\n const wcs = buildCutoutWCS(cutout)\n const values = new Float32Array(cutout.width * cutout.height)\n const cache = new Map<number, Float64Array>()\n const interpolation = cutout.interpolation ?? 'bilinear'\n\n for (let y = 0; y < cutout.height; y++) {\n for (let x = 0; x < cutout.width; x++) {\n const world = wcs.pixelToWorld(x, y)\n values[y * cutout.width + x] = await sampleHiPS(\n hips,\n world.lon,\n world.lat,\n order,\n tileWidth,\n frame,\n interpolation,\n cache,\n )\n }\n }\n\n const cards = [\n { key: 'CTYPE1', value: wcs.definition.ctype1 },\n { key: 'CTYPE2', value: wcs.definition.ctype2 },\n { key: 'CRPIX1', value: wcs.definition.crpix1 },\n { key: 'CRPIX2', value: wcs.definition.crpix2 },\n { key: 'CRVAL1', value: wcs.definition.crval1 },\n { key: 'CRVAL2', value: wcs.definition.crval2 },\n { key: 'CDELT1', value: wcs.definition.cdelt1 ?? -1 },\n { key: 'CDELT2', value: wcs.definition.cdelt2 ?? 1 },\n { key: 'HIPSORD', value: order },\n { key: 'HIPSFWID', value: tileWidth },\n ]\n const hdu = createImageHDU({\n primary: true,\n width: cutout.width,\n height: cutout.height,\n bitpix: -32,\n data: createImageBytesFromArray(values, -32),\n additionalCards: cards,\n })\n return writeFITS([hdu])\n}\n\nexport async function convertHiPSToFITS(\n input: HiPSInput | HiPS,\n options: ConvertHiPSToFITSOptions = {},\n): Promise<ArrayBuffer> {\n const hips = input instanceof HiPS ? input : new HiPS(input)\n const backend = options.backend ?? 'local'\n\n let output: ArrayBuffer\n if (options.tile) {\n output = await exportTileFITS(hips, options.tile)\n } else if (options.map) {\n output = (await exportMapFITS(hips, options.map)).fits\n } else {\n const cutout = options.cutout ?? {\n width: 512,\n height: 512,\n projection: 'TAN',\n ra: 0,\n dec: 0,\n fov: 1,\n backend: backend,\n }\n\n if (backend === 'remote') {\n if (!options.cutout?.hipsId && !options.hipsId) {\n throw new Error('hipsId is required when backend=remote')\n }\n output = await requestHiPS2FITS(options.cutout?.hipsId ?? options.hipsId!, cutout, options)\n } else if (backend === 'auto') {\n try {\n output = await exportCutoutLocal(hips, cutout)\n } catch (localError) {\n const hipsId = options.cutout?.hipsId ?? options.hipsId\n if (!hipsId) throw localError\n output = await requestHiPS2FITS(hipsId, cutout, options)\n }\n } else {\n output = await exportCutoutLocal(hips, cutout)\n }\n }\n\n if (options.output) {\n await options.output.writeBinary('output.fits', new Uint8Array(output))\n }\n\n return output\n}\n","import { convertFitsToXisf, convertXisfToFits } from '../xisf/convert'\nimport { convertFitsToHiPS, type HiPSBuildResult } from './hips-build'\nimport { convertHiPSToFITS } from './hips-export'\nimport { XISF } from '../xisf'\nimport { XISFConversionError } from '../xisf/xisf-errors'\nimport { XISFWriter } from '../xisf/xisf-writer'\nimport type { ConvertHiPSToXisfOptions, ConvertXisfToHiPSOptions, HiPSInput } from './hips-types'\nimport type { XISFImage, XISFUnit } from '../xisf/xisf-types'\n\nfunction cloneImage(image: XISFImage): XISFImage {\n return {\n ...image,\n geometry: [...image.geometry],\n bounds: image.bounds ? [image.bounds[0], image.bounds[1]] : undefined,\n properties: image.properties.map((property) => ({ ...property })),\n tables: image.tables.map((table) => ({\n ...table,\n structure: table.structure.map((field) => ({ ...field })),\n dataRows: table.dataRows.map((row) => ({\n cells: row.cells.map((cell) => ({ ...cell })),\n })),\n })),\n fitsKeywords: image.fitsKeywords.map((keyword) => ({ ...keyword })),\n dataBlock: {\n ...image.dataBlock,\n location: { ...image.dataBlock.location },\n },\n data: image.data ? new Uint8Array(image.data) : undefined,\n }\n}\n\nasync function normalizeXisfInput(\n input: ArrayBuffer | Blob | XISF,\n options?: ConvertXisfToHiPSOptions['xisfReadOptions'],\n): Promise<XISF> {\n if (input instanceof XISF) {\n return input\n }\n const buffer = input instanceof ArrayBuffer ? input : await input.arrayBuffer()\n return XISF.fromArrayBuffer(buffer, { ...options, decodeImageData: true })\n}\n\nexport async function convertXisfToHiPS(\n input: ArrayBuffer | Blob | XISF,\n options: ConvertXisfToHiPSOptions,\n): Promise<HiPSBuildResult> {\n const { imageIndex = 0, xisfReadOptions, ...hipsOptions } = options\n const xisf = await normalizeXisfInput(input, xisfReadOptions)\n\n const selected = xisf.unit.images[imageIndex]\n if (!selected) {\n throw new XISFConversionError(\n `XISF imageIndex ${imageIndex} is out of range (images=${xisf.unit.images.length})`,\n )\n }\n if (selected.sampleFormat === 'Complex32' || selected.sampleFormat === 'Complex64') {\n throw new XISFConversionError('Complex XISF images cannot be converted to HiPS image/cube')\n }\n if (!selected.data) {\n throw new XISFConversionError('Selected XISF image has no decoded data')\n }\n\n const unit: XISFUnit = {\n metadata: xisf.unit.metadata.map((property) => ({ ...property })),\n images: [cloneImage(selected)],\n standaloneProperties: xisf.unit.standaloneProperties.map((property) => ({ ...property })),\n standaloneTables: xisf.unit.standaloneTables.map((table) => ({\n ...table,\n structure: table.structure.map((field) => ({ ...field })),\n dataRows: table.dataRows.map((row) => ({\n cells: row.cells.map((cell) => ({ ...cell })),\n })),\n })),\n version: xisf.unit.version,\n signature: { ...xisf.unit.signature },\n }\n\n const selectedXisf = await XISFWriter.toMonolithic(unit)\n const fits = await convertXisfToFits(selectedXisf, {\n strictValidation: xisfReadOptions?.strictValidation,\n includeXisfMetaExtension: false,\n })\n return convertFitsToHiPS(fits, hipsOptions)\n}\n\nexport async function convertHiPSToXisf(\n input: HiPSInput,\n options: ConvertHiPSToXisfOptions = {},\n): Promise<ArrayBuffer | { header: Uint8Array; blocks: Record<string, Uint8Array> }> {\n const { distributed, writeOptions, conversionOptions, ...hipsOptions } = options\n const fits = await convertHiPSToFITS(input, hipsOptions)\n return convertFitsToXisf(fits, {\n ...(conversionOptions ?? {}),\n distributed,\n writeOptions,\n })\n}\n","import { zipSync } from 'fflate'\nimport { importNodeModule } from '../core/runtime'\nimport type { HiPSExportTarget } from './hips-types'\n\nfunction toUint8Array(data: Uint8Array | ArrayBuffer): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data)\n}\n\nfunction normalizePath(path: string): string {\n return path.replaceAll('\\\\', '/').replace(/^\\/+/u, '')\n}\n\nasync function ensureNodeModules(): Promise<{\n fs: {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>\n writeFile(path: string, data: Uint8Array | string, encoding?: 'utf8'): Promise<void>\n readFile(path: string): Promise<Uint8Array>\n readFile(path: string, encoding: 'utf8'): Promise<string>\n access(path: string): Promise<void>\n }\n path: { join(...paths: string[]): string; dirname(path: string): string }\n}> {\n const [fs, path] = await Promise.all([\n importNodeModule<{\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>\n writeFile(path: string, data: Uint8Array | string, encoding?: 'utf8'): Promise<void>\n readFile(path: string): Promise<Uint8Array>\n readFile(path: string, encoding: 'utf8'): Promise<string>\n access(path: string): Promise<void>\n }>(\n 'fs/promises',\n 'NodeFSTarget filesystem access',\n 'Use BrowserZipTarget or a custom HiPSExportTarget in browser/React Native.',\n ),\n importNodeModule<{ join(...paths: string[]): string; dirname(path: string): string }>(\n 'path',\n 'NodeFSTarget filesystem access',\n 'Use BrowserZipTarget or a custom HiPSExportTarget in browser/React Native.',\n ),\n ])\n return { fs, path }\n}\n\nexport class NodeFSTarget implements HiPSExportTarget {\n constructor(public readonly root: string) {}\n\n private async absolute(relativePath: string): Promise<string> {\n const { path } = await ensureNodeModules()\n return path.join(this.root, normalizePath(relativePath))\n }\n\n async writeBinary(path: string, data: Uint8Array | ArrayBuffer): Promise<void> {\n const { fs, path: pathApi } = await ensureNodeModules()\n const targetPath = await this.absolute(path)\n await fs.mkdir(pathApi.dirname(targetPath), { recursive: true })\n await fs.writeFile(targetPath, toUint8Array(data))\n }\n\n async writeText(path: string, text: string): Promise<void> {\n const { fs, path: pathApi } = await ensureNodeModules()\n const targetPath = await this.absolute(path)\n await fs.mkdir(pathApi.dirname(targetPath), { recursive: true })\n await fs.writeFile(targetPath, text, 'utf8')\n }\n\n async readBinary(path: string): Promise<Uint8Array> {\n const { fs } = await ensureNodeModules()\n const targetPath = await this.absolute(path)\n const content = await fs.readFile(targetPath)\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength)\n }\n\n async readText(path: string): Promise<string> {\n const { fs } = await ensureNodeModules()\n const targetPath = await this.absolute(path)\n return fs.readFile(targetPath, 'utf8')\n }\n\n async exists(path: string): Promise<boolean> {\n const { fs } = await ensureNodeModules()\n try {\n await fs.access(await this.absolute(path))\n return true\n } catch {\n return false\n }\n }\n}\n\nexport class BrowserZipTarget implements HiPSExportTarget {\n private readonly entries = new Map<string, Uint8Array>()\n\n async writeBinary(path: string, data: Uint8Array | ArrayBuffer): Promise<void> {\n this.entries.set(normalizePath(path), toUint8Array(data))\n }\n\n async writeText(path: string, text: string): Promise<void> {\n this.entries.set(normalizePath(path), new TextEncoder().encode(text))\n }\n\n async readBinary(path: string): Promise<Uint8Array> {\n const content = this.entries.get(normalizePath(path))\n if (!content) {\n throw new Error(`Missing ZIP entry: ${path}`)\n }\n return content\n }\n\n async readText(path: string): Promise<string> {\n const data = await this.readBinary(path)\n return new TextDecoder().decode(data)\n }\n\n async exists(path: string): Promise<boolean> {\n return this.entries.has(normalizePath(path))\n }\n\n async finalize(): Promise<Blob | Uint8Array> {\n const files: Record<string, Uint8Array> = {}\n for (const [key, value] of this.entries.entries()) {\n files[key] = value\n }\n const zipped = zipSync(files, { level: 6 })\n if (typeof Blob !== 'undefined') {\n const blobPayload = new Uint8Array(zipped.byteLength)\n blobPayload.set(zipped)\n return new Blob([blobPayload.buffer], { type: 'application/zip' })\n }\n return zipped\n }\n}\n\ninterface FileSystemDirectoryHandleLike {\n getFileHandle(name: string, options?: { create?: boolean }): Promise<FileSystemFileHandleLike>\n getDirectoryHandle(\n name: string,\n options?: { create?: boolean },\n ): Promise<FileSystemDirectoryHandleLike>\n}\n\ninterface FileSystemFileHandleLike {\n createWritable(): Promise<WritableStreamLike>\n getFile(): Promise<File>\n}\n\ninterface WritableStreamLike {\n write(data: Uint8Array | string): Promise<void>\n close(): Promise<void>\n}\n\nfunction hasOPFS(): boolean {\n return typeof navigator !== 'undefined' && Boolean(navigator.storage?.getDirectory)\n}\n\nexport class BrowserOPFSTarget implements HiPSExportTarget {\n private rootHandlePromise?: Promise<FileSystemDirectoryHandleLike>\n\n constructor(private readonly baseDir: string = 'fitsjs-hips') {}\n\n private async rootHandle(): Promise<FileSystemDirectoryHandleLike> {\n if (!hasOPFS()) {\n throw new Error('OPFS is not available in this environment')\n }\n if (!this.rootHandlePromise) {\n this.rootHandlePromise = (async () => {\n const root = await navigator.storage.getDirectory()\n return root.getDirectoryHandle(this.baseDir, {\n create: true,\n }) as Promise<FileSystemDirectoryHandleLike>\n })()\n }\n return this.rootHandlePromise\n }\n\n private async walk(\n path: string,\n create: boolean,\n ): Promise<{\n dir: FileSystemDirectoryHandleLike\n filename: string\n }> {\n const segments = normalizePath(path).split('/').filter(Boolean)\n if (segments.length === 0) {\n throw new Error('Path must not be empty')\n }\n const filename = segments.pop()!\n let dir = await this.rootHandle()\n for (const segment of segments) {\n dir = await dir.getDirectoryHandle(segment, { create })\n }\n return { dir, filename }\n }\n\n async writeBinary(path: string, data: Uint8Array | ArrayBuffer): Promise<void> {\n const { dir, filename } = await this.walk(path, true)\n const fileHandle = await dir.getFileHandle(filename, { create: true })\n const writable = await fileHandle.createWritable()\n await writable.write(toUint8Array(data))\n await writable.close()\n }\n\n async writeText(path: string, text: string): Promise<void> {\n const { dir, filename } = await this.walk(path, true)\n const fileHandle = await dir.getFileHandle(filename, { create: true })\n const writable = await fileHandle.createWritable()\n await writable.write(text)\n await writable.close()\n }\n\n async readBinary(path: string): Promise<Uint8Array> {\n const { dir, filename } = await this.walk(path, false)\n const fileHandle = await dir.getFileHandle(filename)\n const file = await fileHandle.getFile()\n return new Uint8Array(await file.arrayBuffer())\n }\n\n async readText(path: string): Promise<string> {\n const bytes = await this.readBinary(path)\n return new TextDecoder().decode(bytes)\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.readBinary(path)\n return true\n } catch {\n return false\n }\n }\n}\n","import { parseHiPSTilePath } from '../hips/hips-path'\nimport { HiPS } from '../hips'\nimport type { HiPSInput } from '../hips/hips-types'\nimport { importNodeModule, isNodeRuntime } from '../core/runtime'\n\nexport interface HiPSLintIssue {\n level: 'error' | 'warning'\n code: string\n message: string\n path?: string\n}\n\nexport interface HiPSLintReport {\n ok: boolean\n issues: HiPSLintIssue[]\n}\n\nfunction isUrl(value: string): boolean {\n return /^https?:\\/\\//iu.test(value)\n}\n\ninterface NodeFsLike {\n readdir(\n path: string,\n options: { withFileTypes: true },\n ): Promise<Array<{ isDirectory(): boolean; name: string }>>\n access(path: string): Promise<void>\n}\n\ninterface NodePathLike {\n join(...paths: string[]): string\n relative(from: string, to: string): string\n}\n\nasync function ensureNodeModules(context: string): Promise<{\n fs: NodeFsLike\n pathApi: NodePathLike\n}> {\n const [fs, pathApi] = await Promise.all([\n importNodeModule<NodeFsLike>(\n 'fs/promises',\n context,\n 'Use URL-based HiPS linting or run lintHiPS local-path checks in Node.js.',\n ),\n importNodeModule<NodePathLike>(\n 'path',\n context,\n 'Use URL-based HiPS linting or run lintHiPS local-path checks in Node.js.',\n ),\n ])\n return { fs, pathApi }\n}\n\nasync function lintLocalStructure(root: string): Promise<HiPSLintIssue[]> {\n const issues: HiPSLintIssue[] = []\n const { fs, pathApi } = await ensureNodeModules('HiPS local structure lint')\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const full = pathApi.join(dir, entry.name)\n const relative = pathApi.relative(root, full).replaceAll('\\\\', '/')\n if (entry.isDirectory()) {\n await walk(full)\n continue\n }\n\n if (relative === 'properties' || relative === 'Moc.fits' || relative === 'index.html') {\n continue\n }\n if (/^Norder\\d+\\/Allsky\\.(fits|png|jpg)$/iu.test(relative)) {\n continue\n }\n if (relative.startsWith('Norder')) {\n const parsed = parseHiPSTilePath(relative)\n if (!parsed) {\n issues.push({\n level: 'warning',\n code: 'UNRECOGNIZED_TILE_NAME',\n message: `Unrecognized tile file path pattern: ${relative}`,\n path: relative,\n })\n }\n }\n }\n }\n\n await walk(root)\n return issues\n}\n\nasync function lintLocalStructureWithProperties(\n root: string,\n properties: Awaited<ReturnType<HiPS['getProperties']>>,\n): Promise<HiPSLintIssue[]> {\n const issues: HiPSLintIssue[] = []\n const { fs, pathApi } = await ensureNodeModules('HiPS local structure lint')\n const maxOrderRaw = properties.get('hips_order')\n const maxOrder = maxOrderRaw !== undefined ? Number(maxOrderRaw) : undefined\n const dataproduct = properties.get('dataproduct_type')\n const allowedFormats = new Set(\n (properties.get('hips_tile_format') ?? 'fits')\n .split(/[,\\s]+/u)\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean)\n .map((fmt) => (fmt === 'jpg' ? 'jpeg' : fmt)),\n )\n let tileCount = 0\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const full = pathApi.join(dir, entry.name)\n const relative = pathApi.relative(root, full).replaceAll('\\\\', '/')\n if (entry.isDirectory()) {\n await walk(full)\n continue\n }\n\n if (relative === 'properties' || relative === 'Moc.fits' || relative === 'index.html') {\n continue\n }\n const allsky = /^Norder(\\d+)\\/Allsky\\.(fits|png|jpg)$/iu.exec(relative)\n if (allsky) {\n const order = Number(allsky[1])\n const format = allsky[2]?.toLowerCase() === 'jpg' ? 'jpeg' : allsky[2]?.toLowerCase()\n if (order !== 3) {\n issues.push({\n level: 'warning',\n code: 'ALLSKY_ORDER_UNEXPECTED',\n message: `Allsky should be generated at Norder3, found Norder${order}`,\n path: relative,\n })\n }\n if (format && allowedFormats.size > 0 && !allowedFormats.has(format)) {\n issues.push({\n level: 'warning',\n code: 'ALLSKY_FORMAT_UNDECLARED',\n message: `Allsky format ${format} is not listed in hips_tile_format`,\n path: relative,\n })\n }\n continue\n }\n if (relative.startsWith('Norder')) {\n const parsed = parseHiPSTilePath(relative)\n if (!parsed) {\n issues.push({\n level: 'warning',\n code: 'UNRECOGNIZED_TILE_NAME',\n message: `Unrecognized tile file path pattern: ${relative}`,\n path: relative,\n })\n } else {\n tileCount++\n if (Number.isInteger(maxOrder) && parsed.order > (maxOrder as number)) {\n issues.push({\n level: 'warning',\n code: 'TILE_ORDER_EXCEEDS_MAX',\n message: `Tile order ${parsed.order} exceeds hips_order=${maxOrder}`,\n path: relative,\n })\n }\n if (allowedFormats.size > 0 && !allowedFormats.has(parsed.format)) {\n issues.push({\n level: 'warning',\n code: 'TILE_FORMAT_UNDECLARED',\n message: `Tile format ${parsed.format} is not listed in hips_tile_format`,\n path: relative,\n })\n }\n if (dataproduct === 'cube' && parsed.spectralOrder === undefined) {\n issues.push({\n level: 'warning',\n code: 'CUBE_TILE_PATTERN_EXPECTED',\n message: 'Cube dataproduct expects spectral tile naming pattern',\n path: relative,\n })\n }\n if (dataproduct !== 'cube' && parsed.spectralOrder !== undefined) {\n issues.push({\n level: 'warning',\n code: 'UNEXPECTED_CUBE_TILE_PATTERN',\n message: 'Found spectral tile naming in non-cube dataset',\n path: relative,\n })\n }\n }\n }\n }\n }\n\n await walk(root)\n if (tileCount === 0) {\n issues.push({\n level: 'warning',\n code: 'NO_TILES_FOUND',\n message: 'No valid HiPS tile files were discovered',\n })\n }\n return issues\n}\n\nexport async function lintHiPS(source: HiPSInput): Promise<HiPSLintReport> {\n const hips = new HiPS(source)\n const issues: HiPSLintIssue[] = []\n\n try {\n const properties = await hips.getProperties()\n const validation = properties.validate()\n for (const key of validation.missing) {\n issues.push({\n level: 'error',\n code: 'MISSING_PROPERTY',\n message: `Required property is missing: ${key}`,\n path: 'properties',\n })\n }\n for (const issue of validation.invalid) {\n issues.push({\n level: 'error',\n code: 'INVALID_PROPERTY',\n message: `Invalid property value: ${issue}`,\n path: 'properties',\n })\n }\n for (const warning of validation.warnings) {\n issues.push({\n level: 'warning',\n code: 'PROPERTY_WARNING',\n message: warning,\n path: 'properties',\n })\n }\n\n if (\n !(await hips\n .readAllsky()\n .then(() => true)\n .catch(() => false))\n ) {\n issues.push({\n level: 'warning',\n code: 'ALLSKY_MISSING',\n message: 'No Allsky file found in declared formats',\n })\n }\n\n let hasMoc = false\n if (typeof source === 'object' && source !== null && 'exists' in source) {\n hasMoc = await source.exists('Moc.fits')\n } else if (typeof source === 'string' && !isUrl(source)) {\n try {\n const { fs, pathApi } = await ensureNodeModules('HiPS local Moc.fits check')\n await fs.access(pathApi.join(source, 'Moc.fits'))\n hasMoc = true\n } catch {\n hasMoc = false\n }\n } else if (typeof source === 'string' && isUrl(source)) {\n try {\n const response = await fetch(\n new URL('Moc.fits', `${source.replace(/\\/+$/u, '')}/`).toString(),\n { method: 'HEAD' },\n )\n hasMoc = response.ok\n } catch {\n hasMoc = false\n }\n }\n if (!hasMoc) {\n issues.push({\n level: 'warning',\n code: 'MOC_MISSING',\n message: 'Moc.fits not found',\n })\n }\n } catch (error) {\n issues.push({\n level: 'error',\n code: 'PROPERTIES_READ_FAILED',\n message: `Unable to read properties: ${String(error)}`,\n path: 'properties',\n })\n }\n\n if (typeof source === 'string' && !isUrl(source) && isNodeRuntime()) {\n try {\n const properties = await new HiPS(source).getProperties()\n issues.push(...(await lintLocalStructureWithProperties(source, properties)))\n } catch {\n issues.push(...(await lintLocalStructure(source)))\n }\n }\n\n return {\n ok: issues.every((issue) => issue.level !== 'error'),\n issues,\n }\n}\n"]}