@standardagents/sip 0.10.0-dev

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/probe.ts","../src/decoders/simple.ts","../src/wasm/loader.ts","../src/wasm/decoder.ts","../src/wasm/encoder.ts","../src/wasm/png-decoder.ts","../src/encoder.ts","../src/resize.ts","../src/streaming.ts","../src/pipeline.ts","../src/index.ts"],"names":["require","wasmModule","module","DEFAULT_OPTIONS","process"],"mappings":";AAKA,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEZ,IAAA,EAAM,CAAC,GAAA,EAAM,GAAA,EAAM,GAAI,CAAA;AAAA;AAAA,EAEvB,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAM,IAAM,EAAA,EAAM,EAAA,EAAM,EAAA,EAAM,EAAA,EAAM,EAAI,CAAA;AAAA;AAAA,EAEpD,IAAA,EAAM,CAAC,EAAA,EAAM,EAAA,EAAM,IAAM,EAAI,CAAA;AAAA;AAAA,EAC7B,IAAA,EAAM,CAAC,EAAA,EAAM,EAAA,EAAM,IAAM,EAAI,CAAA;AAAA;AAAA;AAAA,EAE7B,IAAA,EAAM,CAAC,GAAA,EAAM,GAAA,EAAM,KAAM,GAAI;AAAA;AAC/B,CAAA;AAKA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,SAAA;AAG7B,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,KAAK,CAAC,CAAA,IACxB,KAAK,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAC,KACxB,IAAA,CAAK,CAAC,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACxB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,KACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,KAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,KACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,KAAK,EAAE,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACzB,IAAA,CAAK,EAAE,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACxB;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AACtE,IAAA,IAAI,UAAU,MAAA,IAAU,KAAA,KAAU,UAAU,KAAA,KAAU,MAAA,IAAU,UAAU,MAAA,EAAQ;AAChF,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAOA,SAAS,UAAU,IAAA,EAA4D;AAC7E,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAE/B,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,KAAM,GAAA,EAAM;AACzB,MAAA,MAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,OAAO,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAM,MAAM,GAAA,EAAM;AACpD,MAAA,MAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,IAAU,KAAK,MAAA,EAAQ;AAE3B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAQ,CAAA;AAI5B,IAAA,MAAM,KAAA,GACH,MAAA,IAAU,GAAA,IAAQ,MAAA,IAAU,OAC5B,MAAA,IAAU,GAAA,IAAQ,MAAA,IAAU,GAAA,IAC5B,UAAU,GAAA,IAAQ,MAAA,IAAU,GAAA,IAC5B,MAAA,IAAU,OAAQ,MAAA,IAAU,GAAA;AAE/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAErC,MAAA,MAAM,MAAA,GAAU,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACxD,MAAA,MAAM,KAAA,GAAS,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACvD,MAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,IACzB;AAIA,IAAA,IAAI,WAAW,GAAA,IAAQ,MAAA,KAAW,OAAS,MAAA,IAAU,GAAA,IAAQ,UAAU,GAAA,EAAO;AAE5E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,MAAM,gBAAiB,IAAA,CAAK,MAAM,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAC3D,IAAA,MAAA,IAAU,aAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AAOA,SAAS,SAAS,IAAA,EAA+E;AAC/F,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAI7B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,IAAA;AAGjC,EAAA,MAAM,KAAA,GACH,IAAA,CAAK,EAAE,CAAA,IAAK,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAK,KAAK,EAAE,CAAA;AACjE,EAAA,MAAM,MAAA,GACH,IAAA,CAAK,EAAE,CAAA,IAAK,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAK,KAAK,EAAE,CAAA;AAIjE,EAAA,MAAM,SAAA,GAAY,KAAK,EAAE,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA;AAElD,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AACnC;AAMA,SAAS,UAAU,IAAA,EAA+E;AAChG,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAG7B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAE5E,EAAA,IAAI,cAAc,MAAA,EAAQ;AAIxB,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAE7B,IAAA,IAAI,IAAA,CAAK,EAAE,CAAA,KAAM,GAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,KAAM,CAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,KAAM,EAAA,EAAM,OAAO,IAAA;AAExE,IAAA,MAAM,SAAS,IAAA,CAAK,EAAE,IAAK,IAAA,CAAK,EAAE,KAAK,CAAA,IAAM,KAAA;AAC7C,IAAA,MAAM,UAAU,IAAA,CAAK,EAAE,IAAK,IAAA,CAAK,EAAE,KAAK,CAAA,IAAM,KAAA;AAC9C,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,EAC1C;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AAGxB,IAAA,IAAI,IAAA,CAAK,EAAE,CAAA,KAAM,EAAA,EAAM,OAAO,IAAA;AAE9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAE,CAAA,GAAK,KAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AAC1E,IAAA,MAAM,KAAA,GAAA,CAAS,OAAO,KAAA,IAAU,CAAA;AAChC,IAAA,MAAM,MAAA,GAAA,CAAW,IAAA,IAAQ,EAAA,GAAM,KAAA,IAAU,CAAA;AACzC,IAAA,MAAM,QAAA,GAAA,CAAa,IAAA,IAAQ,EAAA,GAAM,CAAA,MAAO,CAAA;AACxC,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,EACnC;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AAGxB,IAAA,MAAM,KAAA,GAAQ,KAAK,EAAE,CAAA;AACrB,IAAA,MAAM,QAAA,GAAA,CAAY,QAAQ,EAAA,MAAU,CAAA;AAEpC,IAAA,MAAM,KAAA,GAAA,CAAS,IAAA,CAAK,EAAE,CAAA,GAAK,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,IAAO,CAAA;AAEhE,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,EAAE,CAAA,GAAK,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,IAAO,CAAA;AACjE,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,EACnC;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,UAAU,IAAA,EAA4D;AAK7E,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ;AAEhC,IAAA,MAAM,OACH,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA,GAChB,KAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GACpB,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GACrB,IAAA,CAAK,SAAS,CAAC,CAAA;AACjB,IAAA,MAAM,OAAO,MAAA,CAAO,YAAA;AAAA,MAClB,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC;AAAA,KACjB;AAEA,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,IAAI,OAAO,CAAA,EAAG;AAGd,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,MAAA,GAAS,EAAA,IAAM,KAAK,MAAA,EAAQ;AAEjD,MAAA,MAAM,QACH,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,KAAK,CAAA,GACtB,IAAA,CAAK,SAAS,EAAE,CAAA;AAClB,MAAA,MAAM,SACH,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,KAAK,CAAA,GACtB,IAAA,CAAK,SAAS,EAAE,CAAA;AAClB,MAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,MAAA,IAAU,SAAS,MAAA,EAAQ;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,CAAA;AAC1C,MAAA,MAAA,IAAU,UAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,MAAM,KAAA,EAA8C;AAClE,EAAA,MAAM,OAAO,KAAA,YAAiB,WAAA,GAAc,IAAI,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAEhC,EAAA,IAAI,MAAA,GAAuE,IAAA;AAE3E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,MAAA,GAAS,SAAS,IAAI,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA;AAGJ,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,GAC/B;AACF;AAKO,SAAS,kBAAkB,KAAA,EAA8C;AAC9E,EAAA,MAAM,OAAO,KAAA,YAAiB,WAAA,GAAc,IAAI,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA;AACpE,EAAA,OAAO,aAAa,IAAI,CAAA;AAC1B;;;AC1TA,SAAS,MAAA,GAAkB;AACzB,EAAA,OAAO,OAAO,YAAY,WAAA,IACnB,OAAA,CAAQ,YAAY,IAAA,IACpB,OAAA,CAAQ,SAAS,IAAA,IAAQ,IAAA;AAClC;AAKA,eAAe,gBAAA,CAEb,QACA,QAAA,EACe;AAEf,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAa,CAAA;AAC/C,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,QAAQ,CAAA;AAC/C,EAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAG7C,EAAA,MAAM,YAAA,GAAeA,QAAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,YAAY,CAAA;AAC9C,EAAA,MAAMC,WAAAA,GAAa,MAAM,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA;AACvD,EAAA,MAAM,OAAOA,WAAU,CAAA;AACzB;AAcO,IAAM,gBAAN,MAAuC;AAAA,EACnC,MAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,oBAAA,GAAuB,KAAA;AAAA,EAExB,IAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA;AAAA,EAEX,QAAA,GAAyD,IAAA;AAAA,EAEjE,WAAA,CAAY,QAAqB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,IAAA,EAAkF;AAC3F,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAMZ,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAK,GAAI,MAAM,OAAO,yBAAyB,CAAA;AACxE,QAAA,IAAI,QAAO,EAAG;AACZ,UAAA,MAAM,gBAAA,CAAiB,MAAM,uCAAuC,CAAA;AAAA,QACtE;AACA,QAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAK,GAAI,MAAM,OAAO,yBAAyB,CAAA;AACxE,QAAA,IAAI,QAAO,EAAG;AACZ,UAAA,MAAM,gBAAA,CAAiB,MAAM,uCAAuC,CAAA;AAAA,QACtE;AACA,QAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAA,8FAAA;AAAA,SAE9B;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA;AAK1E,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AAExB,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAA,EAIV;AACD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AAGxB,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,SAAA,CAAU,KAAK,MAAM,CAAA;AACjD,IAAA,MAAM,MAAM,IAAI,UAAA,CAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAEvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA;AAErC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,MAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AAEd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AACF,CAAA;AAKA,eAAsB,aAAA,CACpB,QACA,IAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;;;ACzJA,IAAI,UAAA,GAAmC,IAAA;AACvC,IAAI,WAAA,GAA6C,IAAA;AACjD,IAAI,qBAAA,GAAmD,IAAA;AAKhD,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,UAAA,KAAe,IAAA;AACxB;AAiBA,eAAsB,mBAAmB,cAAA,EAAoD;AAC3F,EAAA,OAAA,CAAQ,GAAA,CAAI,8CAAA,EAAgD,cAAA,GAAiB,UAAA,GAAa,MAAM,CAAA;AAEhG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,qBAAA,GAAwB,cAAA;AACxB,IAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AAAA,EACnE;AAEA,EAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,EAAA,MAAM,QAAA,EAAS;AACf,EAAA,OAAA,CAAQ,GAAA,CAAI,0DAAA,EAA4D,UAAA,GAAa,QAAA,GAAW,MAAM,CAAA;AACxG;AAKO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,UAAA;AACT;AAOA,eAAsB,QAAA,GAAmC;AAEvD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,WAAA,GAAc,UAAA,EAAW;AAEzB,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,WAAA;AACnB,IAAA,OAAO,UAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAe,UAAA,GAAqC;AAClD,EAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAG1C,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAgB,UAAA,CAAmB,mBAAA,EAAqB;AAChF,IAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,IAAA,MAAM,SAAU,UAAA,CAAmB,mBAAA;AACnC,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAGA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAElD,IAAA,MAAM,eAAA,GAAA,CAAmB,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AACnD,IAAA,OAAA,CAAQ,GAAA,CAAI,oDAAA,EAAsD,OAAO,eAAe,CAAA;AAGxF,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,OAAA,CAAQ,IAAI,0EAA0E,CAAA;AAEtF,MAAA,MAAMC,UAAS,MAAM,IAAI,OAAA,CAAuB,CAAC,SAAS,MAAA,KAAW;AACnE,QAAA,IAAI,cAAA,GAAuC,IAAA;AAE3C,QAAA,eAAA,CAAgB;AAAA,UACd,eAAA,EAAiB,CACf,OAAA,EACA,eAAA,KACG;AACH,YAAA,OAAA,CAAQ,IAAI,sEAAsE,CAAA;AAGlF,YAAA,WAAA,CAAY,YAAY,qBAAA,EAAwB,OAAO,CAAA,CACpD,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,cAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,cAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,YAC1B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,GAAG,CAAA;AAClD,cAAA,MAAA,CAAO,GAAG,CAAA;AAAA,YACZ,CAAC,CAAA;AAGH,YAAA,OAAO,EAAC;AAAA,UACV,CAAA;AAAA,UACA,sBAAsB,MAAM;AAE1B,YAAA,OAAA,CAAQ,GAAA,CAAI,mDAAA,EAAqD,cAAA,EAAgB,MAAA,GAAS,WAAW,WAAW,CAAA;AAChH,YAAA,IAAI,cAAA,IAAkB,eAAe,MAAA,EAAQ;AAC3C,cAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,YACxB;AAAA,UACF;AAAA,SACD,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAuB;AAC9B,UAAA,OAAA,CAAQ,GAAA,CAAI,mDAAA,EAAqD,GAAA,EAAK,MAAA,GAAS,WAAW,WAAW,CAAA;AACrG,UAAA,cAAA,GAAiB,GAAA;AAEjB,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,UACb;AAAA,QAEF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,MACjB,CAAC,CAAA;AAED,MAAA,OAAOA,OAAAA;AAAA,IACT;AAGA,IAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,yDAAA,EAA2D,MAAA,EAAQ,MAAA,GAAS,WAAW,WAAW,CAAA;AAC9G,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,GAAG,CAAA;AAC7C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uIAEa,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,KAC9D;AAAA,EACF;AACF;AAKO,SAAS,UAAA,CAAW,QAAuB,IAAA,EAA0B;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACtC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAC3B,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,YAAA,CAAa,MAAA,EAAuB,GAAA,EAAa,IAAA,EAA0B;AACzF,EAAA,OAAO,IAAI,WAAW,MAAA,CAAO,MAAA,CAAO,QAAQ,GAAA,EAAK,IAAI,EAAE,KAAA,EAAM;AAC/D;;;ACrLO,IAAM,kBAAN,MAAsB;AAAA,EACnB,MAAA;AAAA,EACA,OAAA,GAAkB,CAAA;AAAA,EAClB,OAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAgB,CAAA;AAAA,EAChB,MAAA,GAAiB,CAAA;AAAA,EACjB,WAAA,GAAsB,CAAA;AAAA,EACtB,YAAA,GAAuB,CAAA;AAAA,EACvB,UAAA,GAA4B,CAAA;AAAA,EAC5B,YAAA,GAAuB,CAAA;AAAA,EACvB,OAAA,GAAmB,KAAA;AAAA,EACnB,QAAA,GAAoB,KAAA;AAAA,EAE5B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAGH;AACA,IAAA,MAAM,QAAQ,IAAA,YAAgB,WAAA,GAAc,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAGnE,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAG5C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,KAAK,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,EAAG;AACvF,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAC5D,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB,KAAK,OAAO,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAC9D,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,KAAA;AACxB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,MAAA;AAEzB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAmD;AACjD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,UAAA,EAA8D;AACrE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,sBAAA,CAAuB,KAAK,OAAA,EAAS,UAAU,MAAM,CAAA,EAAG;AACtE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,6BAAA,CAA8B,KAAK,OAAO,CAAA;AACzE,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,8BAAA,CAA+B,KAAK,OAAO,CAAA;AAE3E,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,KAAK,YAAA,EAAa;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAyD;AACvD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,KAAK,YAAA,EAAa;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,kBAAA,CAAmB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAElE,IAAA,IAAI,WAAW,CAAA,EAAG;AAEhB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA;AAGhE,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,GAAc,CAAA;AACnC,IAAA,MAAM,OAAO,IAAI,UAAA;AAAA,MACf,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA;AAAA,MACnB,IAAA,CAAK,YAAA;AAAA,MACL;AAAA,MACA,KAAA,EAAM;AAER,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAO,IAAA,CAAK,WAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,gBAAA,GAAwC;AACvC,IAAA,IAAI,QAAA;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,YAAA,EAAa,MAAO,IAAA,EAAM;AAChD,MAAA,MAAM,QAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAmE;AACjE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAEA,IAAA,MAAM,SAAS,IAAI,UAAA,CAAW,KAAK,WAAA,GAAc,IAAA,CAAK,eAAe,CAAC,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,GAAc,CAAA;AAEnC,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAC9C,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,WAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC9B,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AAAA,EACtB;AACF;AAYO,SAAS,qBAAA,CACd,QAAA,EACA,SAAA,EACA,WAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,KAAK,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,CAAA;AAEhD,IAAA,IAAI,WAAA,IAAe,WAAA,IAAe,YAAA,IAAgB,YAAA,EAAc;AAC9D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;;;ACxPO,IAAM,kBAAN,MAAsB;AAAA,EACnB,MAAA;AAAA,EACA,OAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAgB,CAAA;AAAA,EAChB,MAAA,GAAiB,CAAA;AAAA,EACjB,OAAA,GAAkB,EAAA;AAAA,EAClB,YAAA,GAAuB,CAAA;AAAA,EACvB,OAAA,GAAmB,KAAA;AAAA,EACnB,QAAA,GAAoB,KAAA;AAAA,EACpB,WAAA,GAAsB,CAAA;AAAA,EAE9B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,CAAK,KAAA,EAAe,MAAA,EAAgB,OAAA,GAAkB,EAAA,EAAU;AAC9D,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,OAAO,CAAC,CAAA;AAGjD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,KAAM,CAAA,EAAG;AAClF,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,kBAAA,CAAmB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,QAAA,EAA0B;AACtC,IAAA,IAAA,CAAK,iBAAA,CAAkB,SAAS,IAAI,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,IAAA,EAAwB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,MAAA,EAAQ;AACnC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,YAAA,GAAe,KAAK,KAAA,GAAQ,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,WAAW,YAAA,EAAc;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,YAAY,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IACvF;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,YAAY,CAAA;AAG9C,IAAA,IAAI,KAAK,MAAA,CAAO,2BAAA,CAA4B,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,WAAA,EAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,GAAsB;AACpB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,MAAA,EAAQ;AACpC,MAAA,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,IACxF;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,mBAAA,CAAoB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAGhB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAClE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,4BAAA,CAA6B,KAAK,OAAO,CAAA;AAExE,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAC7B,MAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,WAAW,UAAU,CAAA;AAC9D,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAAA,EAAiC;AACzC,IAAA,IAAI,OAAO,MAAA,KAAW,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3G;AAEA,IAAA,IAAA,CAAK,KAAA,EAAM;AAEX,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,UAAU,MAAA,CAAO,QAAA,CAAS,IAAI,OAAA,EAAA,CAAU,CAAA,GAAI,KAAK,OAAO,CAAA;AAC9D,MAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AACF;;;AClLO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,OAAA,GAAkB,CAAA;AAAA,EAClB,OAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAgB,CAAA;AAAA,EAChB,MAAA,GAAiB,CAAA;AAAA,EACjB,QAAA,GAAoB,KAAA;AAAA,EACpB,YAAA,GAAuB,CAAA;AAAA,EACvB,OAAA,GAAmB,KAAA;AAAA,EACnB,QAAA,GAAoB,KAAA;AAAA,EACpB,UAAA,GAAqB,CAAA;AAAA,EAE7B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAIH;AACA,IAAA,MAAM,QAAQ,IAAA,YAAgB,WAAA,GAAc,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAGnE,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,uBAAA,EAAwB;AACnD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAG5C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,IAAA,CAAK,OAAA,EAAS,KAAK,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,EAAG;AAC3F,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,4BAAA,CAA6B,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAChE,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAChE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AAClE,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,IAAA,CAAK,OAAO,CAAA,KAAM,CAAA;AAEzE,IAAA,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAmD;AACjD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,sBAAA,CAAuB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,+BAAA,CAAgC,KAAK,OAAO,CAAA;AAC5E,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,EAAQ;AAClC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,KAAK,OAAO,CAAA;AAEjE,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAC7B,IAAA,MAAM,OAAO,IAAI,UAAA;AAAA,MACf,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA;AAAA,MACnB,IAAA,CAAK,YAAA;AAAA,MACL;AAAA,MACA,KAAA,EAAM;AAER,IAAA,MAAM,IAAI,IAAA,CAAK,UAAA;AACf,IAAA,IAAA,CAAK,UAAA,EAAA;AAGL,IAAA,IAAI,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,UAAA,IAAc,KAAK,MAAA,EAAQ;AAClD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,gBAAA,GAAwC;AACvC,IAAA,IAAI,QAAA;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,YAAA,EAAa,MAAO,IAAA,EAAM;AAChD,MAAA,MAAM,QAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAmE;AACjE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAEA,IAAA,MAAM,SAAS,IAAI,UAAA,CAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAE7B,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAC9C,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC9B,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AACF;;;ACpMO,IAAM,gBAAN,MAAuC;AAAA,EACnC,gBAAA,GAAmB,IAAA;AAAA,EAEpB,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,OAAA,GAAU,EAAA;AAAA,EACV,WAAA,GAAsC,IAAA;AAAA,EAE9C,MAAM,IAAA,CAAK,KAAA,EAAe,MAAA,EAAgB,OAAA,EAAgC;AACxE,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,MAAM,QAAA,EAAS;AAGf,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,MAAA,EAA0C;AACrD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,OAAA,EAAQ;AACzB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AACF,CAAA;AAQA,eAAsB,aAAA,CACpB,KAAA,EACA,MAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,EAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AACzC,EAAA,OAAO,OAAA;AACT;;;ACpDO,SAAS,iBAAA,CACd,QAAA,EACA,SAAA,EACA,QAAA,EACA,SAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACF;AAUA,SAAS,mBAAA,CACP,GAAA,EACA,QAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,QAAA,GAAW,CAAC,CAAA;AACvC,EAAA,MAAM,SAAS,QAAA,GAAW,QAAA;AAE1B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,QAAA,EAAU,IAAA,EAAA,EAAQ;AAE1C,IAAA,MAAM,YAAY,IAAA,GAAO,MAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAC,CAAA;AAC9C,IAAA,MAAM,IAAI,SAAA,GAAY,KAAA;AACtB,IAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AAGjB,IAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,IAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,IAAA,MAAM,YAAY,IAAA,GAAO,CAAA;AAGzB,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,CAAA;AAC5D,IAAA,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAA,GAAO,CAAC,IAAI,CAAC,CAAA;AACxE,IAAA,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAA,GAAO,CAAC,IAAI,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,GAAA;AACT;AAWA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,CAAA,EACA,KAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AACvC,EAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAA,EAAK;AAClC,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AAgBO,SAAS,eAAA,CACd,KAAA,EACA,WAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,WAAU,GAAI,KAAA;AACrD,EAAA,MAAM,SAAS,SAAA,GAAY,SAAA;AAC3B,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,WAAA,EAAa,QAAA,EAAU,QAAQ,CAAA;AAGtE,EAAA,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,EAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AAGjB,EAAA,OAAO,KAAA,CAAM,iBAAiB,SAAA,EAAW;AACvC,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,GAAiB,MAAA;AACzC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACtC,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,YAAY,CAAC,CAAA;AAGtD,IAAA,IAAI,WAAW,IAAA,EAAM;AAEnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAE1B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,KAAA,CAAM,OAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AACD,MAAA,KAAA,CAAM,cAAA,EAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,SAAA,GAAY,SAAA;AAGtB,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA;AACjB,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA;AAGjB,IAAA,IAAI,SAAA,KAAc,MAAM,QAAA,EAAU;AAChC,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AACb,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AAAA,IACf,CAAA,MAAA,IAAW,QAAA,KAAa,KAAA,CAAM,QAAA,EAAU;AAEtC,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AACb,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AAAA,IACf;AAEA,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,GAAG,QAAQ,CAAA;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,GAAG,KAAA,CAAM;AAAA,KACV,CAAA;AAED,IAAA,KAAA,CAAM,cAAA,EAAA;AAAA,EACR;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,YAAY,KAAA,EAAgC;AAC1D,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,OAAO,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,SAAA,EAAW;AAC7C,IAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAE5B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAM,KAAA,CAAM,OAAA;AAAA,MACZ,OAAO,KAAA,CAAM,QAAA;AAAA,MACb,GAAG,KAAA,CAAM;AAAA,KACV,CAAA;AACD,IAAA,KAAA,CAAM,cAAA,EAAA;AAAA,EACR;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,yBAAA,CACd,QAAA,EACA,SAAA,EACA,QAAA,EACA,SAAA,EACkD;AAClD,EAAA,MAAM,SAAS,QAAA,GAAW,QAAA;AAC1B,EAAA,MAAM,SAAS,SAAA,GAAY,SAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AAAA,IAClC,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,KAAK,CAAA;AAAA,IACpC;AAAA,GACF;AACF;AAcO,SAAS,uBAAA,CACd,QAAA,EACA,SAAA,EACA,WAAA,EACA,YAAA,EACe;AAIf,EAAA,MAAM,MAAA,GAA4B,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAE7C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,KAAK,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,CAAA;AAGhD,IAAA,IAAI,WAAA,IAAe,WAAA,IAAe,YAAA,IAAgB,YAAA,EAAc;AAC9D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,CAAA;AACT;;;ACtOA,IAAM,eAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,IAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,QAAA,EAAU,MAAM,IAAA,GAAO,IAAA;AAAA,EACvB,OAAA,EAAS;AACX,CAAA;AAcA,eAAsB,oBAAA,CACpB,KAAA,EACA,OAAA,GAA0B,EAAC,EACH;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,MAAM,QAAA,EAAS;AAGf,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,OAAA,CAAQ,KAAK,KAAK,CAAA;AAGjE,IAAA,MAAM,MAAA,GAAS,yBAAA;AAAA,MACb,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,MAAM,QAAA,GAAW,qBAAA;AAAA,MACf,QAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,MAAM,EAAE,OAAO,WAAA,EAAa,MAAA,EAAQ,cAAa,GAAI,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAG9E,IAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,MAClB,WAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,IAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,KAAK,OAAO,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAA,EAAM;AAGd,IAAA,OAAA,CAAQ,KAAA,EAAM;AAGd,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,gBAAA,EAAiB,EAAG;AAEjD,MAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,WAAA,EAAa,QAAA,CAAS,MAAM,WAAW,CAAA;AAC/E,MAAA,WAAA,EAAA;AAGA,MAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,QAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AAAA,MACnC;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,YAAY,WAAW,CAAA;AACzC,IAAA,KAAA,MAAW,eAAe,SAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,EAAO;AAGhC,IAAA,IAAI,SAAS,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAU,EAAA,EAAI;AAC5D,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,MAAA,OAAO,qBAAqB,KAAA,EAAO;AAAA,QACjC,GAAG,IAAA;AAAA,QACH,OAAA,EAAS,KAAK,OAAA,GAAU;AAAA,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAEhB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAiBA,eAAsB,mBAAA,CACpB,KAAA,EACA,OAAA,GAA0B,EAAC,EACH;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,MAAM,QAAA,EAAS;AAGf,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,OAAA,CAAQ,KAAK,KAAK,CAAA;AAGjE,IAAA,MAAM,MAAA,GAAS,yBAAA;AAAA,MACb,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,MAClB,QAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,IAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,KAAK,OAAO,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAA,EAAM;AAGd,IAAA,OAAA,CAAQ,KAAA,EAAM;AAGd,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,gBAAA,EAAiB,EAAG;AAEjD,MAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,WAAA,EAAa,QAAA,CAAS,MAAM,WAAW,CAAA;AAC/E,MAAA,WAAA,EAAA;AAGA,MAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,QAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AAAA,MACnC;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,YAAY,WAAW,CAAA;AACzC,IAAA,KAAA,MAAW,eAAe,SAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,EAAO;AAGhC,IAAA,IAAI,SAAS,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAU,EAAA,EAAI;AAC5D,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,MAAA,OAAO,oBAAoB,KAAA,EAAO;AAAA,QAChC,GAAG,IAAA;AAAA,QACH,OAAA,EAAS,KAAK,OAAA,GAAU;AAAA,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAEhB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAOO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,OAAO,eAAA,EAAgB;AACzB;AAOA,eAAsB,aAAA,GAAkC;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,EAAS;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC/PA,IAAMC,gBAAAA,GAA4C;AAAA,EAChD,QAAA,EAAU,IAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,QAAA,EAAU,MAAM,IAAA,GAAO,IAAA;AAAA;AAAA,EACvB,OAAA,EAAS;AACX,CAAA;AAaA,eAAsBC,QAAAA,CACpB,KAAA,EACA,OAAA,GAA0B,EAAC,EACH;AACxB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGD,gBAAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,MAAM,WAAA,GAAc,MAAM,KAAK,CAAA;AAC/B,EAAA,IAAI,WAAA,CAAY,WAAW,SAAA,EAAW;AACpC,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,WAAU,GAAI,WAAA;AAGvD,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAO,MAAM,oBAAA,CAAqB,KAAA,EAAO,IAAI,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,OAAO,MAAM,mBAAA,CAAoB,KAAA,EAAO,IAAI,CAAA;AAAA,EAC9C;AAKA,EAAA,MAAM,QAAA,EAAS;AAGf,EAAA,MAAM,MAAA,GAAS,yBAAA;AAAA,IACb,QAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA,CAAK,QAAA;AAAA,IACL,IAAA,CAAK;AAAA,GACP;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,EAAQ,KAAK,CAAA;AACjD,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,YAAA,EAAc,QAAQ,aAAA,EAAc,GAAI,MAAM,OAAA,CAAQ,MAAA,EAAO;AAC/F,EAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,EAAA,MAAM,aAAA,GAAgB,iBAAA;AAAA,IACpB,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACT;AAGA,EAAA,IAAI,UAAU,IAAA,CAAK,OAAA;AACnB,EAAA,IAAI,QAAA,GAAW,MAAM,YAAA,CAAa,aAAA,EAAe,OAAO,KAAA,EAAO,MAAA,CAAO,QAAQ,OAAO,CAAA;AAGrF,EAAA,OAAO,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,UAAU,EAAA,EAAI;AAC1D,IAAA,OAAA,IAAW,EAAA;AACX,IAAA,QAAA,GAAW,MAAM,YAAA,CAAa,aAAA,EAAe,OAAO,KAAA,EAAO,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,EACnF;AAGA,EAAA,IAAI,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,QAAA,EAAU;AACvC,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,QAAA,GAAW,QAAA,CAAS,UAAU,CAAA,GAAI,GAAA;AACrE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,WAAW,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,WAAW,CAAA;AAExD,IAAA,MAAM,aAAA,GAAgB,iBAAA;AAAA,MACpB,aAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAA,GAAW,MAAM,YAAA,CAAa,aAAA,EAAe,QAAA,EAAU,WAAW,OAAO,CAAA;AAEzE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,YAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACF;AAQA,SAAS,iBAAA,CACP,SAAA,EACA,QAAA,EACA,SAAA,EACA,UACA,SAAA,EACY;AACZ,EAAA,IAAI,QAAA,KAAa,QAAA,IAAY,SAAA,KAAc,SAAA,EAAW;AACpD,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,UAAU,SAAS,CAAA;AACxE,EAAA,MAAM,UAAA,GAA2B,IAAI,KAAA,CAAM,SAAS,CAAA;AAGpD,EAAA,MAAM,aAAa,QAAA,GAAW,CAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,SAAS,SAAA,CAAU,QAAA,CAAS,IAAI,UAAA,EAAA,CAAa,CAAA,GAAI,KAAK,UAAU,CAAA;AACtE,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA;AAExD,IAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,MAAA,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,IAAA;AAAA,IACpC;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,YAAY,KAAK,CAAA;AACnC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,IAAA;AAAA,EACpC;AAGA,EAAA,MAAM,aAAa,QAAA,GAAW,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,QAAA,GAAW,YAAY,CAAC,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG;AACjB,MAAA,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,EAAG,IAAI,UAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,YAAA,CACb,MAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,KAAA,EAAO,QAAQ,OAAO,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,EAAA,OAAO,MAAA;AACT;;;ACrIO,IAAM,GAAA,GAAM;AAAA,EACjB,OAAA,EAAAC,QAAAA;AAAA,EACA,KAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF","file":"index.js","sourcesContent":["import type { ImageFormat, ProbeResult } from './types';\n\n/**\n * Magic bytes for format detection\n */\nconst MAGIC = {\n // JPEG: FFD8FF\n JPEG: [0xff, 0xd8, 0xff],\n // PNG: 89504E47 0D0A1A0A\n PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n // WebP: RIFF....WEBP\n RIFF: [0x52, 0x49, 0x46, 0x46], // \"RIFF\"\n WEBP: [0x57, 0x45, 0x42, 0x50], // \"WEBP\"\n // AVIF: ....ftypavif or ....ftypavis\n FTYP: [0x66, 0x74, 0x79, 0x70], // \"ftyp\"\n};\n\n/**\n * Detect image format from magic bytes\n */\nfunction detectFormat(data: Uint8Array): ImageFormat {\n if (data.length < 12) return 'unknown';\n\n // Check JPEG\n if (\n data[0] === MAGIC.JPEG[0] &&\n data[1] === MAGIC.JPEG[1] &&\n data[2] === MAGIC.JPEG[2]\n ) {\n return 'jpeg';\n }\n\n // Check PNG\n if (\n data[0] === MAGIC.PNG[0] &&\n data[1] === MAGIC.PNG[1] &&\n data[2] === MAGIC.PNG[2] &&\n data[3] === MAGIC.PNG[3] &&\n data[4] === MAGIC.PNG[4] &&\n data[5] === MAGIC.PNG[5] &&\n data[6] === MAGIC.PNG[6] &&\n data[7] === MAGIC.PNG[7]\n ) {\n return 'png';\n }\n\n // Check WebP (RIFF....WEBP)\n if (\n data[0] === MAGIC.RIFF[0] &&\n data[1] === MAGIC.RIFF[1] &&\n data[2] === MAGIC.RIFF[2] &&\n data[3] === MAGIC.RIFF[3] &&\n data[8] === MAGIC.WEBP[0] &&\n data[9] === MAGIC.WEBP[1] &&\n data[10] === MAGIC.WEBP[2] &&\n data[11] === MAGIC.WEBP[3]\n ) {\n return 'webp';\n }\n\n // Check AVIF (....ftypavif, ....ftypmif1, ....ftypavis, etc.)\n if (\n data[4] === MAGIC.FTYP[0] &&\n data[5] === MAGIC.FTYP[1] &&\n data[6] === MAGIC.FTYP[2] &&\n data[7] === MAGIC.FTYP[3]\n ) {\n // Check for AVIF-related brands\n const brand = String.fromCharCode(data[8], data[9], data[10], data[11]);\n if (brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'msf1') {\n return 'avif';\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Read JPEG dimensions from SOF marker\n * JPEG structure: FFD8 (SOI) followed by segments\n * We need to find SOF0 (FFC0), SOF1 (FFC1), or SOF2 (FFC2)\n */\nfunction probeJpeg(data: Uint8Array): { width: number; height: number } | null {\n let offset = 2; // Skip FFD8\n\n while (offset < data.length - 1) {\n // Each marker starts with FF\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n // Skip padding FF bytes\n while (offset < data.length && data[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= data.length) break;\n\n const marker = data[offset++];\n\n // SOF markers (Start of Frame) - various types\n // FFC0-FFC3, FFC5-FFC7, FFC9-FFCB, FFCD-FFCF\n const isSOF =\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf);\n\n if (isSOF) {\n if (offset + 7 > data.length) return null;\n // SOF structure: length(2) + precision(1) + height(2) + width(2)\n const height = (data[offset + 3] << 8) | data[offset + 4];\n const width = (data[offset + 5] << 8) | data[offset + 6];\n return { width, height };\n }\n\n // Skip to next segment\n // Most markers have a length field (except RST, SOI, EOI)\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) {\n // SOI, EOI, RST markers have no length\n continue;\n }\n\n if (offset + 1 >= data.length) break;\n const segmentLength = (data[offset] << 8) | data[offset + 1];\n offset += segmentLength;\n }\n\n return null;\n}\n\n/**\n * Read PNG dimensions from IHDR chunk\n * PNG structure: 8-byte signature, then chunks (length + type + data + CRC)\n * IHDR is always the first chunk: width(4) + height(4) + ...\n */\nfunction probePng(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 24) return null;\n\n // Skip 8-byte signature, read first chunk (IHDR)\n // Chunk structure: length(4) + type(4) + data + crc(4)\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n if (chunkType !== 'IHDR') return null;\n\n // IHDR data starts at offset 16\n const width =\n (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];\n const height =\n (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];\n\n // Color type is at offset 24 (after width + height)\n // 4 = grayscale + alpha, 6 = RGBA\n const colorType = data[25];\n const hasAlpha = colorType === 4 || colorType === 6;\n\n return { width, height, hasAlpha };\n}\n\n/**\n * Read WebP dimensions\n * WebP has multiple formats: VP8 (lossy), VP8L (lossless), VP8X (extended)\n */\nfunction probeWebp(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 30) return null;\n\n // After RIFF header (12 bytes), check chunk type\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n\n if (chunkType === 'VP8 ') {\n // Lossy WebP\n // VP8 bitstream starts at offset 20 (after chunk size)\n // Frame tag at offset 23: 3 bytes\n if (data.length < 30) return null;\n // Check for VP8 frame tag (0x9D 0x01 0x2A for keyframe)\n if (data[23] !== 0x9d || data[24] !== 0x01 || data[25] !== 0x2a) return null;\n // Width and height are 14-bit values\n const width = (data[26] | (data[27] << 8)) & 0x3fff;\n const height = (data[28] | (data[29] << 8)) & 0x3fff;\n return { width, height, hasAlpha: false };\n }\n\n if (chunkType === 'VP8L') {\n // Lossless WebP\n // Signature byte at offset 20 should be 0x2f\n if (data[20] !== 0x2f) return null;\n // Width and height encoded in next 4 bytes\n const bits = data[21] | (data[22] << 8) | (data[23] << 16) | (data[24] << 24);\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n const hasAlpha = ((bits >> 28) & 1) === 1;\n return { width, height, hasAlpha };\n }\n\n if (chunkType === 'VP8X') {\n // Extended WebP format\n // Flags at offset 20\n const flags = data[20];\n const hasAlpha = (flags & 0x10) !== 0;\n // Width at offset 24 (24-bit, little-endian, +1)\n const width = (data[24] | (data[25] << 8) | (data[26] << 16)) + 1;\n // Height at offset 27 (24-bit, little-endian, +1)\n const height = (data[27] | (data[28] << 8) | (data[29] << 16)) + 1;\n return { width, height, hasAlpha };\n }\n\n return null;\n}\n\n/**\n * Read AVIF dimensions from HEIF/ISOBMFF structure\n * This is complex - AVIF uses HEIF container (ISO Base Media File Format)\n */\nfunction probeAvif(data: Uint8Array): { width: number; height: number } | null {\n // AVIF parsing is complex (ISOBMFF boxes)\n // For now, we'll look for the ispe (image spatial extents) box\n // which contains width and height\n\n let offset = 0;\n while (offset + 8 <= data.length) {\n // Box structure: size(4) + type(4) + data\n const size =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n const type = String.fromCharCode(\n data[offset + 4],\n data[offset + 5],\n data[offset + 6],\n data[offset + 7]\n );\n\n if (size === 0) break; // Box extends to end of file\n if (size < 8) break; // Invalid box\n\n // Look for ispe box (can be nested in meta > iprp > ipco)\n if (type === 'ispe' && offset + 20 <= data.length) {\n // ispe: version(1) + flags(3) + width(4) + height(4)\n const width =\n (data[offset + 12] << 24) |\n (data[offset + 13] << 16) |\n (data[offset + 14] << 8) |\n data[offset + 15];\n const height =\n (data[offset + 16] << 24) |\n (data[offset + 17] << 16) |\n (data[offset + 18] << 8) |\n data[offset + 19];\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n // Container boxes that we should descend into\n if (type === 'meta' || type === 'iprp' || type === 'ipco') {\n // For meta, skip 4 bytes (version + flags)\n const headerSize = type === 'meta' ? 12 : 8;\n offset += headerSize;\n continue;\n }\n\n offset += size;\n }\n\n return null;\n}\n\n/**\n * Probe an image to get format and dimensions\n * Only reads the header bytes - very memory efficient\n *\n * @param input - Image data as ArrayBuffer or Uint8Array\n * @returns ProbeResult with format, dimensions, and alpha info\n */\nexport function probe(input: ArrayBuffer | Uint8Array): ProbeResult {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n\n const format = detectFormat(data);\n\n let result: { width: number; height: number; hasAlpha?: boolean } | null = null;\n\n switch (format) {\n case 'jpeg':\n result = probeJpeg(data);\n break;\n case 'png':\n result = probePng(data);\n break;\n case 'webp':\n result = probeWebp(data);\n break;\n case 'avif':\n result = probeAvif(data);\n break;\n }\n\n if (!result) {\n return {\n format: 'unknown',\n width: 0,\n height: 0,\n hasAlpha: false,\n };\n }\n\n return {\n format,\n width: result.width,\n height: result.height,\n hasAlpha: result.hasAlpha ?? false,\n };\n}\n\n/**\n * Detect just the format (faster if you don't need dimensions)\n */\nexport function detectImageFormat(input: ArrayBuffer | Uint8Array): ImageFormat {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n return detectFormat(data);\n}\n","import type { ImageFormat, Scanline } from '../types';\nimport type { Decoder } from './types';\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n return typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n}\n\n/**\n * Initialize a @jsquash codec for Node.js by loading its WASM module\n */\nasync function initCodecForNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise<any>,\n wasmPath: string\n): Promise<void> {\n // Dynamic import for Node.js modules\n const { readFile } = await import('fs/promises');\n const { createRequire } = await import('module');\n const require = createRequire(import.meta.url);\n\n // Resolve the WASM file path from the package\n const resolvedPath = require.resolve(wasmPath);\n const wasmBuffer = await readFile(resolvedPath);\n const wasmModule = await WebAssembly.compile(wasmBuffer);\n await initFn(wasmModule);\n}\n\n/**\n * Simple decoder for WebP and AVIF formats\n *\n * This decoder handles formats that don't have native WASM support yet.\n * For JPEG and PNG, use the native WASM decoders which are more memory efficient.\n *\n * Works with:\n * - WebP via external @jsquash/webp\n * - AVIF via external @jsquash/avif\n *\n * Supports both Node.js and browser/Workers environments.\n */\nexport class SimpleDecoder implements Decoder {\n readonly format: ImageFormat;\n readonly supportsScanline = false;\n readonly supportsScaledDecode = false;\n\n private data: ArrayBuffer;\n private width = 0;\n private height = 0;\n private hasAlpha = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private decodeFn: ((data: ArrayBuffer) => Promise<any>) | null = null;\n\n constructor(format: ImageFormat, data: ArrayBuffer) {\n this.format = format;\n this.data = data;\n }\n\n async init(data: ArrayBuffer): Promise<{ width: number; height: number; hasAlpha: boolean }> {\n this.data = data;\n\n // Get decoder function based on format\n // In Node.js, we need to manually initialize the WASM modules\n // The init function is on the submodule (e.g. @jsquash/webp/decode.js)\n // Note: JPEG and PNG use native WASM decoders, not this fallback\n switch (this.format) {\n case 'avif': {\n const { default: decode, init } = await import('@jsquash/avif/decode.js');\n if (isNode()) {\n await initCodecForNode(init, '@jsquash/avif/codec/dec/avif_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // AVIF may have alpha\n break;\n }\n case 'webp': {\n const { default: decode, init } = await import('@jsquash/webp/decode.js');\n if (isNode()) {\n await initCodecForNode(init, '@jsquash/webp/codec/dec/webp_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // WebP may have alpha\n break;\n }\n case 'jpeg':\n case 'png':\n throw new Error(\n `${this.format.toUpperCase()} requires native WASM decoder. ` +\n 'Build the WASM module with `pnpm build:wasm` in packages/sip.'\n );\n default:\n throw new Error(`Unsupported format for SimpleDecoder: ${this.format}`);\n }\n\n // Decode to get dimensions (unfortunately this decodes the whole thing)\n // For a more efficient probe, use the probe() function first\n const imageData = await this.decodeFn(this.data);\n if (!imageData) {\n throw new Error(`Failed to decode ${this.format} image`);\n }\n this.width = imageData.width;\n this.height = imageData.height;\n\n return {\n width: this.width,\n height: this.height,\n hasAlpha: this.hasAlpha,\n };\n }\n\n async decode(_scaleFactor?: number): Promise<{\n pixels: Uint8Array;\n width: number;\n height: number;\n }> {\n if (!this.decodeFn) {\n throw new Error('Decoder not initialized. Call init() first.');\n }\n\n // Decode the image\n const imageData = await this.decodeFn(this.data);\n this.width = imageData.width;\n this.height = imageData.height;\n\n // Convert RGBA to RGB\n const rgba = new Uint8Array(imageData.data.buffer);\n const rgb = new Uint8Array(this.width * this.height * 3);\n\n let srcIdx = 0;\n let dstIdx = 0;\n const pixelCount = this.width * this.height;\n\n for (let i = 0; i < pixelCount; i++) {\n rgb[dstIdx++] = rgba[srcIdx++]; // R\n rgb[dstIdx++] = rgba[srcIdx++]; // G\n rgb[dstIdx++] = rgba[srcIdx++]; // B\n srcIdx++; // Skip A\n }\n\n return {\n pixels: rgb,\n width: this.width,\n height: this.height,\n };\n }\n\n dispose(): void {\n // Clean up references\n this.decodeFn = null;\n }\n}\n\n/**\n * Create a decoder for the given format\n */\nexport async function createDecoder(\n format: ImageFormat,\n data: ArrayBuffer\n): Promise<Decoder> {\n const decoder = new SimpleDecoder(format, data);\n await decoder.init(data);\n return decoder;\n}\n","/**\n * WASM Module Loader\n *\n * Loads the SIP WASM module with proper initialization.\n * Works in both browser and Cloudflare Workers environments.\n *\n * For Cloudflare Workers, use initWithWasmModule() in the Durable Object\n * constructor, passing the statically imported WASM module.\n */\n\nimport type { SipWasmModule } from './types';\n\nlet wasmModule: SipWasmModule | null = null;\nlet wasmPromise: Promise<SipWasmModule> | null = null;\nlet precompiledWasmModule: WebAssembly.Module | null = null;\n\n/**\n * Check if WASM module is available\n */\nexport function isWasmAvailable(): boolean {\n return wasmModule !== null;\n}\n\n/**\n * Initialize with a pre-compiled WebAssembly.Module\n *\n * For Cloudflare Workers, import the WASM file statically and pass it here.\n * This allows workerd to pre-compile the WASM at bundle time.\n *\n * @example\n * ```typescript\n * import sipWasm from '@standardagents/sip/dist/sip.wasm';\n * import { initWithWasmModule } from '@standardagents/sip';\n *\n * // At module top level or in DO constructor\n * await initWithWasmModule(sipWasm);\n * ```\n */\nexport async function initWithWasmModule(compiledModule?: WebAssembly.Module): Promise<void> {\n console.log('[sip:initWithWasmModule] Called with module:', compiledModule ? 'provided' : 'none');\n\n if (wasmModule) {\n console.log('[sip:initWithWasmModule] Already initialized, skipping');\n return; // Already initialized\n }\n\n // Store the pre-compiled module for use in instantiateWasm callback\n if (compiledModule) {\n precompiledWasmModule = compiledModule;\n console.log('[sip:initWithWasmModule] Stored pre-compiled module');\n }\n\n console.log('[sip:initWithWasmModule] Calling loadWasm...');\n await loadWasm();\n console.log('[sip:initWithWasmModule] loadWasm completed, wasmModule:', wasmModule ? 'loaded' : 'null');\n}\n\n/**\n * Get the WASM module, throwing if not loaded\n */\nexport function getWasmModule(): SipWasmModule {\n if (!wasmModule) {\n throw new Error('WASM module not loaded. Call loadWasm() first.');\n }\n return wasmModule;\n}\n\n/**\n * Load the WASM module\n *\n * This function is idempotent - calling it multiple times returns the same module.\n */\nexport async function loadWasm(): Promise<SipWasmModule> {\n // Return cached module if already loaded\n if (wasmModule) {\n return wasmModule;\n }\n\n // Return existing promise if loading in progress\n if (wasmPromise) {\n return wasmPromise;\n }\n\n wasmPromise = doLoadWasm();\n\n try {\n wasmModule = await wasmPromise;\n return wasmModule;\n } catch (err) {\n wasmPromise = null;\n throw err;\n }\n}\n\n/**\n * Internal function to load the WASM module\n */\nasync function doLoadWasm(): Promise<SipWasmModule> {\n console.log('[sip:doLoadWasm] Starting...');\n\n // Check for externally provided loader first\n if (typeof globalThis !== 'undefined' && (globalThis as any).__SIP_WASM_LOADER__) {\n console.log('[sip:doLoadWasm] Using external loader');\n const loader = (globalThis as any).__SIP_WASM_LOADER__;\n return await loader();\n }\n\n // Try to dynamically import the Emscripten glue code\n try {\n console.log('[sip:doLoadWasm] Importing sip.js...');\n // @ts-ignore - Dynamic import of built WASM module\n const createSipModule = (await import('./sip.js')).default;\n console.log('[sip:doLoadWasm] sip.js imported, createSipModule:', typeof createSipModule);\n\n // If we have a pre-compiled module, use instantiateWasm callback\n if (precompiledWasmModule) {\n console.log('[sip:doLoadWasm] Using pre-compiled module with instantiateWasm callback');\n\n const module = await new Promise<SipWasmModule>((resolve, reject) => {\n let resolvedModule: SipWasmModule | null = null;\n\n createSipModule({\n instantiateWasm: (\n imports: WebAssembly.Imports,\n receiveInstance: (instance: WebAssembly.Instance) => void\n ) => {\n console.log('[sip:instantiateWasm] Called, instantiating with pre-compiled module');\n\n // Use WebAssembly.instantiate with the pre-compiled module\n WebAssembly.instantiate(precompiledWasmModule!, imports)\n .then((instance) => {\n console.log('[sip:instantiateWasm] Instance created successfully');\n receiveInstance(instance);\n })\n .catch((err) => {\n console.error('[sip:instantiateWasm] Failed:', err);\n reject(err);\n });\n\n // Return empty exports - Emscripten will get them from receiveInstance\n return {};\n },\n onRuntimeInitialized: () => {\n // Runtime is now fully initialized, HEAPU8 should be available\n console.log('[sip:onRuntimeInitialized] Runtime ready, HEAPU8:', resolvedModule?.HEAPU8 ? 'exists' : 'undefined');\n if (resolvedModule && resolvedModule.HEAPU8) {\n resolve(resolvedModule);\n }\n },\n }).then((mod: SipWasmModule) => {\n console.log('[sip:doLoadWasm] Module promise resolved, HEAPU8:', mod?.HEAPU8 ? 'exists' : 'undefined');\n resolvedModule = mod;\n // If HEAPU8 is already available, resolve immediately\n if (mod.HEAPU8) {\n resolve(mod);\n }\n // Otherwise, wait for onRuntimeInitialized\n }).catch(reject);\n });\n\n return module;\n }\n\n // Standard loading (browser environment)\n console.log('[sip:doLoadWasm] Using standard loading');\n const module = await createSipModule();\n console.log('[sip:doLoadWasm] Standard load complete, module.HEAPU8:', module?.HEAPU8 ? 'exists' : 'undefined');\n return module as SipWasmModule;\n } catch (err) {\n console.error('[sip:doLoadWasm] Failed:', err);\n throw new Error(\n 'SIP WASM module not available. ' +\n 'To use streaming processing, build the WASM module with `pnpm build:wasm` in packages/sip. ' +\n 'Error: ' + (err instanceof Error ? err.message : String(err))\n );\n }\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasm(module: SipWasmModule, data: Uint8Array): number {\n const ptr = module._malloc(data.length);\n if (!ptr) {\n throw new Error('Failed to allocate WASM memory');\n }\n module.HEAPU8.set(data, ptr);\n return ptr;\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasm(module: SipWasmModule, ptr: number, size: number): Uint8Array {\n return new Uint8Array(module.HEAPU8.buffer, ptr, size).slice();\n}\n","/**\n * WASM JPEG Decoder with Scaled DCT Support\n *\n * Memory-efficient JPEG decoding using libjpeg-turbo's scaled DCT feature.\n * Decodes at 1/2, 1/4, or 1/8 scale directly during decompression.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule, DctScaleDenom } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based JPEG decoder with scaled DCT support\n */\nexport class WasmJpegDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private outputWidth: number = 0;\n private outputHeight: number = 0;\n private scaleDenom: DctScaleDenom = 1;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with JPEG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create JPEG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set decoder source');\n }\n\n // Read header\n if (this.module._sip_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read JPEG header');\n }\n\n this.width = this.module._sip_decoder_get_width(this.decoder);\n this.height = this.module._sip_decoder_get_height(this.decoder);\n this.outputWidth = this.width;\n this.outputHeight = this.height;\n\n return { width: this.width, height: this.height };\n }\n\n /**\n * Get original image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Set DCT scale factor for decoding\n *\n * Must be called after init() and before start()\n *\n * @param scaleDenom - Scale denominator: 1, 2, 4, or 8\n * 1 = full size (default)\n * 2 = 1/2 size\n * 4 = 1/4 size\n * 8 = 1/8 size\n */\n setScale(scaleDenom: DctScaleDenom): { width: number; height: number } {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Cannot change scale after decoding started');\n }\n\n if (this.module._sip_decoder_set_scale(this.decoder, scaleDenom) !== 0) {\n throw new Error(`Invalid scale denominator: ${scaleDenom}`);\n }\n\n this.scaleDenom = scaleDenom;\n this.outputWidth = this.module._sip_decoder_get_output_width(this.decoder);\n this.outputHeight = this.module._sip_decoder_get_output_height(this.decoder);\n\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n /**\n * Get output dimensions (after any scaling)\n */\n getOutputDimensions(): { width: number; height: number } {\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start decompression');\n }\n\n this.rowBufferPtr = this.module._sip_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n const result = this.module._sip_decoder_read_scanline(this.decoder);\n\n if (result === 0) {\n // Done\n this.finished = true;\n return null;\n }\n\n if (result < 0) {\n throw new Error('Failed to read scanline');\n }\n\n // Get scanline number (1-indexed in libjpeg, but we want 0-indexed)\n const y = this.module._sip_decoder_get_scanline(this.decoder) - 1;\n\n // Copy scanline data\n const rowSize = this.outputWidth * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n return {\n data,\n width: this.outputWidth,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator<Scanline> {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.outputWidth * this.outputHeight * 3);\n const rowSize = this.outputWidth * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.outputWidth,\n height: this.outputHeight,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n }\n}\n\n/**\n * Calculate optimal DCT scale factor for a target size\n *\n * Returns the largest scale factor that keeps the output >= target size.\n *\n * @param srcWidth - Original image width\n * @param srcHeight - Original image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n */\nexport function calculateOptimalScale(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): DctScaleDenom {\n const scales: DctScaleDenom[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n // JPEG DCT scaling rounds up: ceil(dimension / scale)\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n return 1;\n}\n","/**\n * WASM JPEG Encoder with Scanline Streaming\n *\n * Memory-efficient JPEG encoding that processes one scanline at a time.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyFromWasm } from './loader';\n\n/**\n * WASM-based JPEG encoder with scanline streaming\n */\nexport class WasmJpegEncoder {\n private module: SipWasmModule;\n private encoder: number = 0;\n private width: number = 0;\n private height: number = 0;\n private quality: number = 85;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentLine: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize encoder with output dimensions and quality\n *\n * @param width - Output image width\n * @param height - Output image height\n * @param quality - JPEG quality (1-100, default 85)\n */\n init(width: number, height: number, quality: number = 85): void {\n this.width = width;\n this.height = height;\n this.quality = Math.max(1, Math.min(100, quality));\n\n // Create encoder\n this.encoder = this.module._sip_encoder_create();\n if (!this.encoder) {\n throw new Error('Failed to create JPEG encoder');\n }\n\n // Initialize with dimensions and quality\n if (this.module._sip_encoder_init(this.encoder, width, height, this.quality) !== 0) {\n this.dispose();\n throw new Error('Failed to initialize encoder');\n }\n }\n\n /**\n * Start encoding\n */\n start(): void {\n if (!this.encoder) {\n throw new Error('Encoder not initialized');\n }\n if (this.started) {\n throw new Error('Encoding already started');\n }\n\n if (this.module._sip_encoder_start(this.encoder) !== 0) {\n throw new Error('Failed to start compression');\n }\n\n this.rowBufferPtr = this.module._sip_encoder_get_row_buffer(this.encoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentLine = 0;\n }\n\n /**\n * Write a scanline to the encoder\n *\n * @param scanline - Scanline with RGB data\n */\n writeScanline(scanline: Scanline): void {\n this.writeScanlineData(scanline.data);\n }\n\n /**\n * Write raw RGB data as a scanline\n *\n * @param data - RGB data (width * 3 bytes)\n */\n writeScanlineData(data: Uint8Array): void {\n if (!this.started || this.finished) {\n throw new Error('Encoder not ready for writing');\n }\n\n if (this.currentLine >= this.height) {\n throw new Error('All scanlines already written');\n }\n\n const expectedSize = this.width * 3;\n if (data.length !== expectedSize) {\n throw new Error(`Invalid scanline size: expected ${expectedSize}, got ${data.length}`);\n }\n\n // Copy data to WASM row buffer\n this.module.HEAPU8.set(data, this.rowBufferPtr);\n\n // Write the scanline\n if (this.module._sip_encoder_write_scanline(this.encoder) !== 1) {\n throw new Error('Failed to write scanline');\n }\n\n this.currentLine++;\n }\n\n /**\n * Get current scanline number\n */\n getCurrentLine(): number {\n return this.currentLine;\n }\n\n /**\n * Finish encoding and get output\n *\n * @returns JPEG data as ArrayBuffer\n */\n finish(): ArrayBuffer {\n if (!this.started) {\n throw new Error('Encoding not started');\n }\n\n if (this.currentLine !== this.height) {\n throw new Error(`Incomplete image: wrote ${this.currentLine}/${this.height} scanlines`);\n }\n\n if (this.module._sip_encoder_finish(this.encoder) !== 0) {\n throw new Error('Failed to finish encoding');\n }\n\n this.finished = true;\n\n // Get output data\n const outputPtr = this.module._sip_encoder_get_output(this.encoder);\n const outputSize = this.module._sip_encoder_get_output_size(this.encoder);\n\n if (!outputPtr || !outputSize) {\n throw new Error('No output data');\n }\n\n // Copy output to new buffer\n const output = copyFromWasm(this.module, outputPtr, outputSize);\n return output.buffer as ArrayBuffer;\n }\n\n /**\n * Encode a full RGB buffer to JPEG\n *\n * @param pixels - RGB pixel data (width * height * 3 bytes)\n * @returns JPEG data as ArrayBuffer\n */\n encodeAll(pixels: Uint8Array): ArrayBuffer {\n if (pixels.length !== this.width * this.height * 3) {\n throw new Error(`Invalid pixel data size: expected ${this.width * this.height * 3}, got ${pixels.length}`);\n }\n\n this.start();\n\n const rowSize = this.width * 3;\n for (let y = 0; y < this.height; y++) {\n const rowData = pixels.subarray(y * rowSize, (y + 1) * rowSize);\n this.writeScanlineData(rowData);\n }\n\n return this.finish();\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.encoder) {\n this.module._sip_encoder_destroy(this.encoder);\n this.encoder = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentLine = 0;\n }\n}\n","/**\n * WASM PNG Decoder with Row-by-Row Processing\n *\n * Memory-efficient PNG decoding using libspng's progressive API.\n * Decodes one row at a time to minimize memory usage.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based PNG decoder with row-by-row decoding\n */\nexport class WasmPngDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private hasAlpha: boolean = false;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentRow: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with PNG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n hasAlpha: boolean;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_png_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create PNG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_png_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set PNG decoder source');\n }\n\n // Read header\n if (this.module._sip_png_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read PNG header');\n }\n\n this.width = this.module._sip_png_decoder_get_width(this.decoder);\n this.height = this.module._sip_png_decoder_get_height(this.decoder);\n this.hasAlpha = this.module._sip_png_decoder_has_alpha(this.decoder) !== 0;\n\n return { width: this.width, height: this.height, hasAlpha: this.hasAlpha };\n }\n\n /**\n * Get image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Check if image has alpha channel\n */\n getHasAlpha(): boolean {\n return this.hasAlpha;\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_png_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start PNG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_png_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentRow = 0;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n if (this.currentRow >= this.height) {\n this.finished = true;\n return null;\n }\n\n const result = this.module._sip_png_decoder_read_row(this.decoder);\n\n if (result < 0) {\n throw new Error('Failed to read PNG row');\n }\n\n // Copy scanline data (RGB = 3 bytes per pixel)\n const rowSize = this.width * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n const y = this.currentRow;\n this.currentRow++;\n\n // Check if done after reading this row\n if (result === 0 || this.currentRow >= this.height) {\n this.finished = true;\n }\n\n return {\n data,\n width: this.width,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator<Scanline> {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.width * this.height * 3);\n const rowSize = this.width * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.width,\n height: this.height,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_png_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentRow = 0;\n }\n}\n","import type { Encoder } from './decoders/types';\nimport { loadWasm, WasmJpegEncoder } from './wasm';\n\n/**\n * JPEG encoder using native WASM (libjpeg-turbo)\n *\n * This encoder uses the native WASM module for efficient JPEG encoding.\n * It supports both full-buffer and scanline-by-scanline encoding.\n */\nexport class NativeEncoder implements Encoder {\n readonly supportsScanline = true;\n\n private width = 0;\n private height = 0;\n private quality = 85;\n private wasmEncoder: WasmJpegEncoder | null = null;\n\n async init(width: number, height: number, quality: number): Promise<void> {\n this.width = width;\n this.height = height;\n this.quality = quality;\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create encoder\n this.wasmEncoder = new WasmJpegEncoder();\n this.wasmEncoder.init(width, height, quality);\n }\n\n async encode(pixels: Uint8Array): Promise<ArrayBuffer> {\n if (!this.wasmEncoder) {\n throw new Error('Encoder not initialized. Call init() first.');\n }\n\n return this.wasmEncoder.encodeAll(pixels);\n }\n\n dispose(): void {\n if (this.wasmEncoder) {\n this.wasmEncoder.dispose();\n this.wasmEncoder = null;\n }\n }\n}\n\n/**\n * Create a JPEG encoder\n *\n * Uses native WASM (libjpeg-turbo) for efficient encoding.\n * The WASM module must be built before use.\n */\nexport async function createEncoder(\n width: number,\n height: number,\n quality: number\n): Promise<Encoder> {\n const encoder = new NativeEncoder();\n await encoder.init(width, height, quality);\n return encoder;\n}\n","import type { ResizeState, Scanline } from './types';\n\n/**\n * Create a resize state for scanline-based bilinear interpolation\n *\n * This implements memory-efficient resizing that only needs 2 source rows\n * in memory at any time, regardless of image size.\n */\nexport function createResizeState(\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): ResizeState {\n return {\n srcWidth,\n srcHeight,\n dstWidth,\n dstHeight,\n bufferA: null,\n bufferB: null,\n bufferAY: -1,\n bufferBY: -1,\n currentOutputY: 0,\n };\n}\n\n/**\n * Horizontally resize a single scanline using bilinear interpolation\n *\n * @param src - Source scanline (RGB, 3 bytes per pixel)\n * @param srcWidth - Source width\n * @param dstWidth - Destination width\n * @returns Resized scanline\n */\nfunction resizeRowHorizontal(\n src: Uint8Array,\n srcWidth: number,\n dstWidth: number\n): Uint8Array {\n const dst = new Uint8Array(dstWidth * 3);\n const xScale = srcWidth / dstWidth;\n\n for (let dstX = 0; dstX < dstWidth; dstX++) {\n // Map destination X to source X\n const srcXFloat = dstX * xScale;\n const srcX0 = Math.floor(srcXFloat);\n const srcX1 = Math.min(srcX0 + 1, srcWidth - 1);\n const t = srcXFloat - srcX0;\n const invT = 1 - t;\n\n // Source pixel offsets\n const src0 = srcX0 * 3;\n const src1 = srcX1 * 3;\n const dstOffset = dstX * 3;\n\n // Bilinear interpolation for RGB\n dst[dstOffset] = Math.round(src[src0] * invT + src[src1] * t);\n dst[dstOffset + 1] = Math.round(src[src0 + 1] * invT + src[src1 + 1] * t);\n dst[dstOffset + 2] = Math.round(src[src0 + 2] * invT + src[src1 + 2] * t);\n }\n\n return dst;\n}\n\n/**\n * Blend two horizontally-resized rows vertically\n *\n * @param rowA - First row (already horizontally resized)\n * @param rowB - Second row (already horizontally resized)\n * @param t - Blend factor (0 = all rowA, 1 = all rowB)\n * @param width - Width in pixels\n * @returns Blended row\n */\nfunction blendRows(\n rowA: Uint8Array,\n rowB: Uint8Array,\n t: number,\n width: number\n): Uint8Array {\n const result = new Uint8Array(width * 3);\n const invT = 1 - t;\n\n for (let i = 0; i < width * 3; i++) {\n result[i] = Math.round(rowA[i] * invT + rowB[i] * t);\n }\n\n return result;\n}\n\n/**\n * Process a source scanline and potentially output resized scanlines\n *\n * This is the core of the streaming resize algorithm. Call this for each\n * source scanline in order (y = 0, 1, 2, ...). It will return output\n * scanlines as they become available.\n *\n * Memory usage: Only keeps 2 horizontally-resized rows in memory at a time\n *\n * @param state - Resize state (mutated)\n * @param srcScanline - Source scanline (RGB, 3 bytes per pixel)\n * @param srcY - Source Y position (must be called in order)\n * @returns Array of output scanlines (may be 0, 1, or more)\n */\nexport function processScanline(\n state: ResizeState,\n srcScanline: Uint8Array,\n srcY: number\n): Scanline[] {\n const { srcWidth, srcHeight, dstWidth, dstHeight } = state;\n const yScale = srcHeight / dstHeight;\n const output: Scanline[] = [];\n\n // Horizontally resize this source row\n const resizedRow = resizeRowHorizontal(srcScanline, srcWidth, dstWidth);\n\n // Update buffers - rotate A ← B, B ← new\n state.bufferA = state.bufferB;\n state.bufferAY = state.bufferBY;\n state.bufferB = resizedRow;\n state.bufferBY = srcY;\n\n // Generate output rows that fall within [bufferAY, bufferBY]\n while (state.currentOutputY < dstHeight) {\n const srcYFloat = state.currentOutputY * yScale;\n const srcYFloor = Math.floor(srcYFloat);\n const srcYCeil = Math.min(srcYFloor + 1, srcHeight - 1);\n\n // Can we generate this output row with current buffers?\n if (srcYCeil > srcY) {\n // Need more source rows\n break;\n }\n\n // Handle edge cases at the beginning\n if (state.bufferA === null) {\n // First row - just use bufferB\n output.push({\n data: state.bufferB,\n width: dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n continue;\n }\n\n // Both buffers available - do bilinear blend\n const t = srcYFloat - srcYFloor;\n\n // Determine which buffers to use\n let rowA = state.bufferA;\n let rowB = state.bufferB;\n\n // If srcYFloor matches bufferBY, we need to use bufferB for both\n if (srcYFloor === state.bufferBY) {\n rowA = state.bufferB;\n rowB = state.bufferB;\n } else if (srcYCeil === state.bufferAY) {\n // Edge case: use bufferA for both\n rowA = state.bufferA;\n rowB = state.bufferA;\n }\n\n const blended = blendRows(rowA, rowB, t, dstWidth);\n output.push({\n data: blended,\n width: dstWidth,\n y: state.currentOutputY,\n });\n\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Flush any remaining output rows after all source rows have been processed\n *\n * @param state - Resize state\n * @returns Remaining output scanlines\n */\nexport function flushResize(state: ResizeState): Scanline[] {\n const output: Scanline[] = [];\n\n // Generate any remaining rows using the last available buffer\n while (state.currentOutputY < state.dstHeight) {\n if (state.bufferB === null) break;\n\n output.push({\n data: state.bufferB,\n width: state.dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Calculate target dimensions while preserving aspect ratio\n *\n * @param srcWidth - Source width\n * @param srcHeight - Source height\n * @param maxWidth - Maximum target width\n * @param maxHeight - Maximum target height\n * @returns Target dimensions\n */\nexport function calculateTargetDimensions(\n srcWidth: number,\n srcHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number; scale: number } {\n const scaleX = maxWidth / srcWidth;\n const scaleY = maxHeight / srcHeight;\n const scale = Math.min(scaleX, scaleY, 1); // Never upscale\n\n return {\n width: Math.round(srcWidth * scale),\n height: Math.round(srcHeight * scale),\n scale,\n };\n}\n\n/**\n * Calculate optimal JPEG DCT scale factor\n *\n * JPEG can decode at 1/1, 1/2, 1/4, or 1/8 scale using DCT scaling.\n * This dramatically reduces memory usage during decode.\n *\n * @param srcWidth - Source image width\n * @param srcHeight - Source image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n * @returns Scale denominator (1, 2, 4, or 8)\n */\nexport function calculateDctScaleFactor(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): 1 | 2 | 4 | 8 {\n // We want the smallest DCT scale that still gives us enough pixels\n // to resize down to target dimensions without upscaling\n\n const scales: (1 | 2 | 4 | 8)[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n // If scaled dimensions are >= target, this scale works\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n // Fallback to no scaling\n return 1;\n}\n","/**\n * Streaming Image Processing Pipeline\n *\n * Ultra memory-efficient processing that:\n * 1. Decodes JPEG at reduced scale using DCT scaling\n * 2. Resizes using scanline-based bilinear interpolation (2 rows in memory)\n * 3. Encodes to JPEG scanline-by-scanline\n *\n * Peak memory usage is ~50KB regardless of input image size.\n */\n\nimport type { ProcessOptions, ProcessResult, Scanline } from './types';\nimport { probe } from './probe';\nimport {\n loadWasm,\n isWasmAvailable,\n WasmJpegDecoder,\n WasmJpegEncoder,\n WasmPngDecoder,\n calculateOptimalScale,\n} from './wasm';\nimport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n} from './resize';\n\n/**\n * Default options for streaming processing\n */\nconst DEFAULT_OPTIONS: Required<ProcessOptions> = {\n maxWidth: 4096,\n maxHeight: 4096,\n maxBytes: 1.5 * 1024 * 1024,\n quality: 85,\n};\n\n/**\n * Process a JPEG image using streaming pipeline\n *\n * This is the ultra-memory-efficient path that:\n * - Uses DCT scaling to decode at reduced resolution\n * - Processes one scanline at a time\n * - Never holds the full image in memory\n *\n * @param input - JPEG image data\n * @param options - Processing options\n * @returns Processed JPEG result\n */\nexport async function processJpegStreaming(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create decoder and read header\n const decoder = new WasmJpegDecoder();\n\n try {\n const { width: srcWidth, height: srcHeight } = decoder.init(input);\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Calculate optimal DCT scale\n const dctScale = calculateOptimalScale(\n srcWidth,\n srcHeight,\n target.width,\n target.height\n );\n\n // Set scale and get actual decode dimensions\n const { width: decodeWidth, height: decodeHeight } = decoder.setScale(dctScale);\n\n // Create resize state\n const resizeState = createResizeState(\n decodeWidth,\n decodeHeight,\n target.width,\n target.height\n );\n\n // Create encoder\n const encoder = new WasmJpegEncoder();\n encoder.init(target.width, target.height, opts.quality);\n encoder.start();\n\n // Start decoding\n decoder.start();\n\n // Process scanlines\n let decodedLine = 0;\n for (const scanline of decoder.readAllScanlines()) {\n // Process through resize\n const outputScanlines = processScanline(resizeState, scanline.data, decodedLine);\n decodedLine++;\n\n // Write output scanlines to encoder\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n }\n }\n\n // Flush remaining resize output\n const remaining = flushResize(resizeState);\n for (const outScanline of remaining) {\n encoder.writeScanline(outScanline);\n }\n\n // Finish encoding\n const jpegData = encoder.finish();\n\n // Check size and retry with lower quality if needed\n if (jpegData.byteLength > opts.maxBytes && opts.quality > 45) {\n encoder.dispose();\n decoder.dispose();\n\n // Retry with lower quality\n return processJpegStreaming(input, {\n ...opts,\n quality: opts.quality - 10,\n });\n }\n\n encoder.dispose();\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n };\n } finally {\n decoder.dispose();\n }\n}\n\n/**\n * Process a PNG image using streaming pipeline\n *\n * Uses libspng for row-by-row decoding:\n * - Decodes one row at a time\n * - Processes through resize\n * - Encodes to JPEG scanline by scanline\n *\n * Note: PNG doesn't support DCT scaling like JPEG, so we decode at full\n * resolution but process row by row to minimize memory usage.\n *\n * @param input - PNG image data\n * @param options - Processing options\n * @returns Processed JPEG result\n */\nexport async function processPngStreaming(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Ensure WASM is loaded\n await loadWasm();\n\n // Create PNG decoder and read header\n const decoder = new WasmPngDecoder();\n\n try {\n const { width: srcWidth, height: srcHeight } = decoder.init(input);\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Create resize state (from full resolution to target)\n const resizeState = createResizeState(\n srcWidth,\n srcHeight,\n target.width,\n target.height\n );\n\n // Create JPEG encoder\n const encoder = new WasmJpegEncoder();\n encoder.init(target.width, target.height, opts.quality);\n encoder.start();\n\n // Start decoding\n decoder.start();\n\n // Process scanlines\n let decodedLine = 0;\n for (const scanline of decoder.readAllScanlines()) {\n // Process through resize\n const outputScanlines = processScanline(resizeState, scanline.data, decodedLine);\n decodedLine++;\n\n // Write output scanlines to encoder\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n }\n }\n\n // Flush remaining resize output\n const remaining = flushResize(resizeState);\n for (const outScanline of remaining) {\n encoder.writeScanline(outScanline);\n }\n\n // Finish encoding\n const jpegData = encoder.finish();\n\n // Check size and retry with lower quality if needed\n if (jpegData.byteLength > opts.maxBytes && opts.quality > 45) {\n encoder.dispose();\n decoder.dispose();\n\n // Retry with lower quality\n return processPngStreaming(input, {\n ...opts,\n quality: opts.quality - 10,\n });\n }\n\n encoder.dispose();\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'png',\n };\n } finally {\n decoder.dispose();\n }\n}\n\n/**\n * Check if streaming processing is available\n *\n * Returns false if WASM module is not built/loaded.\n */\nexport function isStreamingAvailable(): boolean {\n return isWasmAvailable();\n}\n\n/**\n * Try to load WASM for streaming processing\n *\n * Call this early to warm up the WASM module.\n */\nexport async function initStreaming(): Promise<boolean> {\n try {\n await loadWasm();\n return true;\n } catch {\n return false;\n }\n}\n","import type { ProcessOptions, ProcessResult, ImageFormat } from './types';\nimport { probe, detectImageFormat } from './probe';\nimport { createDecoder } from './decoders/simple';\nimport { createEncoder } from './encoder';\nimport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n} from './resize';\nimport { processJpegStreaming, processPngStreaming, isStreamingAvailable, initStreaming } from './streaming';\nimport { loadWasm } from './wasm';\n\n/**\n * Default processing options\n */\nconst DEFAULT_OPTIONS: Required<ProcessOptions> = {\n maxWidth: 4096,\n maxHeight: 4096,\n maxBytes: 1.5 * 1024 * 1024, // 1.5MB\n quality: 85,\n};\n\n/**\n * Process an image: decode, resize, and encode to JPEG\n *\n * For JPEG images, uses ultra-memory-efficient streaming pipeline when WASM\n * is available (DCT scaling + scanline processing). Falls back to full-memory\n * decode for other formats or when WASM is not built.\n *\n * @param input - Image data as ArrayBuffer\n * @param options - Processing options\n * @returns Processed image result\n */\nexport async function process(\n input: ArrayBuffer,\n options: ProcessOptions = {}\n): Promise<ProcessResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Probe for format and dimensions\n const probeResult = probe(input);\n if (probeResult.format === 'unknown') {\n throw new Error('Unknown image format');\n }\n\n const { format, width: srcWidth, height: srcHeight } = probeResult;\n\n // JPEG: Use WASM streaming pipeline\n if (format === 'jpeg') {\n return await processJpegStreaming(input, opts);\n }\n\n // PNG: Use WASM streaming pipeline\n if (format === 'png') {\n return await processPngStreaming(input, opts);\n }\n\n // WebP and AVIF use @jsquash decoder + WASM encoder\n // These formats don't have native WASM decoders yet\n // Ensure WASM is loaded for the encoder\n await loadWasm();\n\n // Calculate target dimensions\n const target = calculateTargetDimensions(\n srcWidth,\n srcHeight,\n opts.maxWidth,\n opts.maxHeight\n );\n\n // Decode with @jsquash (full memory decode for WebP/AVIF)\n const decoder = await createDecoder(format, input);\n const { pixels: srcPixels, width: decodedWidth, height: decodedHeight } = await decoder.decode();\n decoder.dispose();\n\n // Resize using scanline method (still more memory efficient than alternatives)\n const resizedPixels = resizePixelBuffer(\n srcPixels,\n decodedWidth,\n decodedHeight,\n target.width,\n target.height\n );\n\n // Encode to JPEG\n let quality = opts.quality;\n let jpegData = await encodeToJpeg(resizedPixels, target.width, target.height, quality);\n\n // If too large, reduce quality and retry\n while (jpegData.byteLength > opts.maxBytes && quality > 45) {\n quality -= 10;\n jpegData = await encodeToJpeg(resizedPixels, target.width, target.height, quality);\n }\n\n // If still too large, resize further\n if (jpegData.byteLength > opts.maxBytes) {\n const scaleFactor = Math.sqrt(opts.maxBytes / jpegData.byteLength) * 0.9; // 10% margin\n const newWidth = Math.round(target.width * scaleFactor);\n const newHeight = Math.round(target.height * scaleFactor);\n\n const smallerPixels = resizePixelBuffer(\n resizedPixels,\n target.width,\n target.height,\n newWidth,\n newHeight\n );\n\n jpegData = await encodeToJpeg(smallerPixels, newWidth, newHeight, quality);\n\n return {\n data: jpegData,\n width: newWidth,\n height: newHeight,\n mimeType: 'image/jpeg',\n originalFormat: format,\n };\n }\n\n return {\n data: jpegData,\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: format,\n };\n}\n\n/**\n * Resize a full pixel buffer using the scanline method\n *\n * This is more memory efficient than matrix-based resize because it only\n * keeps 2 rows in memory at a time during the resize operation.\n */\nfunction resizePixelBuffer(\n srcPixels: Uint8Array,\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): Uint8Array {\n if (srcWidth === dstWidth && srcHeight === dstHeight) {\n return srcPixels;\n }\n\n const state = createResizeState(srcWidth, srcHeight, dstWidth, dstHeight);\n const outputRows: Uint8Array[] = new Array(dstHeight);\n\n // Process each source row\n const srcRowSize = srcWidth * 3;\n for (let y = 0; y < srcHeight; y++) {\n const srcRow = srcPixels.subarray(y * srcRowSize, (y + 1) * srcRowSize);\n const outputScanlines = processScanline(state, srcRow, y);\n\n for (const scanline of outputScanlines) {\n outputRows[scanline.y] = scanline.data;\n }\n }\n\n // Flush remaining rows\n const remaining = flushResize(state);\n for (const scanline of remaining) {\n outputRows[scanline.y] = scanline.data;\n }\n\n // Combine into single buffer\n const dstRowSize = dstWidth * 3;\n const result = new Uint8Array(dstWidth * dstHeight * 3);\n for (let y = 0; y < dstHeight; y++) {\n if (outputRows[y]) {\n result.set(outputRows[y], y * dstRowSize);\n }\n }\n\n return result;\n}\n\n/**\n * Encode RGB pixels to JPEG\n */\nasync function encodeToJpeg(\n pixels: Uint8Array,\n width: number,\n height: number,\n quality: number\n): Promise<ArrayBuffer> {\n const encoder = await createEncoder(width, height, quality);\n const result = await encoder.encode(pixels);\n encoder.dispose();\n return result;\n}\n\n/**\n * Get information about an image without decoding it\n */\nexport { probe, detectImageFormat };\n","/**\n * @standardagents/sip - Small Image Processor\n *\n * Ultra memory-efficient image processing for Cloudflare Workers.\n *\n * Features:\n * - Format detection without full decode (probe)\n * - Scanline-based bilinear resize (constant memory)\n * - JPEG output with quality control\n * - Support for JPEG, PNG, WebP, AVIF input formats\n *\n * @example\n * ```typescript\n * import { sip } from '@standardagents/sip';\n *\n * // Process an image\n * const result = await sip.process(imageBuffer, {\n * maxWidth: 2048,\n * maxHeight: 2048,\n * maxBytes: 1.5 * 1024 * 1024,\n * quality: 85,\n * });\n *\n * // result.data: ArrayBuffer (JPEG)\n * // result.width, result.height: output dimensions\n * // result.mimeType: 'image/jpeg'\n *\n * // Just probe for info\n * const info = sip.probe(imageBuffer);\n * // info.format: 'jpeg' | 'png' | 'webp' | 'avif'\n * // info.width, info.height: original dimensions\n * ```\n */\n\nexport * from './types';\nexport { probe, detectImageFormat } from './probe';\nexport { process } from './pipeline';\nexport {\n createResizeState,\n processScanline,\n flushResize,\n calculateTargetDimensions,\n calculateDctScaleFactor,\n} from './resize';\nexport {\n processJpegStreaming,\n isStreamingAvailable,\n initStreaming,\n} from './streaming';\n\n// WASM module exports (for advanced usage)\nexport * from './wasm';\n\n// Convenience namespace\nimport { process } from './pipeline';\nimport { probe, detectImageFormat } from './probe';\nimport { initStreaming, isStreamingAvailable } from './streaming';\n\nexport const sip = {\n process,\n probe,\n detectImageFormat,\n initStreaming,\n isStreamingAvailable,\n};\n"]}
package/dist/sip.js ADDED
@@ -0,0 +1,2 @@
1
+ async function createSipModule(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["i"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("sip.wasm")}return new URL("sip.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var getHeapMax=()=>134217728;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var _fd_close=fd=>52;var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>2]=num;return 0};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func(...cArgs);function onDone(ret){if(stack!==0)stackRestore(stack);return convertReturnValue(ret)}ret=onDone(ret);return ret};var cwrap=(ident,returnType,argTypes,opts)=>{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var _sip_get_error,_sip_decoder_create,_sip_decoder_set_source,_sip_decoder_read_header,_sip_decoder_get_width,_sip_decoder_get_height,_sip_decoder_set_scale,_sip_decoder_get_output_width,_sip_decoder_get_output_height,_sip_decoder_start,_malloc,_sip_decoder_get_row_buffer,_sip_decoder_read_scanline,_sip_decoder_get_scanline,_sip_decoder_finish,_free,_sip_decoder_destroy,_sip_png_decoder_create,_sip_png_decoder_set_source,_sip_png_decoder_read_header,_sip_png_decoder_get_width,_sip_png_decoder_get_height,_sip_png_decoder_has_alpha,_sip_png_decoder_start,_sip_png_decoder_get_row_buffer,_sip_png_decoder_read_row,_sip_png_decoder_get_row,_sip_png_decoder_finish,_sip_png_decoder_destroy,_sip_encoder_create,_sip_encoder_init,_sip_encoder_start,_sip_encoder_get_row_buffer,_sip_encoder_write_scanline,_sip_encoder_write_scanline_from,_sip_encoder_get_scanline,_sip_encoder_finish,_sip_encoder_get_output,_sip_encoder_get_output_size,_sip_encoder_destroy,_sip_malloc,_sip_free,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_sip_get_error=Module["_sip_get_error"]=wasmExports["j"];_sip_decoder_create=Module["_sip_decoder_create"]=wasmExports["k"];_sip_decoder_set_source=Module["_sip_decoder_set_source"]=wasmExports["l"];_sip_decoder_read_header=Module["_sip_decoder_read_header"]=wasmExports["m"];_sip_decoder_get_width=Module["_sip_decoder_get_width"]=wasmExports["n"];_sip_decoder_get_height=Module["_sip_decoder_get_height"]=wasmExports["o"];_sip_decoder_set_scale=Module["_sip_decoder_set_scale"]=wasmExports["p"];_sip_decoder_get_output_width=Module["_sip_decoder_get_output_width"]=wasmExports["q"];_sip_decoder_get_output_height=Module["_sip_decoder_get_output_height"]=wasmExports["r"];_sip_decoder_start=Module["_sip_decoder_start"]=wasmExports["s"];_malloc=Module["_malloc"]=wasmExports["t"];_sip_decoder_get_row_buffer=Module["_sip_decoder_get_row_buffer"]=wasmExports["u"];_sip_decoder_read_scanline=Module["_sip_decoder_read_scanline"]=wasmExports["v"];_sip_decoder_get_scanline=Module["_sip_decoder_get_scanline"]=wasmExports["w"];_sip_decoder_finish=Module["_sip_decoder_finish"]=wasmExports["x"];_free=Module["_free"]=wasmExports["y"];_sip_decoder_destroy=Module["_sip_decoder_destroy"]=wasmExports["z"];_sip_png_decoder_create=Module["_sip_png_decoder_create"]=wasmExports["A"];_sip_png_decoder_set_source=Module["_sip_png_decoder_set_source"]=wasmExports["B"];_sip_png_decoder_read_header=Module["_sip_png_decoder_read_header"]=wasmExports["C"];_sip_png_decoder_get_width=Module["_sip_png_decoder_get_width"]=wasmExports["D"];_sip_png_decoder_get_height=Module["_sip_png_decoder_get_height"]=wasmExports["E"];_sip_png_decoder_has_alpha=Module["_sip_png_decoder_has_alpha"]=wasmExports["F"];_sip_png_decoder_start=Module["_sip_png_decoder_start"]=wasmExports["G"];_sip_png_decoder_get_row_buffer=Module["_sip_png_decoder_get_row_buffer"]=wasmExports["H"];_sip_png_decoder_read_row=Module["_sip_png_decoder_read_row"]=wasmExports["I"];_sip_png_decoder_get_row=Module["_sip_png_decoder_get_row"]=wasmExports["J"];_sip_png_decoder_finish=Module["_sip_png_decoder_finish"]=wasmExports["K"];_sip_png_decoder_destroy=Module["_sip_png_decoder_destroy"]=wasmExports["L"];_sip_encoder_create=Module["_sip_encoder_create"]=wasmExports["M"];_sip_encoder_init=Module["_sip_encoder_init"]=wasmExports["N"];_sip_encoder_start=Module["_sip_encoder_start"]=wasmExports["O"];_sip_encoder_get_row_buffer=Module["_sip_encoder_get_row_buffer"]=wasmExports["P"];_sip_encoder_write_scanline=Module["_sip_encoder_write_scanline"]=wasmExports["Q"];_sip_encoder_write_scanline_from=Module["_sip_encoder_write_scanline_from"]=wasmExports["R"];_sip_encoder_get_scanline=Module["_sip_encoder_get_scanline"]=wasmExports["S"];_sip_encoder_finish=Module["_sip_encoder_finish"]=wasmExports["T"];_sip_encoder_get_output=Module["_sip_encoder_get_output"]=wasmExports["U"];_sip_encoder_get_output_size=Module["_sip_encoder_get_output_size"]=wasmExports["V"];_sip_encoder_destroy=Module["_sip_encoder_destroy"]=wasmExports["W"];_sip_malloc=Module["_sip_malloc"]=wasmExports["X"];_sip_free=Module["_sip_free"]=wasmExports["Y"];__emscripten_stack_restore=wasmExports["Z"];__emscripten_stack_alloc=wasmExports["_"];_emscripten_stack_get_current=wasmExports["$"];memory=wasmMemory=wasmExports["h"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={g:___assert_fail,b:_emscripten_resize_heap,d:_environ_get,e:_environ_sizes_get,f:_exit,c:_fd_close,a:_fd_write};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}
2
+ ;return moduleRtn}export default createSipModule;
package/dist/sip.wasm ADDED
Binary file
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@standardagents/sip",
3
+ "version": "0.10.0-dev",
4
+ "description": "Small Image Processor - Ultra memory-efficient image processing for Cloudflare Workers",
5
+ "private": false,
6
+ "publishConfig": {
7
+ "access": "restricted",
8
+ "registry": "https://registry.npmjs.org/"
9
+ },
10
+ "type": "module",
11
+ "license": "UNLICENSED",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/standardagents/standardagents.git",
15
+ "directory": "packages/sip"
16
+ },
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "workerd": "./dist/index.js",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./dist/sip.wasm": "./dist/sip.wasm"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "clean": "rm -f dist/index.js dist/index.d.ts dist/index.js.map",
33
+ "build": "([ -f dist/sip.wasm ] || pnpm build:wasm) && pnpm clean && tsup",
34
+ "build:wasm": "bash wasm/build.sh",
35
+ "build:code": "pnpm clean && tsup",
36
+ "dev": "tsup --watch",
37
+ "typecheck": "tsc --noEmit",
38
+ "test": "vitest",
39
+ "test:unit": "vitest run",
40
+ "test:watch": "vitest --watch",
41
+ "test:workers": "vitest run --config vitest.config.workers.ts"
42
+ },
43
+ "dependencies": {
44
+ "@jsquash/avif": "^2.1.1",
45
+ "@jsquash/webp": "^1.5.0"
46
+ },
47
+ "devDependencies": {
48
+ "@cloudflare/vitest-pool-workers": "^0.10.14",
49
+ "@cloudflare/workers-types": "^4.0.0",
50
+ "@types/node": "^22.16.5",
51
+ "tsup": "^8.0.0",
52
+ "typescript": "~5.8.0",
53
+ "vitest": "^2.1.9"
54
+ }
55
+ }