asciify-engine 1.0.76 → 1.0.78

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/fire.ts","../src/backgrounds/dna.ts","../src/backgrounds/terrain.ts","../src/backgrounds/circuit.ts","../src/backgrounds/index.ts","../src/core/ascii-text.ts","../src/core/text-frame.ts","../src/core/record.ts","../src/core/webcam.ts"],"names":["fade","parseGIF","decompressFrames","video","renderW","renderH","cancelled","animId","firstFrame","tick","alpha","_"],"mappings":";AAgBO,IAAM,cAAA,GAAiG;AAAA,EAC5G,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAc,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EAClF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,IAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,UAAA,EAAY,EAAE,IAAA,EAAM,YAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,SAAA,EAAY,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA;AACzE;AA0NO,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,wEAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,mDAAA;AAAA,EACN,OAAA,EAAS,sDAAA;AAAA,EACT,UAAA,EAAY,+JAAA;AAAA,EACZ,GAAA,EAAK,iCAAA;AAAA,EACL,KAAA,EAAO,uCAAA;AAAA,EACP,OAAA,EAAS,6yBAAA;AAAA,EACT,QAAA,EAAU,6UAAA;AAAA,EACV,OAAA,EAAS,6CAAA;AAAA,EACT,KAAA,EAAO,8EAAA;AAAA,EACP,OAAA,EAAW,2CAAA;AAAA,EACX,OAAA,EAAW,iDAAA;AAAA,EACX,SAAA,EAAY,uDAAA;AAAA,EACZ,SAAA,EAAY,uDAAA;AAAA,EACZ,KAAA,EAAY,iFAAA;AAAA,EACZ,KAAA,EAAY,yDAAA;AAAA,EACZ,MAAA,EAAY,2EAAA;AAAA,EACZ,KAAA,EAAY;AACd;AAUO,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,QAAU,CAAC,QAAA,CAAS,WAAW,QAAA,CAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA;AAAA,EAEjE,MAAU,CAAC,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA;AAAA,EAE/D,UAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,UAAA,EAAY,SAAS,QAAQ,CAAA;AAAA;AAAA,EAEjE,SAAU,CAAC,QAAA,CAAS,QAAQ,QAAA,CAAS,SAAA,EAAW,SAAS,MAAM,CAAA;AAAA;AAAA,EAE/D,OAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA;AAAA,EAE3D,OAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,QAAA,EAAU,SAAS,MAAM,CAAA;AAAA;AAAA,EAE7D,OAAU,CAAC,QAAA,CAAS,SAAS,QAAA,CAAS,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA;AAAA,EAE7D,SAAU,CAAC,QAAA,CAAS,WAAW,QAAA,CAAS,MAAA,EAAQ,SAAS,SAAS;AACpE;AASO,IAAM,iBAAA,GAA6D;AAAA,EACxE,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,UAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,GAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,SAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,SAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,MAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA;AAEjB;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,SAAS,QAAA,CAAS,QAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,SAAA;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY,OAAA;AAAA,EACZ,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,UAAA,EAAY,IAAA;AAAA,EACZ,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,CAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,IAAA;AAAA,EACX,kBAAA,EAAoB;AACtB;AAKO,IAAM,aAAA,GAAwF;AAAA,EACnG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,EAAG,aAAa,WAAA,EAAa,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GACjG;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACrG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAC/F;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,eAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU;AAEvG;;;ACheO,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAGnD;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAChE,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AACvB;AAIO,SAAS,eAAA,CAAgB,GAAA,EAAa,UAAA,EAAoB,QAAA,EAA0B;AACzF,EAAA,IAAI,QAAA,GAAW,MAAM,UAAA,GAAa,GAAA;AAClC,EAAA,MAAM,SAAU,GAAA,IAAO,QAAA,GAAW,MAAM,GAAA,CAAA,IAAS,GAAA,IAAO,MAAM,QAAA,GAAW,GAAA,CAAA,CAAA;AACzE,EAAA,QAAA,GAAW,MAAA,IAAU,WAAW,GAAA,CAAA,GAAO,GAAA;AACvC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC5C;AAEO,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,EAAiB,MAAA,EAAyB;AACrF,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AACzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAC7D;AAEO,SAAS,iBACd,GAAA,EAAa,IAAA,EAAc,CAAA,EAAW,CAAA,EAAW,MAAc,MAAA,EACvD;AACR,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,IAAI,UAAA,GAAa,MAAM,OAAO,GAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,CAAA;AACtB,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,GAAO,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM,CAAA;AACjC;AAIA,IAAM,SAAA,GAAY;AAAA,EAChB,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAE,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACZ,CAAE,CAAA,EAAE,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC;AACd,CAAA;AAEO,SAAS,WAAA,CAAY,GAAA,EAAa,CAAA,EAAW,CAAA,EAAW,QAAA,EAA0B;AACvF,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,GAAA;AAC1B,EAAA,MAAM,SAAA,GAAA,CAAa,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,EAAA,GAAK,GAAA,IAAO,QAAA,GAAW,GAAA;AACpE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,GAAA,GAAM,SAAS,CAAC,CAAA;AACnD;AAIO,IAAM,QAAA,GAAqB,IAAI,KAAA,CAAM,GAAG,CAAA;AACxC,IAAM,SAAA,GAAsB,IAAI,KAAA,CAAM,GAAG,CAAA;AAChD,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,EAAA,QAAA,CAAS,EAAE,CAAA,GAAK,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,EAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA,MAAA,EAAS,EAAE,CAAA,GAAA,CAAA;AAC7B;AAIO,SAAS,gBACd,IAAA,EAAiB,SAAA,EAAmB,KAAa,GAAA,EAAa,GAAA,EAC9D,cAAc,KAAA,EACN;AACR,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA,IACzE,KAAK,QAAA,EAAU;AAMb,MAAA,OAAO,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,IACjC;AAAA,IACA,SAAS;AAKP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,OAAO,SAAS,IAAI,CAAA;AAAA,IACtB;AAAA;AAEJ;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACnB,SAAS,gBACd,IAAA,EAAiB,SAAA,EAAmB,KAAa,GAAA,EAAa,GAAA,EAC9D,cAAc,KAAA,EACJ;AACV,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAClE,MAAA;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAI,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AAEb,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AAAK,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AAAK,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AACvD,MAAA;AAAA,IACF;AAAA,IACA,SAAS;AAEP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACzD,MAAA;AAAA,IACF;AAAA;AAEF,EAAA,OAAO,SAAA;AACT;AAkCO,SAAS,oBACd,KAAA,EACqC;AACrC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,MAAM,IAAI,GAAA,CAAI,YAAA,CAAa,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA;AACvC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACrC;;;ACtKO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC1B;AAEO,SAAS,uBACd,CAAA,EACA,CAAA,EACA,MACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,CAAA;AAE7B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACjE,MAAA,OAAO,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,GAAA,CAAA;AAAA,IAC3C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,OAAO,CAAA,GAAA,CAAK,CAAA,GAAI,OAAO,CAAC,CAAA;AACpD,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACpE,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA;AAAA,IACrB;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxE,MAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC1D,MAAA,OAAO,GAAA,GAAM,MAAM,IAAA,GAAOA,KAAAA;AAAA,IAC5B;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAA,CAAK,IAAI,CAAA,IAAK,GAAA,GAAM,CAAC,CAAA,GAAI,GAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AAChF,MAAA,MAAM,OAAA,GAAW,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,OAAO,OAAA,GAAU,GAAA,GAAM,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,GAAA;AAAA,IAC9C;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,OAAO,IAAA,CAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,KAAK,CAAA,GAAI,UAAA;AACxE,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpD,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,IAAI,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,OAAO,OAAA,GAAU,MAAM,CAAA,GAAI,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAClF,MAAA,OAAO,OAAO,IAAA,GAAO,MAAA;AAAA,IACvB;AAAA,IACA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,GAAO,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAa,IAAI,GAAA,GAAO,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,WAAW,UAAA,GAAa,GAAA;AAC5C,MAAA,MAAM,OAAO,SAAA,GAAY,WAAA;AACzB,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,MAAA,MAAMA,QAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,IAAQ,aAAa,IAAA,CAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAI,CAAA;AAAA,IACzB;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChF,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,aAAa,CAAC,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,KAAA,GAAQ,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,WAAA;AAEH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC7C,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAK,KAAA,GAAQ,QAAA,GAAY,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC3E,MAAA,MAAM,WAAW,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,IAAS,WAAW,GAAA,CAAI,CAAA;AACzD,MAAA,OAAO,GAAA,GAAM,GAAA,GAAM,MAAA,IAAU,GAAA,GAAM,QAAA,GAAW,GAAA,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,MAAA,EAAQ;AAEX,MAAA,MAAM,QAAA,GAAY,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA;AACnC,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,QAAA,GAAW,IAAI,GAAA,GAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAC7D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAI,CAAA,GAAI,IAAA,GAAO,GAAI,CAAA,GAAI,GAAA;AAChD,MAAA,OAAO,IAAA,GAAO,IAAA,IAAQ,IAAA,IAAQ,CAAA,GAAI,OAAA,GAAU,GAAA,CAAA,CAAA;AAAA,IAC9C;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AAClC,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACjF,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,QAAQ,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAClE,MAAA,OAAO,MAAM,GAAA,GAAM,KAAA;AAAA,IACrB;AAAA,IACA,KAAK,UAAA,EAAY;AAEf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,KAAuB;AAChD,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,QAAQ,EAAA,GAAK,KAAA,GAAQ,IAAA,GAAO,UAAU,CAAA,GAAI,UAAA;AAClE,QAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AAAA,MACxC,CAAA;AACA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,MAAM,aACJ,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAChC,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,GAChC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GACxC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,IAAA,KAAS,CAAA,GACtB,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA,GAC3C,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA;AAC5B,MAAA,OAAO,SAAA,KAAc,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/B;AAAA,IACA;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAE;AAEvF,SAAS,kBAAA,CACd,EAAA,EACA,EAAA,EACA,MAAA,EACA,QACA,cAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,GAAsB,WAAA,EACtB,YAAA,GAAuB,GAAA,EACvB,QAAoB,QAAA,EACC;AACrB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAEhB,EAAA,MAAM,MAAA,GAAU,IAAA,GAAO,YAAA,GAAe,IAAA,GAAQ,QAAA,GAAW,IAAA;AAGzD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,UAAU,KAAA,EAAO;AAEnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC5B,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ,CAAA,MAAO;AAEL,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClC,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,YAAA,CAAa,KAAA,GAAQ,CAAA;AACrB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,IAAA,GAAO,CAAA;AACpB,IAAA,YAAA,CAAa,UAAA,GAAa,CAAA;AAC1B,IAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,OAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,GAAI,cAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA,EAAa;AAChB,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AAC7C,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,KAAA,GAAQ,QAAQ,QAAA,GAAW,IAAA;AACxC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,CAAA;AAExC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,GAAO,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AACjD,MAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,QAAA,GAAW,GAAA,IAAO,MAAM,MAAA,GAAS,GAAA,CAAA;AACzD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,KAAA,GAAQ,WAAW,GAAG,CAAA;AAChD,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,IAAA;AAC/B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,YAAA,EAAc;AAGjB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,YAAA,CAAa,KAAA,GAAQ,KAAA;AACrB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AACpB,EAAA,YAAA,CAAa,UAAA,GAAa,UAAA;AAC1B,EAAA,YAAA,CAAa,SAAA,GAAY,KAAA;AACzB,EAAA,OAAO,YAAA;AACT;;;ACnRO,SAAS,WAAW,CAAA,EAAuD;AAChF,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,KAAK,CAAA,EAAmB;AAAE,EAAA,OAAO,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAI,EAAA,CAAA,GAAM,EAAA,CAAA;AAAK;AAC/E,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAG;AAGjF,SAAS,KAAA,CAAM,IAAY,EAAA,EAAoB;AACpD,EAAA,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AACxB,EAAA,CAAA,GAAM,KAAK,EAAA,GAAM,CAAA;AACjB,EAAA,OAAA,CAAS,KAAK,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAA,GAAU,aAAc,UAAA,IAAc,UAAA;AACtE;AAGO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA;AAC5B,EAAA,MAAM,KAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,GAAK,KAAK,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAA,GAAK,CAAC,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAChC,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA;AACxD;AAGO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,OAAA,CACE,OAAO,CAAA,EAAS,CAAO,IAAI,GAAA,GAC3B,MAAA,CAAO,IAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA,GAAI,OAC3B,MAAA,CAAO,CAAA,GAAI,KAAK,CAAA,GAAI,GAAG,IAAI,KAAA,IACzB,KAAA;AACN;;;AChBO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,UAAA,GAAkB,IAAA;AAAA,IAClB,eAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,YAAA;AAAA,IAClB,SAAA,GAAkB,IAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,cAAA,GAAkB,IAAA;AAAA,IAClB,YAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,MAAA,GAAkB,IAAA;AAAA,IAClB,QAAA,GAAkB,IAAA;AAAA,IAClB,OAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,UAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,eAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AACpB,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AAEpB,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,CAAA;AAEvE,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,aAAa,CAAA,GAAI,IAAA;AACvB,MAAA,MAAM,SAAA,GAAa,GAAA,CAAI,GAAA,GAAM,UAAA,GAAa,UAAA,EAAY,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAEzG,MAAA,MAAM,SAAA,GAAY,IAAA;AAClB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,GAAA,GAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAE7E,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,GAAO,SAAA,GAAY,IAAA,GAAO,YAAY,GAAA,GAAO,UAAA;AAEzE,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAK,CAAA;AACvD,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,IAAU,UAAU,IAAA,EAAM;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,GAAA,GAAM,UAAU,EAAE,CAAA;AACzD,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,IAAI,CAAA;AAC9C,QAAA,UAAA,GAAa,KAAA,GAAQ,UAAU,OAAA,GAAU,IAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,YAAY,CAAA;AACxD,MAAA,MAAM,SAAA,GACJ,YAAY,CAAA,GAAI,cAAA,CAAA,GAAA,CACf,YAAY,UAAA,GAAa,GAAA,IAAO,iBAC/B,UAAA,GAAa,IAAA;AACjB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAElD,MAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,MAAA,IAAI,QAAA,IAAY,UAAU,IAAA,EAAM;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,GAAM,CAAA,GAAI,SAAS,CAAA,EAAG,GAAA,GAAM,KAAK,MAAM,CAAA;AACjE,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAA,CAAW,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,KAAM,GAAA,EAAK;AAE5B,MAAA,MAAM,KAAA,GAAQ,QAAQ,cAAA,GAAiB,IAAA;AACvC,MAAA,MAAM,WAAW,cAAA,GAAiB,eAAA;AAElC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,SAAA,GAAY,MAAO,IAAA,EAAM,KAAA,IAAS,SAAA,GAAY,EAAA,GAAK,GAAA,CAAI,CAAA;AACpF,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,MAC1D,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,YAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxD,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,SAAA,GAAY,oBAAoB,KAAK,CAAA,CAAA,CAAA;AAAA,MAC3C;AAEA,MAAA,GAAA,CAAI,SAAS,KAAA,CAAM,OAAO,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AACF;;;AChIA,SAAS,cAAc,MAAA,EAAmC;AACxD,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA;AAC9B,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC7F;AAMA,SAAS,cAAc,GAAA,EAA4B;AACjD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,uBAAuB,CAAA;AAClD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAA,GAAI,SAAS,CAAC,CAAA;AAClB,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA;AACpD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,4CAA4C,CAAA;AACvE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAC1C,GAAA,CAAI,OAAK,QAAA,CAAS,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAClD,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,iBAAiB,WAAA,EAAyC;AACjE,EAAA,MAAM,IAAI,WAAA,IAAe,MAAA;AACzB,EAAA,IAAI,MAAM,MAAA,EAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AAE1C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA;AAC3D,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,YAAY,iBAAA,EAAmB,WAAA,EAAa,eAAe,CAAA,EAAG;AACpH,MAAA,MAAM,MAAM,aAAA,CAAc,SAAA,CAAU,iBAAiB,IAAI,CAAA,CAAE,MAAM,CAAA;AACjE,MAAA,IAAI,KAAK,OAAO,GAAA;AAAA,IAClB;AACA,IAAA,MAAM,SAAS,aAAA,CAAe,gBAAA,CAAiB,SAAS,IAAI,CAAA,CAAqD,eAAe,EAAE,CAAA;AAClI,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAEA,EAAA,MAAM,SAAS,OAAO,MAAA,KAAW,eAAe,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAClG,EAAA,OAAO,SAAS,QAAA,GAAW,QAAA;AAC7B;AAKO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACmD;AACnD,EAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,aAAa,MAAA,CAAO,KAAA;AACjF,EAAA,MAAM,SAAA,GAAY,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,cAAc,MAAA,CAAO,MAAA;AAEnF,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,WAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,UAAA,GAAa,OAAA,CAAQ,WAAA;AAEtD,EAAA,MAAM,UAAU,WAAA,IAAe,QAAA;AAC/B,EAAA,MAAM,UAAU,YAAA,IAAgB,SAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AAEvC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAQA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAI,CAAC,CAAC,CAAA;AACxF,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAC,CAAC,CAAA;AACzF,EAAA,MAAM,UAAU,IAAA,GAAO,GAAA;AACvB,EAAA,MAAM,UAAU,IAAA,GAAO,GAAA;AAEvB,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtD,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,SAAS,OAAO,CAAA;AACzD,EAAA,MAAM,SAAS,SAAA,CAAU,IAAA;AAMzB,EAAA,MAAM,KAAK,OAAA,CAAQ,SAAA;AACnB,EAAA,MAAM,SAAA,GAAY,EAAA,IAAM,IAAA,IAAQ,EAAA,KAAO,KAAA;AACvC,EAAA,MAAM,mBAAmB,EAAA,KAAO,IAAA;AAChC,EAAA,MAAM,kBAAmB,EAAA,KAAO,aAAA;AAChC,EAAA,IAAI,KAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,SAAA,IAAa,CAAC,gBAAA,IAAoB,CAAC,eAAA,EAAiB;AACtD,IAAA,KAAA,GAAQ,oBAAoB,EAAkD,CAAA;AAC9E,IAAA,OAAA,GAAA,CAAW,OAAA,CAAQ,sBAAsB,EAAA,KAAO,CAAA;AAAA,EAClD;AAMA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,SAAA,GAAY,GAAA;AAChB,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,IAAI,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACnB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAEzC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC3D,QAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,QACjD,WAAW,eAAA,EAAiB;AAC1B,UAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,QACjD,CAAA,MAAA,IAAW,UAAU,IAAA,EAAM;AACzB,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA;AAC5D,UAAA,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,IAAM,OAAA;AAAA,QACzC;AACA,QAAA,IAAI,KAAA,EAAO;AAAA,MACb;AACA,MAAA,MAAM,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAC1E,MAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACjB,MAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAAA,IACnB;AACA,IAAA,OAAA,GAAU,EAAA;AACV,IAAA,SAAA,GAAY,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,EAClC;AAEA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAM9C,EAAA,MAAM,gBAAA,GAAmB,SAAA,GACrB,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,CAAA,IAAK,OAAA,CAAQ,OAAA,GAC7C,OAAA,CAAQ,OAAA;AAEZ,EAAA,MAAM,UAAU,GAAA,GAAM,GAAA;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAE7B,MAAA,IAAI,OAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACzC,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,QAAA,MAAM,MAAA,GAAA,CAAU,CAAA,GAAI,GAAA,GAAM,EAAA,IAAM,OAAA;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,UAAA,MAAM,CAAA,GAAA,CAAK,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA,IAAM,CAAA;AACpC,UAAA,MAAM,KAAK,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,GAAI,CAAC,GAAG,EAAA,GAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAG/E,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,YAAA,IAAI,gBAAA,EAAkB;AACpB,cAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,YACjD,WAAW,eAAA,EAAiB;AAC1B,cAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,YACjD,CAAA,MAAA,IAAW,UAAU,IAAA,EAAM;AACzB,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA;AAC5D,cAAA,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,IAAM,OAAA;AAAA,YACzC;AACA,YAAA,IAAI,KAAA,EAAO;AAAE,cAAA,UAAA,EAAA;AAAc,cAAA;AAAA,YAAU;AAAA,UACvC;AAEA,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAA,QAC9C;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,IAAa,UAAA,GAAa,OAAA,GAAU,CAAA,EAAG;AACzC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,OAAA,GAAU,UAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAE3C,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC/C,MAAA,MAAM,MAAM,OAAA,CAAQ,SAAA,GAAA,CACd,MAAA,GAAS,OAAA,IAAW,YAAa,GAAA,GACnC,MAAA;AACJ,MAAA,MAAM,cAAc,eAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC7E,MAAA,MAAM,cAAc,WAAA,CAAY,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,QAAQ,cAAc,CAAA;AACzE,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,UAAA,GACjB,gBAAA,CAAiB,aAAa,OAAA,CAAQ,UAAA,EAAY,CAAA,EAAG,CAAA,EAAG,MAAM,SAAS,CAAA,GACvE,eAAA,CAAgB,WAAA,EAAa,kBAAkB,SAAS,CAAA;AAE5D,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,WAAA,EAAa,CAAA;AAAA,IACjD;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAC7B;AAKA,eAAsB,kBAAA,CACpB,KAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACA,SAAA,GAAoB,EAAA,EACpB,WAAA,GAAsB,EAAA,EACtB,UAAA,EACA,SAAA,GAAoB,CAAA,EACwD;AAC5E,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,GAAW,WAAW,WAAW,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,SAAS,CAAA;AAClD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,YAAa,CAAA,GAAI,SAAA;AAC9B,IAAA,IAAI,IAAA,GAAO,YAAY,QAAA,EAAU;AAEjC,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAC3C,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,aAAa,YAAY,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAC9C;AAKA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACA,cACA,UAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAMC,kBAAS,MAAM,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAYC,yBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AAE5C,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,QAAQ,EAAC,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAA,EAAG;AAAA,EACjD;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,MAAA,IAAU,IAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AAAE,IAAA,UAAA,IAAe,EAAE,KAAA,IAAS,GAAA;AAAA,EAAM;AAC7D,EAAA,MAAM,QAAA,GAAW,aAAa,SAAA,CAAU,MAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,QAAQ,CAAC,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,GAAG,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAa,GAAI,CAAA;AAEtC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,SAAA,CAAU,IAAI,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACjG,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AACxB,IAAA,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAA,EAAgB,CAAA,EAAG,CAAC,CAAA;AAEzC,IAAA,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,UAAA,EAAY,OAAA,EAAS,aAAa,YAAY,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,iBAAiB,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AACnC;AAMO,SAAS,mBAAA,CACd,KACA,KAAA,EACA,OAAA,EACA,aACA,YAAA,EACA,IAAA,GAAe,GACf,QAAA,EACA;AAEA,EAAA,IAAI,OAAA,CAAQ,mBAAmB,WAAA,EAAa;AAC1C,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACjF,IAAA,MAAM,UAAU,OAAA,CAAQ,WAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA,GAAI,QAAA;AAC9E,IAAA,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW;AAAA,MACpE,WAAA,EAAa,IAAI,OAAO,CAAA,CAAA;AAAA,MACxB,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,OAAA,CAAQ,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAA,CAAQ,aAAA,GAAgB,GAAG,CAAA,GAAI,IAAA;AAAA,MAC7F,YAAA,EAAc,GAAA;AAAA,MACd,OAAO,OAAA,CAAQ,cAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,aAAA,GAAgB,CAAA;AAAA,MAChC,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,SAAS,CAAA,EAAG;AAChB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAEtB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAE7C,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,KAAA;AACA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA;AACzB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,QAAA,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK;AAAE,UAAA,eAAA,GAAkB,IAAA;AAAM,UAAA,MAAM,KAAA;AAAA,QAAO;AAAA,MACnE;AAAA,IACF;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AAIpB,IAAA,MAAM,eAAe,OAAO,MAAA,KAAW,eAClC,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACvD,IAAA,GAAA,CAAI,SAAA,GAAY,eAAe,SAAA,GAAY,SAAA;AAC3C,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,QAAQ,WAAA,GAAc,IAAA;AAC5B,EAAA,MAAM,QAAQ,YAAA,GAAe,IAAA;AAC7B,EAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAE1B,EAAA,MAAM,cAAA,GAAiB,UAAU,SAAA,IAAa,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,QAAQ,cAAA,KAAmB,MAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,UAAA,GAAa,GAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,aAAA,IAAiB,CAAC,EAAE,QAAA,IAAY,OAAA,CAAQ,aAAA,GAAgB,CAAA,IAAK,cAAA,GAAiB,IAAA,CAAA;AAEnG,EAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAEnD,EAAA,MAAM,WAAA,GAAc,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GACtB,CAAA;AACpB,EAAA,MAAM,oBAAA,GAAuB,QAAQ,WAAA,GAAc,WAAA;AAEnD,EAAA,IAAI,cAAc,CAAA,EAAG,WAAA,GAAc,IAAA,EAAM,WAAA,GAAc,GAAG,WAAA,GAAc,IAAA;AACxE,EAAA,IAAI,SAAA,GAAY,GAAG,SAAA,GAAY,CAAA;AAC/B,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,MAAM,eAAA,GAAmB,IAAA,GAAO,oBAAA,GAAuB,IAAA,GAAQ,QAAQ,aAAA,GAAgB,IAAA;AACvF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAChF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,cAAc,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,QAAA;AACzC,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AACzB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AACpB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AAEpB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAQ;AACjC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,YAAA;AAEzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AAEjB,QAAA,MAAM,GAAA,GAAA,CAAO,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,aAAA;AACjE,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,GAAA;AACzC,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAEvE,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa,iBAAA;AAAA,YAAmB;AAAA,WAC/D;AACA,UAAA,QAAA,GAAW,EAAA,CAAG,KAAA;AACd,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,OAAA,GAAU,QAAA;AACjD,QAAA,IAAI,SAAS,GAAA,EAAK;AAElB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,WAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AACtE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAE9E,QAAA,IAAI,UAAU,SAAA,EAAW;AAAE,UAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,UAAA,SAAA,GAAY,KAAA;AAAA,QAAO;AACvE,QAAA,IAAI,UAAU,aAAA,EAAe;AAAE,UAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,UAAA,aAAA,GAAgB,KAAA;AAAA,QAAO;AAE7E,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,SAAS,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,GAAG,MAAM,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,UAAA,EAAY,KAAK,CAAA,GAAI,GAAA;AACvD,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAE/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,KAAa,OAAA;AACrC,MAAA,GAAA,CAAI,OAAO,OAAA,GACP,CAAA,EAAG,QAAQ,CAAA,2FAAA,CAAA,GACX,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACf,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAA,IACrB;AAEA,IAAA,IAAI,WAAA,GAA6C,IAAA;AAEjD,IAAA,MAAM,UAAU,OAAA,CAAQ,aAAA;AACxB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAC,OAAA,EAAS,MAAA;AAC1B,IAAA,MAAM,aAAa,MAAA,GACf,OAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,IAAK,QAAQ,UAAA,IAAc,CAAA,CAAE,IAAI,OAAA,CAAS,MAAM,IACpF,OAAA,CAAQ,OAAA;AAEZ,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,UAAU,CAAA;AAC9B,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,GAAc,GAAA,CAAI,cAAa,GAAI,IAAA;AAO1D,IAAA,MAAM,YAAA,GAAe,gBAAgB,YAAA,IAAgB,WAAA;AACrD,IAAA,MAAM,YAAA,GAAe,gCAAA;AACrB,IAAA,MAAM,YAAY,YAAA,CAAa,MAAA;AAC/B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,SAAA;AACrC,MAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAA;AACzC,MAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAA;AAGzC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9C,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAC,CAAA;AACzE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAC,CAAA;AACzE,QAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA;AACjF,QAAA,MAAA,GAAS,MAAM,GAAG,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,OAAA,IAAW,SAAA;AAAA,MACtB;AACA,MAAA,SAAA,GAAY,MAAA,CAAO,MAAA;AAGnB,MAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,oBAAA,GAAuB,GAAG,CAAC,CAAC,CAAA;AACtF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AAC5C,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,QAAQ,CAAA;AAC/C,MAAA,IAAI,UAAA,GAAa,eAAe,IAAA,EAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,YAAY,CAAA;AAGlF,MAAA,UAAA,GAAa,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AACjB,QAAA,IAAI,QAAA,GAAW,MAAA,IAAU,IAAA,CAAK,GAAA,IAAO,IAAA,GACjC,eAAA,CAAgB,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,UAAU,CAAA,GAChD,IAAA,CAAK,IAAA;AACT,QAAA,IAAI,aAAa,GAAA,EAAK;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AACvE,QAAA,IAAI,UAAU,IAAA,EAAM;AAEpB,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,QAAA,IAAI,WAAA,IAAe,CAAC,YAAA,IAAgB,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,WAAA,IAAe,CAAA,IAAK,WAAA,EAAa;AAChH,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa,iBAAA;AAAA,YAAmB;AAAA,WAC/D;AACA,UAAA,UAAA,GAAa,EAAA,CAAG,KAAA;AAChB,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAChB,UAAiB,EAAA,CAAG,SAAA;AAAA,QACtB;AAMA,QAAA,IAAI,YAAA,IAAgB,CAAA,IAAK,UAAA,IAAc,CAAA,GAAI,aAAa,YAAA,EAAc;AACpE,UAAA,MAAM,UAAU,CAAA,GAAI,UAAA;AACpB,UAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,GAAU,SAAA,EAAW;AACvC,YAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AAGjC,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,GAAG,CAAA;AAC1E,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,GAAI,WAAW,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AACjE,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACtC,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAG3D,YAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AACjF,YAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAEtC,YAAA,IAAI,MAAM,WAAA,EAAa;AAErB,cAAA,QAAA,GAAW,UAAA;AAAA,YACb,CAAA,MAAO;AAEL,cAAA,QAAA,GAAW,YAAA,CAAa,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,SAAS,CAAA;AAAA,YAClE;AACA,YAAA,SAAA,GAAY,MAAM,WAAA,GAAc,GAAA;AAChC,YAAA,UAAA,GAAa,MAAM,WAAA,GAAc,IAAA;AAAA,UACnC;AAAA,QACF;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,WAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AACtE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,QACpE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,MAAA,GAAS,WAAA,CAAa,QAAQ,CAAA,IAAK,GAAA;AACzC,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,IAAA,CAAK,IAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA,GAAI,MAAA;AACrF,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI,aAAa,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAAU,YAAA,SAAA,GAAY,QAAA;AAAA,UAAU;AAChF,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,GAAA,CAAI,QAAA,CAAS,KAAK,EAAA,GAAK,GAAA,EAAK,KAAK,EAAA,GAAK,GAAA,EAAK,IAAI,EAAE,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAC9E,UAAA,IAAI,UAAU,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,YAAA,SAAA,GAAY,KAAA;AAAA,UAAO;AACvE,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AACpB,YAAA,GAAA,CAAI,KAAA,CAAM,YAAY,UAAU,CAAA;AAChC,YAAA,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AAC3B,YAAA,GAAA,CAAI,aAAa,aAAc,CAAA;AAAA,UACjC,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU,EAAA,EAAI,EAAE,CAAA;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC1oBA,SAAS,cAAc,EAAA,EAAuF;AAC5G,EAAA,IAAI,EAAA,YAAc,kBAAkB,OAAO,EAAE,GAAG,EAAA,CAAG,UAAA,EAAY,CAAA,EAAG,EAAA,CAAG,WAAA,EAAY;AACjF,EAAA,IAAI,EAAA,YAAc,gBAAA,EAAkB,OAAO,EAAE,CAAA,EAAG,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,KAAA,EAAO,CAAA,EAAG,EAAA,CAAG,aAAA,IAAiB,GAAG,MAAA,EAAO;AAC9G,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,CAAA,EAAG,GAAG,MAAA,EAAO;AACrC;AAUA,SAAS,iBAAA,CAAkB,MAAc,IAAA,EAAoD;AAC3F,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAC,CAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA,EAAE;AAChF;AAgBA,SAAS,qBAAA,CACP,MAAA,EACA,SAAA,EACA,MAAA,EACA,MACA,IAAA,EACmD;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAU,qBAAA,EAAsB;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAG/D,EAAA,IAAI,IAAA,GAAO,KAAA,EAAO,IAAA,GAAO,IAAA,GAAO,MAAA;AAChC,EAAA,IAAI,OAAO,MAAA,EAAQ;AAAE,IAAA,IAAA,GAAO,MAAA;AAAQ,IAAA,IAAA,GAAO,IAAA,GAAO,MAAA;AAAA,EAAQ;AAC1D,EAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACtB,EAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAItB,EAAA,IAAI,OAAA,EAAiB,OAAA;AACrB,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,CAAC,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AAEJ,EAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,CAAM,QAAS,IAAA,GAAO,IAAA;AAC7B,EAAA,MAAA,CAAO,KAAA,CAAM,SAAS,IAAA,GAAO,IAAA;AAE7B,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,SAAA,EAAU;AAC5C;AAoBA,eAAsB,OAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EAC5C;AAC9B,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC3B,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,GAAA,GAAM,MAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,GAAA;AAAA,EACP,CAAA,MAAA,IAAW,MAAA,YAAkB,gBAAA,IAAoB,CAAC,OAAO,QAAA,EAAU;AACjE,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,MAAA;AAAA,EACP,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,MAAA;AAAA,EACP;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,MAAA,EAAQ,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAErG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAGhE,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,cAAc,EAAE,CAAA;AAC7C,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAGzD,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,OAAA,IAAW,MAAA,CAAO,SAAS,OAAA,EAAS;AACrD,IAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,EAAA,EAAI,MAAA,EAAQ,SAAS,OAAO,CAAA;AAIhE,EAAA,IAAI,MAAA,CAAO,gBAAgB,CAAA,EAAG;AAC5B,IAAA,IAAI,QAAA,GAA4C,IAAA;AAChD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,QAAA,GAAW;AAAA,QACT,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,QAClC,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,OACnC;AAAA,IACF,CAAA;AACA,IAAA,MAAM,eAAe,MAAM;AAAE,MAAA,QAAA,GAAW,IAAA;AAAA,IAAM,CAAA;AAE9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc;AAC1B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,MAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAA,EAAS,CAAA,GAAI,KAAM,QAAQ,CAAA;AAC5E,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACpC,CAAA;AACA,IAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAElC,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,IACvD,CAAA;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,EAAA,mBAAA,CAAoB,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACxD,EAAA,GAAA,CAAI,OAAA,EAAQ;AACd;AAUA,eAAsB,UAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACrD;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAW,QAAA,GAC7B,MAAM,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,GAC7C,MAAA;AAEJ,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,iBAAA,CAAkB,QAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAC1H,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE1F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;AA4BA,eAAsB,aACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,WAAW,OAAA,GAAU,EAAC,EAAG,KAAA,EAAO,aAAa,KAAA,EAAO,IAAA,EAAM,SAAS,OAAA,EAAQ,GAAyB,EAAC,EACvG;AACrB,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,IAAS,CAAA;AACjC,EAAA,MAAM,UAAY,IAAA,EAAM,GAAA;AACxB,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,iBAAA,CAAkB,QAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAC1H,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAE/E,EAAA,MAAM,SAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GAAW,QAAA,CAAS,cAA2B,KAAK,CAAA,GACrE,KAAA,YAAiB,WAAA,GAAc,KAAA,GAAQ,IAAA;AAGzC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAIC,MAAAA;AACJ,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAAA,MAAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACtC,MAAAA,OAAM,WAAA,GAAc,WAAA;AACpB,MAAAA,OAAM,GAAA,GAAM,MAAA;AACZ,MAAA,IAAIA,MAAAA,CAAM,aAAa,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,UAAAA,MAAAA,CAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AACnC,UAAAA,MAAAA,CAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,QACpF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,MAAAA,GAAQ,MAAA;AAAA,IACV;AAEA,IAAA,IAAI,SAAA,EAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAWA,MAAAA,CAAM,UAAA,GAAaA,MAAAA,CAAM,WAAA,EAAaA,MAAAA,CAAM,UAAA,EAAYA,MAAAA,CAAM,WAAW,CAAA;AAGjI,IAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAS,OAAA,EAAAC,QAAAA,KAAY,iBAAA,CAAkBF,MAAAA,CAAM,UAAA,EAAYA,MAAAA,CAAM,WAAW,CAAA;AAGlF,IAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,SAAA,GAAaC,QAAAA,GAAU,GAAA,GAAMC,QAAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAUD,QAAAA,GAAUC,QAAAA,CAAQ,CAAA,GACtC,GAAA;AAGJ,IAAA,IAAI,OAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAMD,QAAAA,GAAU,SAAS,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAMA,QAAAA,GAAU,SAAS,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAMC,QAAAA,GAAU,SAAS,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,KAAY,MAAA,GAAY,OAAA,GAAU,SAAA,GAAY,EAAA;AAC7D,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,kBAAA,CAAmBF,MAAAA,EAAO,MAAA,EAAQC,QAAAA,EAASC,QAAAA,EAAS,MAAA,EAAW,MAAA,EAAQ,QAAW,SAAS,CAAA;AACzH,IAAA,IAAIC,aAAY,KAAA,EAAOC,OAAAA,EAAgB,IAAI,CAAA,EAAG,IAAA,GAAO,YAAY,GAAA,EAAI;AACrE,IAAA,IAAIC,WAAAA,GAAa,IAAA;AACjB,IAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AACxB,IAAA,MAAMC,KAAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,MAAA,IAAIH,UAAAA,EAAW;AACf,MAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,QAAA,mBAAA,CAAoB,KAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,EAAQF,UAASC,QAAO,CAAA;AAC5D,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,IAAIG,WAAAA,EAAY;AAAE,UAAAA,WAAAA,GAAa,KAAA;AAAO,UAAA,OAAA,GAAUL,MAAK,CAAA;AAAA,QAAG;AACxD,QAAA,OAAA,IAAU;AAAA,MACZ;AACA,MAAAI,OAAAA,GAAS,sBAAsBE,KAAI,CAAA;AAAA,IACrC,CAAA;AACA,IAAAF,OAAAA,GAAS,sBAAsBE,KAAI,CAAA;AACnC,IAAA,OAAO,MAAM;AAAE,MAAAH,UAAAA,GAAY,IAAA;AAAM,MAAA,oBAAA,CAAqBC,OAAM,CAAA;AAAA,IAAG,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAE9B,IAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AACZ,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,KAAA,CAAM,YAAA,CAAa,eAAe,EAAE,CAAA;AACpC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACzB,QAAA,EAAU,OAAA;AAAA,MAAS,GAAA,EAAK,GAAA;AAAA,MAAK,IAAA,EAAM,GAAA;AAAA,MACnC,KAAA,EAAO,KAAA;AAAA,MAAO,MAAA,EAAQ,KAAA;AAAA,MACtB,OAAA,EAAS,GAAA;AAAA,MAAK,aAAA,EAAe,MAAA;AAAA,MAAQ,MAAA,EAAQ;AAAA,KAC9C,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,OAAA,EAAQ;AACvC,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,8BAAA,EAAiC,MAAM,GAAG,CAAC,CAAA;AAAA,IACpF,CAAC,CAAA;AACD,IAAA,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,IAAI,MAAM,MAAA,EAAQ,MAAM,MAAM,IAAA,EAAK,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AACpB,IAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,MAAA,MAAM,IAAI,MAAM;AAAE,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAA;AACrE,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAIA,EAAA,IAAI,iBAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,SAAA,GAAY,CAAA,IAAK,OAAA,KAAY,MAAA,EAAW;AAC1C,IAAA,iBAAA,GAAoB,MAAM;AACxB,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,WAAA,IAAe,OAAA,EAAS;AAAE,QAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,MAAW,CAAA,MAAA,IACnF,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,cAAc,SAAA,EAAY;AAAE,QAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,MAAW;AAAA,IAC7F,CAAA;AACA,IAAA,KAAA,CAAM,gBAAA,CAAiB,cAAc,iBAAiB,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,EAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,EAAE,SAAS,OAAA,EAAQ,GAAI,kBAAkB,KAAA,CAAM,UAAA,EAAY,MAAM,WAAW,CAAA;AAElF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA;AACxC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,UAAA,EAAY,EAAA,GAAK,KAAA,CAAM,WAAA;AACxC,IAAA,MAAM,SAAS,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAI,EAAE,CAAA;AAEtE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAE9D,IAAA,EAAA,GAAK,IAAI,eAAe,MAAM;AAC5B,MAAA,MAAM,IAAI,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAI,EAAE,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACnC,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,GAAA,EAAK,GAAG,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAAA,IACtD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AAAA,EACtB,CAAA,MAAO;AAEL,IAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AACJ,IAAA,IAAI,OAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAAA,IAChD;AACA,IAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,IAAK,MAAA,CAAO,UAAU,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAEvE,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,WAAA,GAAc,SAAA,EAAW;AACpD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,WAAA,IAAe,OAAA,EAAS;AAE3D,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAO,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,GAAG,IAAI,CAAA;AACjE,MAAA,IAAI,UAAA,EAAY;AAAE,QAAA,UAAA,GAAa,KAAA;AAAO,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA,MAAG;AACxD,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,IAAA,EAAA,EAAI,UAAA,EAAW;AACf,IAAA,IAAI,iBAAA,EAAmB,KAAA,CAAM,mBAAA,CAAoB,YAAA,EAAc,iBAAiB,CAAA;AAChF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,KAAA,EAAM;AACZ,MAAA,KAAA,CAAM,GAAA,GAAM,EAAA;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA;AACF;AAMO,SAAS,gBAAA,CACd,MAAA,EACA,MAAA,EACA,IAAA,EACqB;AACrB,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAC1C;;;ACxfO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,4BAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,OAAA,GAAc,IAAA;AAAA,IACd,UAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EACzC;AAEA,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,SAAS,IAAA,GAAO,UAAA;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,IAAI,OAAA,EAAS;AAEhC,IAAA,MAAM,YAAY,GAAA,GAAM,KAAA,CAAM,IAAI,EAAA,EAAI,CAAC,IAAI,GAAA,IAAO,KAAA;AAClD,IAAA,MAAM,KAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACrC,IAAA,MAAM,UAAW,IAAA,CAAK,KAAA,CAAA,CAAO,OAAO,QAAA,GAAW,CAAA,GAAI,SAAS,MAAM,CAAA;AAClE,IAAA,MAAM,IAAW,CAAA,GAAI,KAAA;AAErB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,WAAW,UAAA,GAAa,CAAA,CAAA;AACpC,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,EAAM;AAE5B,MAAA,MAAM,IAAI,GAAA,GAAM,KAAA;AAChB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACjE,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AACpD,MAAA,MAAM,SAAS,CAAA,GAAI,UAAA;AAEnB,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,GAAA,GAAO,IAAI,CAAA,CAAA,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AACnD,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACjD;AACA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACF;;;ACrEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,yBAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,KAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,KAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,MAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,IAAA;AAE1D,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,QAAU,KAAA,CAAM,CAAA,GAAI,IAAK,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC9C,IAAA,MAAM,UAAU,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAM,KAAA,GAAU,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA;AAEhC,IAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,OAAA,GAAU,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAErD,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AACrC,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AAErC,IAAA,IAAI,CAAA,GAAI,OAAO,CAAA,GAAI,KAAA,GAAQ,MAAM,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,MAAA,GAAS,EAAA,EAAI;AAE7D,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,IAAY,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA;AACjD,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,EAAE,CAAA,YAAA,CAAA;AAEhB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,EAAA,GAAK,QAAQ,OAAO,CAAA;AAC1B,IAAA,MAAM,WAAW,CAAA,GAAI,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,GAAA;AAEzC,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,IAAA,EAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAC7E,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;AChEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,6BAAA;AAAA,IACb,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAa,CAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,QAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,SAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAM,KAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,GAAA;AAElG,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,QAAQ,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,QAAQ,CAAA;AAExC,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,OAAO,IAAA,GAAO,OAAA;AAEpB,MAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAM,QAAQ,CAAA,GAAI,KAAA;AAClB,QAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,IAAA,GAAO,KAAA,IAAS,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,QAAA,GAAW,OAAA,IAAW,QAAA,IAAY,EAAA,GAAK,SAAA,CAAA,CAAW,CAAA;AACnF,QAAA,cAAA,IAAkB,KAAK,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,GAAI,QAAA;AAAA,MACzD;AACA,MAAA,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAA;AAE3C,MAAA,IAAI,iBAAiB,IAAA,EAAM;AAE3B,MAAA,MAAM,WAAW,cAAA,GAAiB,GAAA;AAClC,MAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,MAAM,EAAA,GAAK,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,cAAA,GAAiB,IAAA,GAAO,cAAA,GAAiB,IAAA;AAEnE,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,EAAK,cAAA,GAAiB,IAAI,CAAC,CAAA,CAAA,CAAA,GACpF,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;ACxEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,KAAA,GAAkB,kCAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB,GAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,aAAa,KAAA,GAAQ,KAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAG5C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,CAAA,KAAsB;AAC7C,IAAA,IAAI,IAAI,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,CAAA,IAAQ,MAAA,CAAO,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AACrC,MAAA,IAAA,IAAQ,GAAA;AACR,MAAA,GAAA,IAAQ,GAAA;AACR,MAAA,IAAA,IAAQ,GAAA;AAAA,IACV;AACA,IAAA,OAAO,CAAA,GAAI,IAAA;AAAA,EACb,CAAA;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,CAAA,GAAI,IAAA;AAClC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,CAAA,GAAI,IAAA;AAGxC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,GAAO,SAAS,CAAA,GAAI,IAAA,GAAO,CAAA;AACxE,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAChD,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAEhD,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,GAAM,GAAA;AAE1B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAElB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACrD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAEhB,MAAA,MAAM,WAAW,KAAA,GAAQ,eAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,KAAA,GAAQ,IAAA,GAAO,KAAA,GAAQ,IAAA;AAEjD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,WAAA;AAAA,IACZ,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,MAAA,GAAY,IAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,cAAc,EAAA,GAAK,KAAA,GAAQ,CAAA,GAAI,GAAA,IAAO,IAAM,CAAA,IAAO,CAAA;AAEzD,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,YAAY,SAAS,CAAA;AAG3D,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACvC,MAAA,MAAM,QAAA,GAAA,CAAY,QAAA,GAAW,GAAA,GAAM,GAAA,IAAO,IAAA;AAG1C,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,QAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,CAAA;AACzB,QAAA,MAAM,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtC,QAAA,IAAI,IAAI,IAAA,EAAM;AACZ,UAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACtD,UAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA;AAAA,QAChE;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,aAAA,GAAgB,GAAA,GAAM,aAAa,GAAG,CAAA;AAC/E,MAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACzD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,aAAA,GAAgB,IAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAEzD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AC9EO,SAAS,sBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAmC,EAAC,EAC9B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,qCAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,CAAA;AAAA,IACd,QAAA,GAAc,GAAA;AAAA,IACd,WAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,cAAyF,EAAC;AAChG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,OAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACtC,IAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAE,CAAA;AACtC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,EAAA,EAAO,MAAM,IAAA,GAAQ,GAAA;AAAA,MACrB,EAAA,EAAO,MAAM,KAAA,GAAQ,GAAA;AAAA,MACrB,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA;AAAA,MACxB,EAAA,EAAA,CAAQ,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,IAAI,CAAA,GAAI,EAAA,CAAA;AAAA,MACnE,KAAO,IAAA,GAAO,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA,KACtC,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,KAAM,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,GAAc,IAAA,CAAK,IAAI,CAAC,EAAA,GAAK,KAAK,IAAI,CAAA;AACnD,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AACxB,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AAGxB,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,EAAE,IAAI,EAAA,EAAI,KAAA,EAAO,IAAI,GAAA,EAAI,GAAI,YAAY,CAAC,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,KAAK,IAC/C,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,KAAA,GAAQ,GAAG,CAAA;AACxE,QAAA,GAAA,IAAY,IAAA,GAAO,GAAA;AACnB,QAAA,QAAA,IAAY,GAAA;AAAA,MACd;AAGA,MAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AACrB,MAAA,MAAM,SAAS,GAAA,GAAM,GAAA,GAAM,KAAK,IAAA,CAAK,MAAA,GAAS,WAAW,GAAG,CAAA;AAE5D,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,MAAM,UAAA,GAAA,CAAc,SAAS,IAAA,IAAQ,IAAA;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAChF,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,MAAA,GAAS,IAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AAEnD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACrGO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,MAAA,GAAa,CAAA;AAAA,IACb,UAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,MAAG,CAAA;AAE7D,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,KAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AACnC,QAAA,MAAM,MAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACpC,QAAA,MAAM,EAAA,GAAM,MAAM,EAAA,GAAM,GAAA;AACxB,QAAA,MAAM,EAAA,GAAM,MAAM,GAAA,GAAM,CAAA;AACxB,QAAA,MAAM,EAAA,GAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAA,CAAO,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAA;AAErE,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAG,CAAA;AAElE,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,CAAA,GAAI,KAAK,GAAG,CAAA;AAErG,QAAA,QAAA,IAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAC,CAAA;AAC7C,QAAA,YAAA,IAAA,CAAiB,CAAA,GAAI,IAAI,CAAA,IAAK,GAAA;AAAA,MAChC;AAEA,MAAA,MAAM,QAAY,QAAA,GAAW,MAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,MAAM,CAAA;AAEnD,MAAA,IAAI,YAAY,GAAA,EAAK;AAErB,MAAA,MAAM,SAAA,GAAA,CAAa,KAAA,GAAQ,IAAA,CAAK,EAAA,KAAO,KAAK,EAAA,GAAK,CAAA,CAAA;AACjD,MAAA,MAAM,UAAY,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,MAAA;AACrE,MAAA,MAAM,EAAA,GAAY,SAAS,OAAO,CAAA;AAElC,MAAA,MAAM,WAAW,SAAA,GAAY,GAAA;AAC7B,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,GAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,MAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACjFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,eAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,SAAS,KAAA,GAAQ,MAAA;AAEvB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAA,CAAQ,EAAA,GAAK,QAAA,CAAS,CAAA,IAAK,MAAA;AACjC,MAAA,MAAM,EAAA,GAAO,KAAK,QAAA,CAAS,CAAA;AAC3B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAO,IAAA,GAAO,MAAA;AAGpB,MAAA,IAAI,IAAI,CAAA,EAAG;AACT,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAC,CAAA;AACxE,QAAA,IAAI,aAAa,IAAA,EAAM;AACvB,QAAA,MAAMG,MAAAA,GAAQ,UAAA,IAAc,SAAA,GAAY,IAAA,GAAO,IAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAIA,MAAK,CAAA,CAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAS,KAAA,CAAM,CAAC,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAC/C,QAAA;AAAA,MACF;AAQA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA;AACxF,MAAA,MAAM,OAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,GAAG,CAAA;AACrC,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,YAAY,GAAG,CAAA;AAEvD,MAAA,IAAI,YAAY,IAAA,EAAM;AAGtB,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,UAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,GAAG,QAAQ,CAAA;AACpD,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,IAAA,IAAQ,CAAA,GAAI,IAAA;AACzC,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,sBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,yBAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA,CAAE,EAAE,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAE/F,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AAEnC,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,KAAA,GAAS,MAAM,GAAA,IAAO,CAAA,GAAI,KAAK,CAAA,EAAG,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,EAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAC9B,QAAA,MAAM,KAAA,GAAS,KAAA,CAAM,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,EAAI,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,CAAC,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AACnE,QAAA,MAAM,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA,CAAA;AACxB,QAAA,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,MACrC;AAEA,MAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,GAAA;AAE9B,MAAA,IAAI,OAAO,IAAA,EAAM;AAEjB,MAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,IAAA;AACjC,MAAA,MAAM,OAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAC/E,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,WAAW,IAAA,GAAO,IAAA;AACxB,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,QAAA,GAAW,IAAA,GAAO,QAAA,GAAW,IAAA;AAE1D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AClEO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,cAAA;AAAA,IACZ,KAAA,GAAY,SAAA;AAAA,IACZ,QAAA,GAAY,SAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,IAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,MAAS,IAAA,GAAO,IAAA;AAGtB,EAAA,MAAM,GAAA,GAAM,eAAA;AACZ,EAAA,MAAM,YAAY,GAAA,CAAI,MAAA;AACtB,EAAA,IAAI,IAAA,GAAqB,UAAU,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AAChC,IAAA,IAAA,GAAO,IAAI,aAAa,GAAG,CAAA;AAC3B,IAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAK,KAAA,GAAQ,KAAA;AACnB,EAAA,MAAM,cAAc,IAAA,GAAO,EAAA;AAC3B,EAAA,MAAM,SAAA,GAAc,OAAO,KAAA,GAAQ,GAAA;AAGnC,EAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACrD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACtD,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,GAAU,GAAA,GAAM,QAAA,GAAW,GAAA,IAAO,SAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,GAAO,SAAS,CAAA;AAC9E,IAAA,IAAI,UAAU,CAAA,EAAG,IAAA,CAAA,CAAM,OAAA,GAAU,CAAA,IAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,GAAO,IAAA,GAAO,KAAK,MAAA,EAAO,GAAI,MAAM,SAAS,CAAA;AAAA,EAC7G;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,GAAG,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,OAAO,CAAC,CAAA;AACxC,MAAA,MAAM,SAAW,IAAA,CAAA,CAAM,CAAA,GAAI,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AACjG,MAAA,MAAM,IAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAChE,MAAA,MAAM,MAAY,KAAA,GAAQ,GAAA,GAAM,SAAS,IAAA,GAAO,IAAA,GAAO,QAAQ,KAAA,GAAQ,KAAA;AACvE,MAAA,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,WAAA,GAAc,IAAA,CAAK,MAAA,EAAO,GAAI,OAAO,KAAK,CAAA;AAAA,IACtF;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,OAAA,CAAA,CAAS,IAAA,GAAO,KAAK,IAAA,GAAO,CAAC,IAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAA,CAAA,CAAS,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,SAAA,CAAU,GAAG,CAAA,GAAI,OAAA;AAGjB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAQ,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAC1D,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAE7D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA;AAC9B,MAAA,IAAI,IAAI,IAAA,EAAM;AAEd,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAGhB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AACjC,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAE5C,MAAA,MAAM,KAAA,GAAQ,YAAa,CAAA,GAAI,CAAA,GAAI,MAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA;AAC9D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC/FO,SAAS,oBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAgC,EAAC,EAC3B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc,MAAA;AAAA,IACd,WAAA,GAAc,UAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,MAAA,GAAc,SAAA;AAAA,IACd,WAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,UAAA;AAAA,IACA,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,WAAW,IAAA,GAAO,QAAA;AAExB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAW,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAM,CAAA,IAAU,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,WAAW,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAKhE,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,YAAa,QAAA,GAAW,IAAA;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,SAAA,GAAY,YAAY,CAAA,GAAI,GAAA,CAAA;AAElC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,QAAS,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAiB,SAAA;AAC/D,MAAA,MAAM,cAAc,SAAA,GAAY,IAAA,CAAK,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAA,GAAO,SAAA;AAC/D,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC1C,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAE1C,MAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,IAAc,IAAA,EAAM;AAC1C,MAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AACzC,MAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAG9D,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,IAAK,GAAA;AACvC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAE,IAAI,CAAA,IAAK,GAAA;AAEjD,MAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,MAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAE/C,MAAA,IAAI,UAAA,IAAc,CAAA,IAAK,UAAA,GAAa,IAAA,EAAM;AACxC,QAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC1C,QAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAC9D,QAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAC9C,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,cAAA,GAAiB,CAAA;AACvB,MAAA,IAAI,CAAA,GAAI,mBAAmB,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AACtC,UAAA,MAAM,MAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AAChE,UAAA,MAAM,cAAA,GAAA,CAAkB,MAAA,GAAS,MAAA,IAAU,IAAA,GAAO,GAAA;AAClD,UAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,UAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,UAAA,KAAA,IAAS,EAAA,GAAK,IAAA,GAAO,CAAA,EAAG,EAAA,GAAK,MAAM,EAAA,EAAA,EAAM;AACvC,YAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,EAAA,GAAK,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC1FO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,WAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,QAAA,GAAc,SAAA;AAAA,IACd,SAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc,IAAA;AAAA,IACd,WAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,IAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAO,UAAA,CAAW,KAAK,CAAA,IAAS,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI;AAC/D,EAAA,MAAM,GAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,IAAM,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC/D,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,SAAS,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAG/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAG9B,EAAA,MAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,IAAA,GAAO,MAAA,IAAU,SAAA,GAAY,CAAA;AAC7C,IAAA,MAAM,KAAK,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA,GAAI,MAAM,GAAA,IAAO,WAAA;AACvC,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,YAAA,GAAe,IAAA,GAAO,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,WAAW,CAAA,IAAK,YAAA;AACtB,MAAA,MAAM,aAAa,CAAA,KAAM,YAAA;AAEzB,MAAA,IAAI,CAAC,QAAA,EAAU;AAEb,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,MAAM,MAAA,GAAS,GAAG,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AAC/D,UAAA,IAAI,WAAW,IAAA,EAAM;AACnB,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,QAAA,GAAW,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5D,YAAA,GAAA,CAAI,cAAc,OAAA,GAAU,GAAA;AAC5B,YAAA,GAAA,CAAI,SAAA,GAAY,CAAA,IAAA,EAAO,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,CAAA;AAC7D,YAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAK,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACxC;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAA,CAAS,IAAI,YAAA,IAAgB,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA;AAC5D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,UAAA,EAAY;AAE/B,MAAA,MAAM,SAAA,GAAY,aAAa,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC5D,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AAEnD,MAAA,GAAA,CAAI,WAAA,GAAc,MAAM,KAAA,GAAQ,GAAA;AAChC,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,KAAK,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACvFA,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AAEd,IAAM,SAAA,GAAoC;AAAA,EACxC,CAAC,IAAA,GAAO,IAAI,GAAgB,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAK,GAAc,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAA,GAAQ,KAAK,GAAG,QAAA;AAAA,EAC/B,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,KAAK,GAAG,QAAA;AAAA,EACT,CAAC,KAAK,GAAG;AACX,CAAA;AAEO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,UAAA,GAAa,SAAA;AAAA,IACb,KAAA,GAAa,SAAA;AAAA,IACb,OAAA,GAAa,IAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,KAAK,CAAA,IAAU,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC9D,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,UAAU,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAK9D,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,CAAA,KAAsB;AACvD,IAAA,IAAI,KAAA,CAAM,IAAI,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,EAAS,OAAO,CAAA;AACnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,EAAM,IAAA,IAAQ,IAAA;AACjE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAA,CAAO,CAAA,GAAE,CAAA,IAAG,EAAA,GAAG,CAAA,EAAG,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,MAAW,IAAA,IAAQ,IAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,CAAI,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAO,IAAA,IAAQ,KAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAM,CAAA,GAAE,EAAA,GAAG,CAAA,EAAA,CAAG,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAY,IAAA,IAAQ,KAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAChC,MAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAI,CAAA,IAAK,MAAA;AAG9B,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA,GAAI,EAAE,IAAI,EAAA,IAAM,IAAA;AACrD,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA,IAAM,IAAA;AAC1D,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,IAAA,IAAQ,IAAA,GAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AACxE,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,KAAA,IAAS,IAAA,GAAO,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AAC1E,MAAA,MAAM,UAAU,KAAA,IAAS,KAAA;AAEzB,MAAA,MAAM,YAAY,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAE/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C;AAEA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACpCA,SAAS,YAAY,CAAA,EAAuD;AAC1E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAiEO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAC3C,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAC1B,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW;AAC5B;AAoBO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACV;AACzB,EAAA,MAAM;AAAA,IACJ,IAAA,GAAc,MAAA;AAAA,IACd,OAAA,GAAc,GAAA;AAAA,IACd,SAAA;AAAA,IACA,MAAA,GAAc,CAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,YAAY,OAAO,MAAA,KAAW,WAC/B,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAC9B,MAAA;AAEJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,MAAM,CAAA;AAClE,IAAA,OAAO,EAAE,SAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,MAAM,YAAA,GAAe,UAAU,KAAA,CAAM,QAAA;AACrC,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AACrD,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,UAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,IACrB,mBAAA;AAAA,IAAqB,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,aAAA;AAAA,IAC9C,WAAW,OAAO,CAAA,CAAA;AAAA,IAAI,qBAAA;AAAA,IAAuB,WAAW,MAAM,CAAA;AAAA,GAChE,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,IAAI,SAAA,SAAkB,SAAA,GAAY,SAAA;AAClC,EAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAExB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,MAAM,KAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACrC,EAAA,MAAM,WAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAGrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,+BAA+B,CAAA;AAC5D,EAAA,MAAM,UAAU,MAAe;AAC7B,IAAA,IAAI,WAAA,KAAgB,SAAS,OAAO,IAAA;AACpC,IAAA,IAAI,WAAA,KAAgB,QAAS,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,OAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AASjD,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,SAAA,EAAW,WAAA,GACP,CAAA,KAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,KAAA,CAAA,GACtD,UAAA,CAAqC;AAAA,GAC5C,CAAA;AACA,EAAA,MAAM,gBAAiB,OAA8B;AAAA,IACnD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,kBAAkB,OAAgC;AAAA,IACtD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAuC;AAAA,GAC1D,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,eAAe,OAA6B;AAAA,IAChD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAoC;AAAA,GACvD,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,aAAA,EAAc,EAAmB;AAC5D,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAS,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,QAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,eAAA,EAAgB;AAAA,SAAA,IACtD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,KAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,YAAA,EAAa;AAAA,SAAA,IACnD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SAAA,IACvD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SACnC,OAAA,CAAQ,UAAU,aAAA,EAAc;AAAA,EAC/D,CAAA;AACA,EAAA,WAAA,EAAY;AAEZ,EAAA,MAAM,iBAAiB,MAAM;AAAE,IAAA,WAAA,EAAY;AAAA,EAAG,CAAA;AAC9C,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAExE,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,MAAA,CAAO,KAAA,GAAS,EAAE,KAAA,GAAS,GAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,GAAS,GAAA;AAC3B,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,MAAA,EAAO;AAEP,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AACnC,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAQ,CAAA,CAAE,MAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAEhD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAO,CAAA;AACX,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAE1C,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,sBAAA,CAAuB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAkC,CAAA;AAAA,IAC9G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAiC,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAA+B,CAAA;AAAA,IAC3F,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AACb,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAC3E,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,SAAA,CAAU,MAAM,QAAA,GAAW,YAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAGO,IAAM,mBAAA,GAAsB;;;AC1X5B,SAAS,UACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWO,SAAS,cACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAI,EAAA,EAAI;AACpC,QAAA,IAAA,IAAQ,GAAA;AAAA,MACV,CAAA,MAAO;AAEL,QAAA,IAAA,IAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,GAAG,KAAK,CAAA,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACgCO,SAAS,eACd,IAAA,EACA,IAAA,EACA,MACA,KAAA,GAAgB,SAAA,EAChB,UAAkB,GAAA,EACN;AACZ,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,IAAQ,KAAK,IAAA,IAAQ,CAAA,SAAU,EAAC;AAC7C,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,IAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAC1D,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,MAAM,OAAA,CAAQ,MAAA;AAEpB,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,IAAA,EAAK;AAAA,IAAG,CAAC,CAAA,EAAG,GAAA,KACtC,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,CAACC,EAAAA,EAAG,GAAA,MAAS;AAAA,MACxC,IAAA,EAAM,OAAA,CAAA,CAAS,GAAA,GAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AAAA,MACtC,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,CAAA,EAAG;AAAA,KACL,CAAE;AAAA,GACJ;AACF;AAoBO,SAAS,oBAAA,CACd,KACA,KAAA,EACA,MAAA,EACA,MACA,OAAA,GAAiC,IACjC,QAAA,EACM;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,UAAA,GAAc,GAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,OAAA,GAAc,GAAA;AAAA,IACd,WAAA,GAAe,WAAA;AAAA,IACf,aAAA,GAAgB,IAAA;AAAA,IAChB,WAAA,GAAe,IAAA;AAAA,IACf,UAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAS,QAAQ,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,IAAU,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA;AAErE,EAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,OAAO,CAAA;AAE7D,EAAA,MAAM,UAAA,GAA2B;AAAA,IAC/B,GAAG,eAAA;AAAA,IAEH,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,UAAA,EAAY,OAAO,MAAA,EAAQ,CAAA,EAAG,YAAY,IAAI,CAAA;AAChF;;;AC/JO,SAAS,eAAA,CACd,MAAA,EACA,EAAE,MAAA,GAAS,KAAA,EAAO,OAAA,GAAU,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAE,GAAqB,EAAC,EACnD;AACf,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,GAAA,GAAyB,MAAA;AAC7B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAS,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,KAAK,CAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2CAA2C,CAAC,CAAA;AAAG,QAAA;AAAA,MAAQ;AACvF,MAAA,MAAA,CAAO,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA,EAAO,IAAI,MAAM,CAAA;AACpD,MAAA,GAAA,GAAM,GAAA;AAAA,IACR;AACA,IAAA,GAAA,CAAI,MAAA;AAAA,MACF,CAAC,IAAA,KAAS,IAAA,GAAO,OAAA,CAAQ,IAAI,IAAI,MAAA,CAAO,IAAI,KAAA,CAAM,uCAAuC,CAAC,CAAA;AAAA,MAC1F,SAAS,MAAM,CAAA,CAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAWA,eAAsB,mBAAA,CACpB,MAAA,EACA,OAAA,GAAmD,EAAC,EACrC;AACf,EAAA,MAAM,EAAE,QAAA,GAAW,kBAAA,EAAoB,SAAS,KAAA,EAAO,GAAG,UAAS,GAAI,OAAA;AACvE,EAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAG,UAAU,CAAA;AAClE,EAAA,MAAM,GAAA,GAAM,MAAA,KAAW,MAAA,GAAS,KAAA,GAAQ,MAAA;AACxC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAW,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC/B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,CAAA,CAAE,IAAI,GAAG,GAAM,CAAA;AACtD;;;ACJA,eAAsB,cACpB,MAAA,EACA;AAAA,EACE,QAAA,GAAW,EAAA;AAAA,EACX,KAAA,GAAQ,SAAA;AAAA,EACR,UAAU,EAAC;AAAA,EACX,WAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,WAAA,GAAc,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,EACnC,GAAA,EAAK;AACP,CAAA,GAAmB,EAAC,EACC;AACrB,EAAA,IAAI,CAAC,SAAA,CAAU,YAAA,EAAc,YAAA,EAAc;AACzC,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,aAAa,CAAA;AAE/E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AAEpB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,OAAA,EAAQ;AACvC,IAAA,KAAA,CAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,6CAA6C,CAAC,CAAA;AACrF,IAAA,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,GAAG,eAAA;AAAA,IACH,GAAG,kBAAkB,KAAK,CAAA;AAAA,IAC1B,GAAG,OAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAGhF,EAAA,MAAM,cAAc,WAAA,KAAgB,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,mBAAmB,CAAA,CAAA,IAAM,CAAA;AACpG,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,KAAA,CAAM,aAAa,WAAW,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAA,GAA4C,IAAA;AAChD,EAAA,MAAM,cAAc,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,WAAW,CAAA,EAAE;AAEnD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,IAAA,QAAA,GAAW;AAAA,MACT,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,MAClC,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,KACnC;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AAAE,IAAA,QAAA,GAAW,IAAA;AAAA,EAAM,CAAA;AAE9C,EAAA,IAAI,MAAA,CAAO,gBAAgB,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,EAAA,MAAM,IAAA,GAAO,CAAC,SAAA,KAAsB;AAClC,IAAA,IAAI,SAAA,EAAW;AAEf,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,iBAAA,EAAmB;AAE/C,MAAA,MAAM,QAAA,GAAW,OAAO,KAAA,GAAQ,WAAA;AAChC,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,GAAS,WAAA;AACjC,MAAA,MAAM,OAAA,GAAA,CAAW,YAAY,SAAA,IAAa,GAAA;AAG1C,MAAA,MAAM,YAAA,GAA6B,cAC/B,EAAE,GAAG,QAAQ,GAAG,WAAA,IAAc,GAC9B,MAAA;AAGJ,MAAA,MAAM,UAAA,GAAa,aAAa,aAAA,GAAgB,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,QAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,QAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,MACvD;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,KAAA,EAAO,YAAA,EAAc,UAAU,QAAQ,CAAA;AAG3E,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,CAAA;AACpC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,CAAA;AACpC,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AAC9C,QAAA,WAAA,CAAY,KAAK,EAAA,GAAK,KAAA;AACtB,QAAA,WAAA,CAAY,KAAK,EAAA,GAAK,KAAA;AACtB,QAAA,WAAA,CAAY,SAAA,IAAA,CAAc,CAAA,GAAI,WAAA,CAAY,SAAA,IAAa,IAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,SAAA,IAAa,KAAA;AACzB,QAAA,IAAI,WAAA,CAAY,SAAA,GAAY,IAAA,EAAO,WAAA,CAAY,SAAA,GAAY,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,GAAY,IAAA,GACrC,EAAE,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,SAAA,EAAW,WAAA,CAAY,WAAU,GACvE,IAAA;AAEJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AACf,QAAA,GAAA,CAAI,SAAA,CAAU,CAAC,QAAA,EAAU,CAAC,CAAA;AAC1B,QAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA;AACnF,QAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,MACd,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,MACrF;AAAA,IACF;AAEA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,IAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AACrD,IAAA,MAAA,CAAO,WAAU,CAAE,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AACxC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAAA,EACpB,CAAA;AACF","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField' | 'ripple' | 'melt' | 'orbit' | 'cellular';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines' | 'braille' | 'katakana' | 'musical' | 'emoji' | 'circles' | 'shadows' | 'starfield' | 'geometric' | 'pipes' | 'waves' | 'shards' | 'smoke';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail' | 'glitchText';\nexport type HoverShape = 'circle' | 'box';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice' | 'gravity' | 'shatter' | 'ghost' | 'glitchReveal';\n\n/**\n * Named colour palette presets — pass as `colorMode` for themed rendering.\n * Applied as a post-process colour remap over the standard grayscale output.\n */\nexport type PaletteTheme = 'dracula' | 'monokai' | 'nord' | 'catppuccin' | 'solarized' | 'gruvbox';\n\nexport const PALETTE_THEMES: Record<PaletteTheme, { name: string; accent: string; bg: string; fg: string }> = {\n dracula: { name: 'Dracula', accent: '#bd93f9', bg: '#282a36', fg: '#f8f8f2' },\n monokai: { name: 'Monokai', accent: '#a6e22e', bg: '#272822', fg: '#f8f8f2' },\n nord: { name: 'Nord', accent: '#88c0d0', bg: '#2e3440', fg: '#eceff4' },\n catppuccin: { name: 'Catppuccin',accent: '#cba6f7', bg: '#1e1e2e', fg: '#cdd6f4' },\n solarized: { name: 'Solarized', accent: '#268bd2', bg: '#002b36', fg: '#839496' },\n gruvbox: { name: 'Gruvbox', accent: '#b8bb26', bg: '#282828', fg: '#ebdbb2' },\n};\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n /** Character cell size in pixels. Smaller = more detail, more cells. Default: `10` */\n fontSize: number;\n /** Extra horizontal spacing between characters (pixels). Default: `1` */\n charSpacing: number;\n /**\n * Brightness adjustment applied before luminance mapping.\n * Range −1 (black) → 0 (unchanged) → 1 (white). Default: `0`\n */\n brightness: number;\n /**\n * Contrast boost applied before luminance mapping.\n * `0` = unchanged, positive values increase contrast, negative decrease it.\n * Default: `0`\n */\n contrast: number;\n /**\n * Character density ramp — ordered from lightest to darkest.\n * Use `CHARSETS` for pre-built ramps or supply your own string.\n * Default: `' .:-=+*#%@'`\n */\n charset: string;\n /**\n * Colour output mode.\n * - `'grayscale'` — white-on-black monochrome\n * - `'fullcolor'` — samples pixel colours from the source\n * - `'matrix'` — green phosphor terminal look\n * - `'accent'` — single accent colour with intensity-driven brightness\n * Default: `'grayscale'`\n */\n colorMode: ColorMode;\n /**\n * The accent colour used when `colorMode` is `'accent'` or `'matrix'`.\n * Any CSS colour string. Default: `'#d4ff00'`\n */\n /**\n * Hex color string used when `colorMode` is `'accent'`.\n * Set to `'auto'` to let the engine pick contrasting ink automatically:\n * dark ink (`#0d0d0d`) in light mode, light ink (`#faf9f7`) in dark mode.\n */\n accentColor: string;\n /**\n * Invert luminance mapping (light pixels → dense chars). Default: `false`\n *\n * Set to `'auto'` to let the engine detect the OS color scheme:\n * - Light mode → inverts (bright pixel = dark char = visible on white background)\n * - Dark mode → normal (bright pixel = bright char = visible on dark background)\n */\n invert: boolean | 'auto';\n /**\n * Render mode.\n * - `'ascii'` — characters drawn as text\n * - `'dots'` — each cell rendered as a filled circle (particle look)\n * Default: `'ascii'`\n */\n renderMode: RenderMode;\n /**\n * Per-character animation driven over time.\n * Applies wave, glitch, rain-drop, spiral, and other effects to the rendered text.\n * Default: `'none'`\n */\n animationStyle: AnimationStyle;\n /** Speed multiplier for `animationStyle` effects. Default: `1` */\n animationSpeed: number;\n /**\n * Size of each dot relative to the cell when `renderMode === 'dots'`.\n * `1` fills the whole cell, `0.5` draws half-size circles. Default: `0.8`\n */\n dotSizeRatio: number;\n /**\n * Floyd-Steinberg dither strength applied to the luminance map.\n * `0` = no dithering, `1` = full dithering. Default: `0`\n */\n ditherStrength: number;\n /**\n * Assumed aspect ratio (width ÷ height) of a single output character.\n * Controls how many rows vs columns are generated — must match your rendering\n * environment to preserve the source image's proportions.\n * - `0.55` — browser monospace at `line-height: 1.09` (default)\n * - `0.52` — browser monospace at `line-height: 1.15`\n * - `0.5` — most terminal emulators\n * Default: `0.55`\n */\n charAspect: number;\n /**\n * Auto-stretch the luminance range before charset mapping.\n * When `true`, the darkest pixel in the frame maps to the first charset character\n * and the brightest to the last, maximising perceived detail and contrast.\n * Particularly useful for images with low inherent contrast or muted tones.\n * Default: `false`\n */\n normalize: boolean;\n /**\n * Overall intensity of the hover / cursor interaction effect.\n * `0` disables the effect. Default: `0`\n */\n hoverStrength: number;\n /**\n * Radius of the hover interaction zone as a fraction of the canvas size.\n * `0.1` = 10% of canvas width. Default: `0.2`\n */\n hoverRadius: number;\n /**\n * Which cursor interaction style to apply when `hoverStrength > 0`.\n * See `HoverPreset` or `HOVER_PRESETS` for ready-made configurations.\n * Default: `'spotlight'`\n */\n hoverEffect: HoverEffect;\n /**\n * Tint colour used by hover effects such as spotlight, glow, and colorShift.\n * Any CSS colour string. Default: `'#ffffff'`\n */\n hoverColor: string;\n /**\n * Shape of the hover interaction zone.\n * - `'circle'` — radial falloff (default)\n * - `'box'` — rectangular zone, text fills a block around the cursor\n * Default: `'circle'`\n */\n hoverShape: HoverShape;\n /**\n * Text string revealed by the `'glitchText'` hover effect.\n * Characters around the cursor scramble and resolve into this text.\n * Supports `\\n` for multi-line reveals.\n *\n * Pass an **array** of strings to cycle through different words based on\n * the cursor's grid region — the engine picks one via a spatial hash so\n * each area of the canvas shows a different word.\n *\n * Default: `'ASCIIFY'`\n *\n * @example\n * // Single word:\n * options: { hoverEffect: 'glitchText', hoverText: 'HELLO' }\n *\n * // Word pool — different text at different cursor positions:\n * options: { hoverEffect: 'glitchText', hoverText: ['DEPLOY', 'SCALE', 'SHIP', 'BUILD'] }\n */\n hoverText: string | string[];\n /**\n * Art style preset applied at render time.\n * Shorthand for a specific combination of `charset`, `renderMode`, and `colorMode`.\n * See `ART_STYLE_PRESETS` for the full list. Default: `'classic'`\n */\n artStyle: ArtStyle;\n /**\n * Custom repeating text used when `artStyle` is `'letters'` or when you set\n * a custom charset. Leave empty to use the selected `charset`. Default: `''`\n */\n customText: string;\n /**\n * Chroma-key colour to remove from the source (green screen / blue screen).\n * Pixels whose RGB distance from this colour is within `chromaKeyTolerance`\n * are keyed out: their character becomes a space and alpha is set to 0,\n * letting the canvas background show through.\n *\n * - `true` — **smart green screen**: heuristic detection (`g > r*1.4 && g > b*1.4`)\n * catches every shade of green screen (lime, broadcast, chroma green) with no\n * config. Works on virtually all studio/streaming footage.\n * - `'blue-screen'` — **smart blue screen**: same heuristic for blue.\n * - `{ r, g, b }` or CSS colour string — custom key colour + `chromaKeyTolerance`\n * - `null` / `false` — disabled (default)\n *\n * @example\n * // Standard green screen — zero config:\n * options: { chromaKey: true }\n *\n * // Blue screen — zero config:\n * options: { chromaKey: 'blue-screen' }\n *\n * // Custom CSS colour:\n * options: { chromaKey: '#00b140', chromaKeyTolerance: 70 }\n */\n chromaKey: { r: number; g: number; b: number } | string | boolean | null;\n /**\n * Euclidean RGB tolerance radius for chroma-key detection.\n * `0` = exact match only, `441` ≈ key out everything.\n * Higher values remove more pixels. Default: `60`\n */\n chromaKeyTolerance: number;\n /**\n * Array of charset strings to cycle through over time.\n * The engine picks `charsetFrames[Math.floor(time * charsetFps) % length]` on each\n * render tick, re-mapping characters from stored cell luminance.\n * Pairs beautifully with `animationStyle` and `asciiBackground`.\n *\n * Use `CHARSET_SEQUENCES` for curated combinations or build your own:\n * @example\n * options: { charsetFrames: CHARSET_SEQUENCES.cosmic }\n * options: { charsetFrames: [CHARSETS.standard, CHARSETS.blocks, CHARSETS.circles] }\n */\n charsetFrames?: string[];\n /** Cycle rate for `charsetFrames` in frames-per-second. Default: `2` */\n charsetFps?: number;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n /** Stored dithered luminance (0–255). Present when the frame was generated by the engine. Used for dynamic charset re-selection at render time via `charsetFrames`. */\n lum?: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n braille: ' ⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿',\n katakana: ' ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン',\n musical: ' ♩♪♫♬♭♮♯',\n emoji: ' ⬛🟫🟥🟧🟨🟩🟦🟪⬜',\n circles: ' .·:∘○◦°•∙',\n shadows: ' ·∘◦○◎⊙●◉',\n starfield: ' ˙·∘∗✦✧★◆●',\n geometric: ' ·△▷◇◈◆▣■█',\n pipes: ' ╶─┐└├┤┬┴┼╬▒▓█',\n waves: ' ˜∼≈〰≋∿∾∭∫',\n shards: ' ╱╲╳◤◥◣◢△▲◆◼█',\n smoke: ' ·˙⁚⁖∶∷⋮⋰⋱∴∵',\n} as const;\n\n/**\n * Curated charset sequences for use with `charsetFrames`.\n * Each sequence morphs between 2–3 complementary charsets over time,\n * creating a living texture effect.\n *\n * @example\n * asciiBackground('#hero', { charsetFrames: CHARSET_SEQUENCES.cosmic })\n */\nexport const CHARSET_SEQUENCES = {\n /** Stars → softcircles → orbs — dreamy space feel */\n cosmic: [CHARSETS.starfield, CHARSETS.circles, CHARSETS.shadows] as string[],\n /** Katakana → braille dots → binary — hacker rain */\n rain: [CHARSETS.katakana, CHARSETS.braille, CHARSETS.binary] as string[],\n /** Box pipes → Claude glyphs → classic — terminal morph */\n terminal: [CHARSETS.pipes, CHARSETS.claudeCode, CHARSETS.standard] as string[],\n /** Shards → blocks → squares — shattering crystal */\n crystal: [CHARSETS.shards, CHARSETS.geometric, CHARSETS.blocks] as string[],\n /** Wave glyphs → smoke dots → circles — fluid / organic */\n fluid: [CHARSETS.waves, CHARSETS.smoke, CHARSETS.circles] as string[],\n /** Dense classic → art → blocks — maximum detail pulse */\n pulse: [CHARSETS.dense, CHARSETS.standard, CHARSETS.blocks] as string[],\n /** Braille → shadows → smoke — ethereal / dream-like */\n dream: [CHARSETS.braille, CHARSETS.shadows, CHARSETS.smoke] as string[],\n /** Geometric shapes → shards → starfield — sci-fi angular */\n angular: [CHARSETS.geometric, CHARSETS.shards, CHARSETS.starfield] as string[],\n} as const;\n\nexport type CharsetSequenceKey = keyof typeof CHARSET_SEQUENCES;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n braille: {\n renderMode: 'ascii',\n charset: CHARSETS.braille,\n colorMode: 'fullcolor',\n },\n katakana: {\n renderMode: 'ascii',\n charset: CHARSETS.katakana,\n colorMode: 'matrix',\n },\n musical: {\n renderMode: 'ascii',\n charset: CHARSETS.musical,\n colorMode: 'accent',\n accentColor: '#e040fb',\n },\n emoji: {\n renderMode: 'ascii',\n charset: CHARSETS.emoji,\n colorMode: 'fullcolor',\n },\n circles: {\n renderMode: 'ascii',\n charset: CHARSETS.circles,\n colorMode: 'accent',\n accentColor: '#d4ff00',\n },\n shadows: {\n renderMode: 'ascii',\n charset: CHARSETS.shadows,\n colorMode: 'accent',\n accentColor: '#50a0ff',\n },\n starfield: {\n renderMode: 'ascii',\n charset: CHARSETS.starfield,\n colorMode: 'fullcolor',\n },\n geometric: {\n renderMode: 'ascii',\n charset: CHARSETS.geometric,\n colorMode: 'grayscale',\n },\n pipes: {\n renderMode: 'ascii',\n charset: CHARSETS.pipes,\n colorMode: 'accent',\n accentColor: '#00ff88',\n },\n waves: {\n renderMode: 'ascii',\n charset: CHARSETS.waves,\n colorMode: 'fullcolor',\n },\n shards: {\n renderMode: 'ascii',\n charset: CHARSETS.shards,\n colorMode: 'grayscale',\n },\n smoke: {\n renderMode: 'ascii',\n charset: CHARSETS.smoke,\n colorMode: 'accent',\n accentColor: '#c850ff',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n charAspect: 0.55,\n normalize: false,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n hoverShape: 'circle',\n hoverText: 'ASCIIFY',\n artStyle: 'classic',\n customText: '',\n chromaKey: null,\n chromaKeyTolerance: 60,\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n gravity: {\n label: 'Gravity',\n options: { hoverStrength: 0.7, hoverEffect: 'attract', hoverRadius: 0.18, hoverColor: '#a5d6ff' },\n },\n shatter: {\n label: 'Shatter',\n options: { hoverStrength: 0.8, hoverEffect: 'shatter', hoverRadius: 0.14, hoverColor: '#ff6090' },\n },\n ghost: {\n label: 'Ghost',\n options: { hoverStrength: 0.55, hoverEffect: 'trail', hoverRadius: 0.2, hoverColor: '#b39ddb' },\n },\n glitchReveal: {\n label: 'Glitch Reveal',\n options: { hoverStrength: 0.8, hoverEffect: 'glitchText', hoverRadius: 0.18, hoverColor: '#a3e635' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const chars = [...charset]; // Unicode-aware split (handles surrogate pairs / emoji)\n const index = Math.floor(normalized * (chars.length - 1));\n return chars[Math.max(0, Math.min(chars.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const chars = [...text];\n const pos = y * cols + x;\n return chars[pos % chars.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number,\n _isInverted = false\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n // Accent mode: constant colour — the character density (chosen by\n // luminanceToChar) already encodes brightness. Scaling the colour\n // by luminance too creates a double-emphasis that makes dark source\n // areas invisible on dark backgrounds and bright areas invisible on\n // light backgrounds.\n return `rgb(${acR},${acG},${acB})`;\n }\n default: {\n // Grayscale: always use the source luminance as-is.\n // `invert` controls character DENSITY (sparse ↔ dense) but NOT color.\n // Inverting color would cancel out the density swap (dense + bright\n // on white = invisible), defeating the purpose of light-mode invert.\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n return GRAY_LUT[gray];\n }\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number,\n _isInverted = false\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n // Constant accent colour — density encodes brightness (see getCellColorStr).\n _colorRGB[0] = acR; _colorRGB[1] = acG; _colorRGB[2] = acB;\n break;\n }\n default: {\n // Grayscale: no color inversion — see getCellColorStr comment.\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n// ─── Chroma key ───────────────────────────────────────────────────\n\n/**\n * Resolve a chroma-key colour spec to `{ r, g, b }`.\n * Accepts a plain RGB object (returned unchanged) or any CSS colour string\n * — the string is parsed via a temporary 1×1 canvas so it supports hex,\n * `rgb()`, named colours, etc.\n */\nexport function parseChromaKeyColor(\n color: { r: number; g: number; b: number } | string\n): { r: number; g: number; b: number } {\n if (typeof color !== 'string') return color;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const d = ctx.getImageData(0, 0, 1, 1).data;\n return { r: d[0], g: d[1], b: d[2] };\n}","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect, HoverShape } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n case 'ripple': {\n // Ripples emanate from the center outward over time.\n const cx2 = cols / 2;\n const cy2 = rows / 2;\n const dx2 = x - cx2;\n const dy2 = y - cy2;\n const dist2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n const maxDist2 = Math.sqrt(cx2 * cx2 + cy2 * cy2);\n const ripple = Math.sin((dist2 / maxDist2) * Math.PI * 10 - t * 5) * 0.5 + 0.5;\n const fadeEdge = 1 - Math.min(1, dist2 / (maxDist2 * 1.1));\n return 0.1 + 0.9 * ripple * (0.4 + fadeEdge * 0.6);\n }\n case 'melt': {\n // Chars droop downward as if melting — lower rows lag behind.\n const lagPhase = (y / rows) * Math.PI;\n const drip = Math.sin(lagPhase - t * 1.8 + x * 0.15) * 0.5 + 0.5;\n const gravity = Math.max(0, (y / rows - 0.1)) / 0.9;\n return 0.05 + 0.95 * (drip * (1 - gravity * 0.6));\n }\n case 'orbit': {\n // Each cell rotates around the center at a speed proportional to radius.\n const ocx = cols / 2;\n const ocy = rows / 2;\n const odx = x - ocx;\n const ody = y - ocy;\n const oAngle = Math.atan2(ody, odx);\n const oDist = Math.sqrt(odx * odx + ody * ody) / Math.sqrt(ocx * ocx + ocy * ocy);\n const orbit = Math.sin(oAngle * 2 + oDist * 6 - t * 2.5) * 0.5 + 0.5;\n return 0.1 + 0.9 * orbit;\n }\n case 'cellular': {\n // Conway-ish: cell \"lives\" based on a hash of its neighbours at a quantised time.\n const tick = Math.floor(t * 4);\n const alive = (cx: number, cy: number): number => {\n const h = Math.sin(cx * 127.1 + cy * 311.7 + tick * 43758.5453) * 43758.5453;\n return h - Math.floor(h) > 0.38 ? 1 : 0;\n };\n const self = alive(x, y);\n const neighbours =\n alive(x - 1, y) + alive(x + 1, y) +\n alive(x, y - 1) + alive(x, y + 1) +\n alive(x - 1, y - 1) + alive(x + 1, y - 1) +\n alive(x - 1, y + 1) + alive(x + 1, y + 1);\n const nextAlive = self === 1\n ? (neighbours === 2 || neighbours === 3 ? 1 : 0)\n : (neighbours === 3 ? 1 : 0);\n return nextAlive === 1 ? 1 : 0.05;\n }\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5,\n shape: HoverShape = 'circle'\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n // Compute distance based on shape\n let dist: number;\n let maxDist: number;\n if (shape === 'box') {\n // Chebyshev distance — creates a rectangular zone\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n dist = Math.max(absDx, absDy);\n maxDist = radius;\n } else {\n // Euclidean distance — circular zone (default)\n dist = Math.sqrt(dx * dx + dy * dy);\n maxDist = radius;\n }\n\n if (dist >= maxDist) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const t = 1 - dist / maxDist;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n case 'attract': {\n // Inverse of repel — chars drift toward the cursor.\n const angle3 = Math.atan2(dy, dx);\n const pull = eased * eased * strength * 1.0;\n // Offset toward cursor (negative direction = toward)\n offsetX = -Math.cos(angle3) * pull * cellW;\n offsetY = -Math.sin(angle3) * pull * cellH;\n glow = eased * strength * 0.3;\n break;\n }\n case 'shatter': {\n // Chars scatter radially outward with jitter, then reform.\n const angle4 = Math.atan2(dy, dx);\n const jitter = Math.sin(dx * 43.7 + dy * 29.3) * 0.5;\n const scatter = eased * strength * 1.4 * (0.7 + jitter * 0.3);\n offsetX = Math.cos(angle4 + jitter) * scatter * cellW;\n offsetY = Math.sin(angle4 + jitter) * scatter * cellH;\n scale = Math.max(0.1, 1 - eased * strength * 0.6);\n glow = eased * strength * 0.25;\n break;\n }\n case 'trail': {\n // Leaves a fading colour ghost: increase colorBlend and glow strongly within radius.\n colorBlend = eased * strength * 0.9;\n glow = eased * strength * 0.6;\n scale = 1 + eased * strength * 0.15;\n break;\n }\n case 'glitchText': {\n // Clean text reveal — minimal displacement, just glow + color tint.\n // The heavy lifting (char replacement) is in renderer.ts.\n scale = 1;\n glow = eased * strength * 0.5;\n colorBlend = eased * strength * 0.6;\n break;\n }\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x7fffffff;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = undefined as string | undefined,\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n {\n const hex = resolvedAccent.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(55,55,55,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n parseChromaKeyColor,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/** Resolve `invert: 'auto'` to a concrete boolean using the OS color scheme. */\nfunction resolveInvert(invert: boolean | 'auto'): boolean {\n if (invert !== 'auto') return invert;\n return typeof window !== 'undefined' && !window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/**\n * Parse a CSS color value (hex or rgb()) to a 6-char hex string (no `#`).\n * Returns null if the value isn't a recognized color format.\n */\nfunction cssValueToHex(val: string): string | null {\n const hexMatch = val.match(/^#([0-9a-fA-F]{3,6})$/);\n if (hexMatch) {\n let h = hexMatch[1];\n if (h.length === 3) h = h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n if (h.length === 6) return h;\n }\n const rgbMatch = val.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (rgbMatch) {\n return [rgbMatch[1], rgbMatch[2], rgbMatch[3]]\n .map(n => parseInt(n).toString(16).padStart(2, '0'))\n .join('');\n }\n return null;\n}\n\n/**\n * Resolve `accentColor: 'auto'` to a concrete hex string (no `#`).\n * Detection order:\n * 1. Probe common CSS custom properties on `:root` set by the user's project\n * (`--accent-color`, `--color-accent`, `--accent`, `--color-primary`, `--primary`, `--brand-color`)\n * 2. Native CSS `accent-color` computed value\n * 3. OS color-scheme fallback: `#0d0d0d` in light mode, `#faf9f7` in dark mode\n */\nfunction resolveAccentHex(accentColor: string | undefined): string {\n const v = accentColor || 'auto';\n if (v !== 'auto') return v.replace('#', '');\n\n if (typeof document !== 'undefined') {\n const rootStyle = getComputedStyle(document.documentElement);\n for (const prop of ['--accent-color', '--color-accent', '--accent', '--color-primary', '--primary', '--brand-color']) {\n const hex = cssValueToHex(rootStyle.getPropertyValue(prop).trim());\n if (hex) return hex;\n }\n const native = cssValueToHex((getComputedStyle(document.body) as CSSStyleDeclaration & { accentColor?: string }).accentColor ?? '');\n if (native) return native;\n }\n\n const isDark = typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches;\n return isDark ? 'faf9f7' : '0d0d0d';\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = options.charAspect;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n // ── Supersampling ──────────────────────────────────────────────────\n // Drawing the source at cols×rows (one pixel per cell) discards most\n // of the source detail (e.g. 1920×1080 → 100×55). Instead we sample\n // at a higher resolution and average multiple source pixels per cell.\n // The supersample factor is clamped so the intermediate buffer never\n // exceeds ~4 MP (2048×2048) to stay GPU-friendly.\n const maxDim = 2048;\n const ssX = Math.max(1, Math.min(Math.floor(maxDim / cols), Math.floor(srcWidth / cols)));\n const ssY = Math.max(1, Math.min(Math.floor(maxDim / rows), Math.floor(srcHeight / rows)));\n const sampleW = cols * ssX;\n const sampleH = rows * ssY;\n\n const { ctx } = createOffscreenCanvas(sampleW, sampleH);\n ctx.drawImage(source, 0, 0, sampleW, sampleH);\n const imageData = ctx.getImageData(0, 0, sampleW, sampleH);\n const pixels = imageData.data;\n\n // ── Chroma-key pre-processing ────────────────────────────────────\n // `true` — heuristic green: g > r*1.4 && g > b*1.4 && g > 80\n // `'blue-screen'` — heuristic blue: b > r*1.4 && b > g*1.4 && b > 80\n // string / {r,g,b} — Euclidean distance with chromaKeyTolerance\n const ck = options.chromaKey;\n const ckEnabled = ck != null && ck !== false;\n const ckHeuristicGreen = ck === true;\n const ckHeuristicBlue = ck === 'blue-screen';\n let ckRGB: { r: number; g: number; b: number } | null = null;\n let ckTolSq = 0;\n if (ckEnabled && !ckHeuristicGreen && !ckHeuristicBlue) {\n ckRGB = parseChromaKeyColor(ck as string | { r: number; g: number; b: number });\n ckTolSq = (options.chromaKeyTolerance ?? 60) ** 2;\n }\n\n // ── Optional normalize pre-scan ──────────────────────────────────\n // Find the actual luminance range *of non-keyed pixels* so we can\n // stretch it to full [0, 255] — maximises perceived detail.\n // Must run AFTER chroma-key setup so keyed pixels are excluded.\n let normMin = 0;\n let normRange = 255;\n if (options.normalize) {\n let lo = 255, hi = 0;\n for (let k = 0; k < pixels.length; k += 4) {\n // Skip chroma-keyed pixels — they're bg and would inflate the range\n if (ckEnabled) {\n const pr = pixels[k], pg = pixels[k + 1], pb = pixels[k + 2];\n let keyed = false;\n if (ckHeuristicGreen) {\n keyed = pg > pr * 1.4 && pg > pb * 1.4 && pg > 80;\n } else if (ckHeuristicBlue) {\n keyed = pb > pr * 1.4 && pb > pg * 1.4 && pb > 80;\n } else if (ckRGB !== null) {\n const dr = pr - ckRGB.r, dg = pg - ckRGB.g, db = pb - ckRGB.b;\n keyed = dr * dr + dg * dg + db * db <= ckTolSq;\n }\n if (keyed) continue;\n }\n const l = 0.299 * pixels[k] + 0.587 * pixels[k + 1] + 0.114 * pixels[k + 2];\n if (l < lo) lo = l;\n if (l > hi) hi = l;\n }\n normMin = lo;\n normRange = hi > lo ? hi - lo : 255;\n }\n\n const frame: AsciiFrame = [];\n const invertVal = resolveInvert(options.invert);\n\n // When chroma-key is active, strip spaces from the charset.\n // Keyed pixels are already transparent (a=0, skipped in renderer) so spaces\n // are redundant. Keeping them wastes charset range and makes the lightest\n // (or darkest, depending on invert) subject pixels invisible.\n const effectiveCharset = ckEnabled\n ? options.charset.replace(/ /g, '') || options.charset\n : options.charset;\n\n const ssCount = ssX * ssY;\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n // Average the ssX × ssY pixel block for this cell\n let sumR = 0, sumG = 0, sumB = 0, sumA = 0;\n let keyedCount = 0;\n\n for (let sy = 0; sy < ssY; sy++) {\n const rowOff = (y * ssY + sy) * sampleW;\n for (let sx = 0; sx < ssX; sx++) {\n const i = (rowOff + x * ssX + sx) * 4;\n const pr = pixels[i], pg = pixels[i + 1], pb = pixels[i + 2], pa = pixels[i + 3];\n\n // Chroma-key: count keyed sub-pixels\n if (ckEnabled) {\n let keyed = false;\n if (ckHeuristicGreen) {\n keyed = pg > pr * 1.4 && pg > pb * 1.4 && pg > 80;\n } else if (ckHeuristicBlue) {\n keyed = pb > pr * 1.4 && pb > pg * 1.4 && pb > 80;\n } else if (ckRGB !== null) {\n const dr = pr - ckRGB.r, dg = pg - ckRGB.g, db = pb - ckRGB.b;\n keyed = dr * dr + dg * dg + db * db <= ckTolSq;\n }\n if (keyed) { keyedCount++; continue; }\n }\n\n sumR += pr; sumG += pg; sumB += pb; sumA += pa;\n }\n }\n\n // If majority of sub-pixels are keyed, treat whole cell as keyed\n if (ckEnabled && keyedCount > ssCount / 2) {\n row.push({ char: ' ', r: 0, g: 0, b: 0, a: 0 });\n continue;\n }\n\n const nonKeyed = ssCount - keyedCount;\n const r = nonKeyed > 0 ? sumR / nonKeyed : 0;\n const g = nonKeyed > 0 ? sumG / nonKeyed : 0;\n const b = nonKeyed > 0 ? sumB / nonKeyed : 0;\n const a = nonKeyed > 0 ? sumA / nonKeyed : 0;\n\n const rawLum = 0.299 * r + 0.587 * g + 0.114 * b;\n const lum = options.normalize\n ? ((rawLum - normMin) / normRange) * 255\n : rawLum;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, invertVal)\n : luminanceToChar(ditheredLum, effectiveCharset, invertVal);\n\n row.push({ char, r, g, b, a, lum: ditheredLum });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void,\n startTime: number = 0,\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration - startTime, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = startTime + (i / targetFps);\n if (time > startTime + duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = options.accentColor ? resolveAccentHex(options.accentColor) : 'd4ff00';\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n // Fill based on the OS colour scheme so the canvas background matches\n // the page regardless of the `invert` setting (which controls char\n // density / accent brightness, NOT background colour).\n const isDarkScheme = typeof window !== 'undefined'\n && window.matchMedia('(prefers-color-scheme: dark)').matches;\n ctx.fillStyle = isDarkScheme ? '#0a0a0a' : '#faf9f7';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = resolveAccentHex(options.accentColor);\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const hoverShape = options.hoverShape || 'circle';\n const isInverted = resolveInvert(options.invert);\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor, hoverShape\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB, isInverted);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB, isInverted);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n const isEmoji = options.artStyle === 'emoji';\n ctx.font = isEmoji\n ? `${fontSize}px \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Twemoji Mozilla\", sans-serif`\n : `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n // ── Dynamic charset (charsetFrames) ──────────────────────────────────\n const dynFrms = options.charsetFrames;\n const hasDyn = !!dynFrms?.length;\n const dynCharset = hasDyn\n ? dynFrms![Math.floor(Math.max(0, time) * (options.charsetFps ?? 2)) % dynFrms!.length]\n : options.charset;\n\n if (useFastRect) {\n charWeights = {};\n const csChars = [...dynCharset]; // Unicode-aware\n const csLen = csChars.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[csChars[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n // ── glitchText pre-computation ───────────────────────────────────────\n // Stacks the hover-text word on multiple consecutive rows centred on the\n // cursor. Each character scrambles (glitch) then resolves to the real\n // letter based on proximity to the cursor. No box, no fill — only the\n // word characters themselves replace the underlying ASCII.\n const isGlitchText = hoverEffect === 'glitchText' && hoverActive;\n const GLITCH_CHARS = '!@#$%^&*<>{}[]|/\\\\~`0123456789';\n const glitchLen = GLITCH_CHARS.length;\n let gtWord = '';\n let gtWordLen = 0;\n let gtCursorCol = 0;\n let gtCursorRow = 0;\n let gtRepeatRows = 0; // total rows of repeated words\n let gtStartRow = 0; // first row of the text block\n let gtStartCol = 0; // first col of each line (left-aligned to center)\n if (isGlitchText) {\n const rawText = options.hoverText ?? 'ASCIIFY';\n gtCursorCol = Math.round(hoverPosX * cols);\n gtCursorRow = Math.round(hoverPosY * rows);\n\n // Pick one word (cycle through array based on cursor region)\n if (Array.isArray(rawText)) {\n const words = rawText.filter(w => w.length > 0);\n if (words.length === 0) words.push('ASCIIFY');\n const regionX = Math.floor(gtCursorCol / Math.max(1, Math.ceil(cols / 5)));\n const regionY = Math.floor(gtCursorRow / Math.max(1, Math.ceil(rows / 3)));\n const idx = ((regionX * 7 + regionY * 13) % words.length + words.length) % words.length;\n gtWord = words[idx];\n } else {\n gtWord = rawText || 'ASCIIFY';\n }\n gtWordLen = gtWord.length;\n\n // Number of repeated rows — roughly proportional to hoverRadius\n gtRepeatRows = Math.max(3, Math.min(12, Math.round(rows * effectiveHoverRadius * 0.6)));\n const halfRows = Math.floor(gtRepeatRows / 2);\n gtStartRow = Math.max(0, gtCursorRow - halfRows);\n if (gtStartRow + gtRepeatRows > rows) gtStartRow = Math.max(0, rows - gtRepeatRows);\n\n // Center the word horizontally on the cursor\n gtStartCol = gtCursorCol - Math.floor(gtWordLen / 2);\n }\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n let drawChar = hasDyn && cell.lum != null\n ? luminanceToChar(cell.lum, dynCharset, isInverted)\n : cell.char;\n if (drawChar === ' ') continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n let hoverProximity = 0;\n\n if (hoverActive && !isGlitchText && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor, hoverShape\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n hoverProximity = fx.proximity;\n }\n\n // ── glitchText character replacement ───────────────────────────\n // Only affects cells that fall on a word-character position.\n // The word is stacked on multiple rows, centered on cursor.\n // Near cursor → resolved letter. Far → scrambled glyph.\n if (isGlitchText && y >= gtStartRow && y < gtStartRow + gtRepeatRows) {\n const charIdx = x - gtStartCol;\n if (charIdx >= 0 && charIdx < gtWordLen) {\n const targetChar = gtWord[charIdx];\n\n // Distance from cursor row (normalised 0..1)\n const rowDist = Math.abs(y - gtCursorRow) / Math.max(1, gtRepeatRows * 0.5);\n const colDist = Math.abs(x - gtCursorCol) / Math.max(1, gtWordLen);\n const dist = Math.max(rowDist, colDist);\n const resolveRate = Math.max(0, Math.min(1, 1 - dist * 0.9));\n\n // Per-cell animated hash for scramble flickering\n const h = Math.sin(x * 127.1 + y * 311.7 + Math.floor(time * 12) * 43758.5453) * 43758.5453;\n const rng = Math.abs(h - Math.floor(h));\n\n if (rng < resolveRate) {\n // Resolved — show the real character\n drawChar = targetChar;\n } else {\n // Scrambled — random glyph\n drawChar = GLITCH_CHARS[Math.abs(Math.floor(h * 97)) % glitchLen];\n }\n hoverGlow = 0.3 + resolveRate * 0.7;\n hoverBlend = 0.3 + resolveRate * 0.65;\n }\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB, isInverted);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB, isInverted);\n }\n\n if (useFastRect) {\n const weight = charWeights![drawChar] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(drawChar, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(drawChar, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /**\n * Art style preset — controls charset, render mode, and color mode together.\n * Shorthand for spreading `ART_STYLE_PRESETS[artStyle]` into options.\n * Default: `'classic'`\n */\n artStyle?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\nexport interface AsciifyVideoOptions extends AsciifySimpleOptions {\n /**\n * Fit the canvas to a container element, maintaining the video's aspect ratio.\n * Accepts an HTMLElement or a CSS selector string. The canvas is resized on\n * load and again whenever the container resizes (via ResizeObserver).\n * `stop()` automatically disconnects the observer.\n *\n * @example\n * // Fill the hero div, re-size on window resize automatically:\n * asciifyVideo('/clip.mp4', canvas, { fitTo: '#hero' });\n */\n fitTo?: HTMLElement | string | null;\n /**\n * Pre-extract all video frames into memory before starting playback.\n * Useful for short clips where you need frame-perfect control.\n *\n * Default: `false` — streams live directly from the playing video (instant\n * start, constant memory, unlimited duration).\n *\n * ⚠️ Memory-intensive. Capped at 10 s / 300 frames.\n */\n preExtract?: boolean;\n /**\n * Trim the video to a specific time range (in seconds).\n * - `start` — seek to this time before playback begins. Default: `0`\n * - `end` — loop back to `start` when this time is reached.\n * In `preExtract` mode, only frames up to `end` are extracted.\n *\n * @example\n * // Play only seconds 2–8, looping:\n * asciifyVideo('/clip.mp4', canvas, { trim: { start: 2, end: 8 } });\n */\n trim?: { start?: number; end?: number };\n /**\n * Called once when the video metadata is loaded and playback has started.\n * Receives the backing video element.\n */\n onReady?: (video: HTMLVideoElement) => void;\n /** Called after every rendered frame. */\n onFrame?: () => void;\n}\n\n/** @deprecated Use {@link AsciifyVideoOptions} */\nexport type AsciifyLiveVideoOptions = AsciifyVideoOptions;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\n/** Get the intrinsic pixel dimensions of a media source. */\nfunction getSourceDims(el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement): { w: number; h: number } {\n if (el instanceof HTMLVideoElement) return { w: el.videoWidth, h: el.videoHeight };\n if (el instanceof HTMLImageElement) return { w: el.naturalWidth || el.width, h: el.naturalHeight || el.height };\n return { w: el.width, h: el.height };\n}\n\n/**\n * Compute high-quality render dimensions from source dims.\n * Returns render dimensions (capped at 2048 on the longer edge) that should be\n * used as the coordinate space for both `imageToAsciiFrame` and\n * `renderFrameToCanvas`. This ensures characters are rendered at readable font\n * sizes regardless of how small the CSS display canvas is — exactly matching\n * the playground pipeline.\n */\nfunction computeRenderDims(srcW: number, srcH: number): { renderW: number; renderH: number } {\n const MAX = 2048;\n const scale = Math.min(1, MAX / Math.max(srcW, srcH));\n return { renderW: Math.round(srcW * scale), renderH: Math.round(srcH * scale) };\n}\n\n/**\n * Size the canvas to fit a container while maintaining aspect ratio.\n *\n * **Quality approach (matching the playground):**\n * - The canvas _buffer_ is set to source dimensions × DPR so characters are\n * rendered at their natural font size (well above the 6 px fast-rect cutoff).\n * - `ctx.scale(dpr)` maps the source-sized coordinate space into the DPR-scaled\n * buffer for crisp Retina text.\n * - CSS `width`/`height` is the container-fitted display size — the browser's\n * compositor handles the high-quality visual down-scale.\n *\n * Returns the render dimensions and DPR factor the caller should use for\n * all subsequent `imageToAsciiFrame` / `renderFrameToCanvas` calls.\n */\nfunction sizeCanvasToContainer(\n canvas: HTMLCanvasElement,\n container: HTMLElement,\n aspect: number,\n srcW?: number,\n srcH?: number,\n): { renderW: number; renderH: number; dpr: number } {\n const { width, height } = container.getBoundingClientRect();\n if (!width || !height) return { renderW: 0, renderH: 0, dpr: 1 };\n\n // CSS display size — fits inside the container keeping aspect ratio.\n let cssW = width, cssH = cssW / aspect;\n if (cssH > height) { cssH = height; cssW = cssH * aspect; }\n cssW = Math.round(cssW);\n cssH = Math.round(cssH);\n\n // Render dimensions = source size (capped) for high-quality frame generation.\n // Fall back to CSS size when no source dims are available.\n let renderW: number, renderH: number;\n if (srcW && srcH) {\n ({ renderW, renderH } = computeRenderDims(srcW, srcH));\n } else {\n renderW = cssW;\n renderH = cssH;\n }\n\n // DPR for crisp Retina text, capped so the total buffer stays ≤ ~8 MP.\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n canvas.style.width = cssW + 'px';\n canvas.style.height = cssH + 'px';\n\n return { renderW, renderH, dpr: cappedDpr };\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * When hover options are active (`hoverStrength > 0` in `options`), the engine\n * automatically sets up mouse tracking and a `requestAnimationFrame` loop so\n * the hover effect works out of the box. In that case, a `stop()` function is\n * returned to tear down the loop and listeners.\n *\n * @example\n * // Static (no hover):\n * await asciify('/photo.jpg', canvas);\n *\n * // With hover — returns a cleanup handle:\n * const stop = await asciify('/photo.jpg', canvas, {\n * options: { hoverEffect: 'glitchText', hoverStrength: 0.8, hoverText: 'HI' }\n * });\n * // later: stop?.();\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<(() => void) | void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[artStyle];\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize: resolvedFontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n // Use source dims for frame gen → maximum detail.\n const { w: srcW, h: srcH } = getSourceDims(el);\n const { renderW, renderH } = computeRenderDims(srcW, srcH);\n\n // DPR scaling for crisp Retina text\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n if (canvas.width < renderW || canvas.height < renderH) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n\n const { frame } = imageToAsciiFrame(el, merged, renderW, renderH);\n\n // ── Hover-interactive mode ──────────────────────────────────────────\n // When hoverStrength > 0, set up mouse tracking + RAF loop automatically.\n if (merged.hoverStrength > 0) {\n let hoverPos: { x: number; y: number } | null = null;\n let cancelled = false;\n let rafId = 0;\n\n const onMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n hoverPos = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height,\n };\n };\n const onMouseLeave = () => { hoverPos = null; };\n\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n\n const tick = (t: number) => {\n if (cancelled) return;\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH, t / 1000, hoverPos);\n ctx.restore();\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n };\n }\n\n // ── Static mode (no hover) ─────────────────────────────────────────\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH);\n ctx.restore();\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[artStyle], ...options, fontSize: resolvedFontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Render a video as ASCII art on a canvas. Defaults to live streaming —\n * instant start, constant memory, unlimited duration.\n *\n * Pass `{ preExtract: true }` to pre-decode all frames before playback starts\n * (useful for short clips that need frame-perfect looping).\n *\n * Pass `{ fitTo: '#container' }` to automatically size and re-size the canvas\n * to fill a container element, maintaining the video's aspect ratio.\n *\n * Returns a `stop()` function that cancels the loop and cleans up.\n *\n * ⚠️ Never set the backing `<video>` to `display: none` — browsers skip GPU\n * frame decoding for hidden elements. When given a URL string, this function\n * handles that automatically.\n *\n * @example\n * // Minimal\n * const stop = await asciifyVideo('/clip.mp4', canvas);\n *\n * // Fit to container, re-size on window resize:\n * const stop = await asciifyVideo('/clip.mp4', canvas, { fitTo: '#hero' });\n *\n * // Pre-extract frames (old behavior):\n * const stop = await asciifyVideo('/clip.mp4', canvas, { preExtract: true });\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {}, fitTo, preExtract = false, trim, onReady, onFrame }: AsciifyVideoOptions = {}\n): Promise<() => void> {\n const trimStart = trim?.start ?? 0;\n const trimEnd = trim?.end;\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[artStyle], ...options, fontSize: resolvedFontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('asciifyVideo: could not get 2d context from canvas.');\n\n const container: HTMLElement | null =\n typeof fitTo === 'string' ? document.querySelector<HTMLElement>(fitTo) :\n fitTo instanceof HTMLElement ? fitTo : null;\n\n // ── Pre-extract mode ─────────────────────────────────────────────────────\n if (preExtract) {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n if (video.readyState < 2) {\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`asciifyVideo: failed to load \"${source}\"`));\n });\n }\n } else {\n video = source;\n }\n\n if (container) sizeCanvasToContainer(canvas, container, video.videoWidth / video.videoHeight, video.videoWidth, video.videoHeight);\n\n // Render dimensions = source size for maximum detail\n const { renderW, renderH } = computeRenderDims(video.videoWidth, video.videoHeight);\n\n // Compute DPR for the canvas buffer\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n // Ensure buffer is large enough\n if (canvas.width < Math.round(renderW * cappedDpr)) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n\n const maxDur = trimEnd !== undefined ? trimEnd - trimStart : 10;\n const { frames, fps } = await videoToAsciiFrames(video, merged, renderW, renderH, undefined, maxDur, undefined, trimStart);\n let cancelled = false, animId: number, i = 0, last = performance.now();\n let firstFrame = true;\n const interval = 1000 / fps;\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frames[i], merged, renderW, renderH);\n ctx.restore();\n i = (i + 1) % frames.length;\n last = now;\n if (firstFrame) { firstFrame = false; onReady?.(video); }\n onFrame?.();\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n }\n\n // ── Live streaming mode (default) ────────────────────────────────────────\n let video: HTMLVideoElement;\n let ownedVideo = false;\n\n if (typeof source === 'string') {\n // Keep off-screen but not display:none — browsers skip GPU decoding for hidden elements\n video = document.createElement('video');\n video.src = source;\n video.muted = true;\n video.loop = true;\n video.playsInline = true;\n video.setAttribute('playsinline', '');\n Object.assign(video.style, {\n position: 'fixed', top: '0', left: '0',\n width: '1px', height: '1px',\n opacity: '0', pointerEvents: 'none', zIndex: '-1',\n });\n document.body.appendChild(video);\n ownedVideo = true;\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`asciifyVideo: failed to load \"${source}\"`));\n });\n await video.play().catch(() => {});\n } else {\n video = source;\n if (video.paused) await video.play().catch(() => {});\n }\n\n // Apply trim start\n if (trimStart > 0) {\n video.currentTime = trimStart;\n await new Promise<void>(resolve => {\n const h = () => { video.removeEventListener('seeked', h); resolve(); };\n video.addEventListener('seeked', h);\n });\n }\n\n // Enforce trim bounds — seek back to trimStart when the video loops to 0\n // or when currentTime exceeds trimEnd.\n let timeupdateHandler: (() => void) | null = null;\n if (trimStart > 0 || trimEnd !== undefined) {\n timeupdateHandler = () => {\n if (trimEnd !== undefined && video.currentTime >= trimEnd) { video.currentTime = trimStart; }\n else if (trimStart > 0 && video.currentTime < trimStart) { video.currentTime = trimStart; }\n };\n video.addEventListener('timeupdate', timeupdateHandler);\n }\n\n let ro: ResizeObserver | null = null;\n // Render dimensions = source size for maximum detail (same as playground)\n const { renderW, renderH } = computeRenderDims(video.videoWidth, video.videoHeight);\n\n if (container) {\n const aspect = video.videoWidth / video.videoHeight;\n const vw = video.videoWidth, vh = video.videoHeight;\n const sizing = sizeCanvasToContainer(canvas, container, aspect, vw, vh);\n // Apply DPR scale transform once — will be refreshed on resize\n const sCtx = canvas.getContext('2d');\n if (sCtx) sCtx.setTransform(sizing.dpr, 0, 0, sizing.dpr, 0, 0);\n\n ro = new ResizeObserver(() => {\n const s = sizeCanvasToContainer(canvas, container, aspect, vw, vh);\n const rCtx = canvas.getContext('2d');\n if (rCtx) rCtx.setTransform(s.dpr, 0, 0, s.dpr, 0, 0);\n });\n ro.observe(container);\n } else {\n // No container — set up buffer at source dims for quality\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n if (canvas.width < Math.round(renderW * cappedDpr)) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n }\n\n let cancelled = false;\n let animId: number;\n let firstFrame = true;\n const tick = () => {\n if (cancelled) return;\n animId = requestAnimationFrame(tick);\n if (video.readyState < 2 || canvas.width === 0 || canvas.height === 0) return;\n // Skip frames outside trim window (prevents flash at time 0 on loop)\n if (trimStart > 0 && video.currentTime < trimStart) return;\n if (trimEnd !== undefined && video.currentTime >= trimEnd) return;\n\n const { frame } = imageToAsciiFrame(video, merged, renderW, renderH);\n if (frame.length > 0) {\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH, 0, null);\n if (firstFrame) { firstFrame = false; onReady?.(video); }\n onFrame?.();\n }\n };\n animId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(animId);\n ro?.disconnect();\n if (timeupdateHandler) video.removeEventListener('timeupdate', timeupdateHandler);\n if (ownedVideo) {\n video.pause();\n video.src = '';\n document.body.removeChild(video);\n }\n };\n}\n\n/**\n * @deprecated Use {@link asciifyVideo} instead — it now defaults to live streaming\n * and accepts the same options including `fitTo` and `preExtract`.\n */\nexport function asciifyLiveVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n opts?: AsciifyVideoOptions,\n): Promise<() => void> {\n return asciifyVideo(source, canvas, opts);\n}\n\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = undefined as string | undefined,\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#007a5e' : '#00ffcc');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = undefined as string | undefined,\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 55; bgc = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = undefined as string | undefined,\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 55; bgv = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = undefined as string | undefined,\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = undefined as string | undefined,\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderFireBackground — upward-drifting fire simulation using a cellular\n * automata heat-propagation approach rendered as ASCII chars.\n */\nimport { parseColor } from './_shared';\n\nexport interface FireBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters mapped from cool→hot (default: ' .,:;i+xX#&@') */\n chars?: string;\n /** Base flame colour (default: '#ff4500') */\n color?: string;\n /** Secondary hot-tip colour (default: '#ffe066') */\n hotColor?: string;\n /** Flame intensity 0–1 (default: 0.85) */\n intensity?: number;\n /** Horizontal wind force -1..1 (default: 0) */\n wind?: number;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Light mode: invert text colours (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderFireBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: FireBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;i+xX#&@',\n color = '#ff4500',\n hotColor = '#ffe066',\n intensity = 0.85,\n wind = 0,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const len = cols * rows;\n\n // Persistent heat buffer stored on the canvas element to survive redraws.\n const key = '__fire_heat__';\n const canvasAny = ctx.canvas as unknown as Record<string, Float32Array>;\n let heat: Float32Array = canvasAny[key] as Float32Array;\n if (!heat || heat.length !== len) {\n heat = new Float32Array(len);\n canvasAny[key] = heat;\n }\n\n const dt = 0.016 * speed;\n const coolingRate = 0.18 * dt;\n const windShift = wind * speed * 0.8;\n\n // Seed the bottom 2 rows with hot cells every frame.\n const baseRow = rows - 1;\n const t = time * speed;\n for (let c = 0; c < cols; c++) {\n const flicker = Math.sin(c * 0.31 + t * 4.1) * 0.5 + 0.5;\n const flicker2 = Math.sin(c * 0.73 - t * 2.7) * 0.5 + 0.5;\n const seed = (flicker * 0.6 + flicker2 * 0.4) * intensity;\n heat[baseRow * cols + c] = Math.min(1, seed + Math.random() * 0.15 * intensity);\n if (baseRow > 0) heat[(baseRow - 1) * cols + c] = Math.min(1, seed * 0.85 + Math.random() * 0.1 * intensity);\n }\n\n // Propagate heat upward.\n const newHeat = new Float32Array(len);\n for (let r = 0; r < rows - 2; r++) {\n for (let c = 0; c < cols; c++) {\n const below = heat[(r + 1) * cols + c];\n const below2 = heat[(r + 2) * cols + Math.max(0, Math.min(cols - 1, c + Math.round(windShift)))];\n const left = heat[(r + 1) * cols + Math.max(0, c - 1)];\n const right = heat[(r + 1) * cols + Math.min(cols - 1, c + 1)];\n const avg = (below * 0.4 + below2 * 0.25 + left * 0.175 + right * 0.175);\n newHeat[r * cols + c] = Math.max(0, avg - coolingRate - Math.random() * 0.02 * speed);\n }\n }\n // Copy bottom seeded rows unchanged.\n for (let c = 0; c < cols; c++) {\n newHeat[(rows - 1) * cols + c] = heat[(rows - 1) * cols + c];\n if (rows > 1) newHeat[(rows - 2) * cols + c] = heat[(rows - 2) * cols + c];\n }\n canvasAny[key] = newHeat;\n\n // Parse colours.\n const cp = parseColor(color) ?? { r: 255, g: 69, b: 0 };\n const hp = parseColor(hotColor) ?? { r: 255, g: 224, b: 102 };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const v = newHeat[r * cols + c];\n if (v < 0.03) continue;\n\n const charIdx = Math.min(chars.length - 1, Math.floor(v * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n // Interpolate colour from base to hot tip.\n const blend = Math.min(1, v * 1.2);\n const r2 = (cp.r + (hp.r - cp.r) * blend) | 0;\n const g2 = (cp.g + (hp.g - cp.g) * blend) | 0;\n const b2 = (cp.b + (hp.b - cp.b) * blend) | 0;\n\n const alpha = lightMode ? (1 - v * 0.3) : Math.min(1, v + 0.15);\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n ctx.globalAlpha = 1;\n}\n","/**\n * renderDnaBackground — animated double-helix DNA strands scrolling vertically\n * with base-pair characters between them.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface DnaBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for strand nodes (default: 'ATCG') */\n baseChars?: string;\n /** Characters for the connectors between strands (default: '-=≡') */\n bridgeChars?: string;\n /** Primary strand colour (default: '#00e5ff') */\n color?: string;\n /** Secondary strand colour (default: '#ff4081') */\n color2?: string;\n /** Bridge / connector colour (default: '#88ffcc') */\n bridgeColor?: string;\n /** Speed multiplier (default: 1) */\n speed?: number;\n /** Number of helix columns (default: auto, ~1 per 80px) */\n helixCount?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderDnaBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: DnaBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n baseChars = 'ATCG',\n bridgeChars = '-=≡',\n color = '#00e5ff',\n color2 = '#ff4081',\n bridgeColor = '#88ffcc',\n speed = 1,\n helixCount,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const numHelix = helixCount ?? Math.max(1, Math.floor(width / 80));\n const sectionW = cols / numHelix;\n\n const cp = parseColor(color) ?? { r: 0, g: 229, b: 255 };\n const cp2 = parseColor(color2) ?? { r: 255, g: 64, b: 129 };\n const bp = parseColor(bridgeColor) ?? { r: 136, g: 255, b: 204 };\n\n const defaultColor = lightMode ? 'rgb(55,55,55)' : 'rgb(255,255,255)';\n void defaultColor; // used below\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const amplitude = (sectionW * 0.35);\n\n for (let h = 0; h < numHelix; h++) {\n const centerCol = sectionW * (h + 0.5);\n\n for (let r = 0; r < rows; r++) {\n const phase = (r / rows) * Math.PI * 6 - t * 1.8;\n const strand1ColF = centerCol + Math.sin(phase) * amplitude;\n const strand2ColF = centerCol + Math.sin(phase + Math.PI) * amplitude;\n const strand1Col = Math.round(strand1ColF);\n const strand2Col = Math.round(strand2ColF);\n\n if (strand1Col < 0 || strand1Col >= cols) continue;\n const baseSeed1 = hash2(h * 31 + r * 7, 3);\n const ch1 = baseChars[Math.floor(baseSeed1 * baseChars.length)];\n\n // Depth cue: alpha based on sine value (-1..1)\n const depth1 = (Math.sin(phase) + 1) * 0.5;\n const depth2 = (Math.sin(phase + Math.PI) + 1) * 0.5;\n\n ctx.globalAlpha = 0.35 + depth1 * 0.65;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n ctx.fillText(ch1, strand1Col * charW, r * lineH);\n\n if (strand2Col >= 0 && strand2Col < cols) {\n const baseSeed2 = hash2(h * 53 + r * 11, 7);\n const ch2 = baseChars[Math.floor(baseSeed2 * baseChars.length)];\n ctx.globalAlpha = 0.35 + depth2 * 0.65;\n ctx.fillStyle = `rgb(${cp2.r},${cp2.g},${cp2.b})`;\n ctx.fillText(ch2, strand2Col * charW, r * lineH);\n }\n\n // Draw bridge every ~3 rows when strands are roughly horizontal.\n const bridgeInterval = 3;\n if (r % bridgeInterval === 0) {\n const minC = Math.min(strand1Col, strand2Col);\n const maxC = Math.max(strand1Col, strand2Col);\n const bridgeLen = maxC - minC;\n if (bridgeLen > 1) {\n const bSeed = hash2(r * 17 + h * 43, 5);\n const bCh = bridgeChars[Math.floor(bSeed * bridgeChars.length)];\n const midBridgeAlpha = (depth1 + depth2) * 0.25 + 0.2;\n ctx.globalAlpha = midBridgeAlpha;\n ctx.fillStyle = `rgb(${bp.r},${bp.g},${bp.b})`;\n for (let bc = minC + 1; bc < maxC; bc++) {\n ctx.fillText(bCh, bc * charW, r * lineH);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderTerrainBackground — scrolling ASCII side-scroll heightmap landscape\n * generated from layered Perlin-style noise.\n */\nimport { parseColor, fbm, hash2 } from './_shared';\n\nexport interface TerrainBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for terrain density (default: ' .,:;+*#@') */\n chars?: string;\n /** Foreground ground colour (default: '#4caf50') */\n color?: string;\n /** Sky / star colour (default: '#1a237e') */\n skyColor?: string;\n /** Peak / snow-cap colour (default: '#e0e0e0') */\n peakColor?: string;\n /** Horizontal scroll speed (default: 1) */\n speed?: number;\n /** Terrain roughness 0.1–1 (default: 0.55) */\n roughness?: number;\n /** Mountain height fraction 0–1 (default: 0.55) */\n heightScale?: number;\n /** Show faint background stars (default: true) */\n stars?: boolean;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderTerrainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: TerrainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;+*#@',\n color = '#4caf50',\n skyColor = '#1a237e',\n peakColor = '#e0e0e0',\n speed = 1,\n roughness = 0.55,\n heightScale = 0.55,\n stars = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 76, g: 175, b: 80 };\n const sky = parseColor(skyColor) ?? { r: 26, g: 35, b: 126 };\n const peak = parseColor(peakColor) ?? { r: 224, g: 224, b: 224 };\n void lightMode;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const scroll = time * speed * 0.4;\n\n // Pre-compute terrain height per column.\n const terrainRow: number[] = new Array(cols);\n for (let c = 0; c < cols; c++) {\n const nx = (c / cols + scroll) * roughness * 3;\n const h = (fbm(nx, 0.5) * 0.5 + 0.5) * heightScale;\n terrainRow[c] = Math.floor(h * rows);\n }\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const terrainStart = rows - 1 - terrainRow[c];\n const isGround = r >= terrainStart;\n const isNearPeak = r === terrainStart;\n\n if (!isGround) {\n // Sky region: occasional stars.\n if (stars) {\n const starSeed = hash2(c * 7 + Math.floor(scroll * 0.3), r * 13);\n if (starSeed > 0.97) {\n const twinkle = Math.sin(time * 2 + starSeed * 100) * 0.3 + 0.7;\n ctx.globalAlpha = twinkle * 0.5;\n ctx.fillStyle = `rgb(${sky.r + 60},${sky.g + 60},${sky.b + 80})`;\n ctx.fillText('·', c * charW, r * lineH);\n }\n }\n continue;\n }\n\n // Ground: depth based on distance from surface.\n const depth = (r - terrainStart) / Math.max(1, terrainRow[c]);\n const charIdx = Math.min(chars.length - 1, Math.floor(depth * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ' && !isNearPeak) continue;\n\n const blendPeak = isNearPeak ? 1 : Math.max(0, 1 - depth * 4);\n const r2 = ((cp.r + (peak.r - cp.r) * blendPeak) | 0);\n const g2 = ((cp.g + (peak.g - cp.g) * blendPeak) | 0);\n const b2 = ((cp.b + (peak.b - cp.b) * blendPeak) | 0);\n\n ctx.globalAlpha = 0.5 + depth * 0.5;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(isNearPeak ? chars[chars.length - 1] : ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderCircuitBackground — procedural PCB trace growth with signal pulses\n * traveling along horizontal and vertical edges.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface CircuitBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Trace characters (default: '─│┌┐└┘├┤┬┴┼') */\n chars?: string;\n /** Trace colour (default: '#00ff88') */\n color?: string;\n /** Signal pulse colour (default: '#ffffff') */\n pulseColor?: string;\n /** Fraction of cells that have a trace (default: 0.38) */\n density?: number;\n /** Signal pulse speed (default: 1) */\n speed?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\n// Direction flags (bit-field per cell)\nconst EAST = 1;\nconst WEST = 2;\nconst NORTH = 4;\nconst SOUTH = 8;\n\nconst DIR_CHARS: Record<number, string> = {\n [EAST | WEST]: '─',\n [NORTH | SOUTH]: '│',\n [EAST | SOUTH]: '┌',\n [WEST | SOUTH]: '┐',\n [EAST | NORTH]: '└',\n [WEST | NORTH]: '┘',\n [EAST | WEST | SOUTH]: '┬',\n [EAST | WEST | NORTH]: '┴',\n [NORTH | SOUTH | EAST]: '├',\n [NORTH | SOUTH | WEST]: '┤',\n [EAST | WEST | NORTH | SOUTH]: '┼',\n [EAST]: '╶',\n [WEST]: '╴',\n [NORTH]: '╵',\n [SOUTH]: '╷',\n};\n\nexport function renderCircuitBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: CircuitBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n pulseColor = '#ffffff',\n color = '#00ff88',\n density = 0.38,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 0, g: 255, b: 136 };\n const pp = parseColor(pulseColor) ?? { r: 255, g: 255, b: 255 };\n void lightMode;\n\n // Build a stable grid from hash functions (no per-frame allocation).\n // Each cell stores a bitmask of connections.\n const getConnections = (c: number, r: number): number => {\n if (hash2(c * 17 + 1, r * 7 + 2) > density) return 0;\n let mask = 0;\n if (c + 1 < cols && hash2(c * 17 + 1, r * 7 + 2) > 0.15) mask |= EAST;\n if (c - 1 >= 0 && hash2((c-1)*17+1, r*7+2) > 0.15) mask |= WEST;\n if (r + 1 < rows && hash2(c * 17 + 1, (r+1)*7+2) > 0.15) mask |= SOUTH;\n if (r - 1 >= 0 && hash2(c*17+1,(r-1)*7+2) > 0.15) mask |= NORTH;\n return mask;\n };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const mask = getConnections(c, r);\n if (mask === 0) continue;\n\n const ch = DIR_CHARS[mask] ?? '·';\n\n // Pulse wave along horizontal traces.\n const pulsePosH = ((t * 8 + hash2(c, r * 23) * 40) % cols);\n const pulsePosV = ((t * 6 + hash2(r * 17, c * 11) * 40) % rows);\n const nearH = (mask & EAST || mask & WEST) && Math.abs(c - pulsePosH) < 1.5;\n const nearV = (mask & NORTH || mask & SOUTH) && Math.abs(r - pulsePosV) < 1.5;\n const isPulse = nearH || nearV;\n\n const baseAlpha = 0.25 + hash2(c * 3, r * 5) * 0.35;\n\n if (isPulse) {\n ctx.globalAlpha = 0.95;\n ctx.fillStyle = `rgb(${pp.r},${pp.g},${pp.b})`;\n } else {\n ctx.globalAlpha = baseAlpha;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n }\n\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nexport type { FireBackgroundOptions } from './fire';\nexport { renderFireBackground } from './fire';\n\nexport type { DnaBackgroundOptions } from './dna';\nexport { renderDnaBackground } from './dna';\n\nexport type { TerrainBackgroundOptions } from './terrain';\nexport { renderTerrainBackground } from './terrain';\n\nexport type { CircuitBackgroundOptions } from './circuit';\nexport { renderCircuitBackground } from './circuit';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\nimport { renderFireBackground } from './fire';\nimport type { FireBackgroundOptions } from './fire';\nimport { renderDnaBackground } from './dna';\nimport type { DnaBackgroundOptions } from './dna';\nimport { renderTerrainBackground } from './terrain';\nimport type { TerrainBackgroundOptions } from './terrain';\nimport { renderCircuitBackground } from './circuit';\nimport type { CircuitBackgroundOptions } from './circuit';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions,\n FireBackgroundOptions,\n DnaBackgroundOptions,\n TerrainBackgroundOptions,\n CircuitBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n * - 'fire' — upward cellular-automata flame simulation\n * - 'dna' — double-helix strand scrolling with base-pair chars\n * - 'terrain' — scrolling ASCII side-scroll heightmap landscape\n * - 'circuit' — procedural PCB traces with traveling signal pulses\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph' | 'fire' | 'dna' | 'terrain' | 'circuit';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * All supported background type identifiers — single source of truth for\n * counts, type-safe option values, and documentation.\n */\nexport const BACKGROUND_TYPES = [\n 'wave', 'rain', 'stars', 'pulse', 'noise', 'grid',\n 'aurora', 'silk', 'void', 'morph',\n 'fire', 'dna', 'terrain', 'circuit',\n] as const;\n\nexport type BackgroundType = typeof BACKGROUND_TYPES[number];\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions | FireBackgroundOptions | DnaBackgroundOptions\n | TerrainBackgroundOptions | CircuitBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n const buildFireOpts = (): FireBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as FireBackgroundOptions).color,\n });\n const buildDnaOpts = (): DnaBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as DnaBackgroundOptions).color,\n });\n const buildTerrainOpts = (): TerrainBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as TerrainBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n const buildCircuitOpts = (): CircuitBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as CircuitBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else if (type === 'fire') optsRef.current = buildFireOpts();\n else if (type === 'dna') optsRef.current = buildDnaOpts();\n else if (type === 'terrain') optsRef.current = buildTerrainOpts();\n else if (type === 'circuit') optsRef.current = buildCircuitOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else if (type === 'fire') {\n renderFireBackground(ctx, r.width, r.height, time, optsRef.current as FireBackgroundOptions);\n } else if (type === 'dna') {\n renderDnaBackground(ctx, r.width, r.height, time, optsRef.current as DnaBackgroundOptions);\n } else if (type === 'terrain') {\n renderTerrainBackground(ctx, r.width, r.height, time, optsRef.current as TerrainBackgroundOptions);\n } else if (type === 'circuit') {\n renderCircuitBackground(ctx, r.width, r.height, time, optsRef.current as CircuitBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","/**\n * asciiText — pure string output (no canvas required).\n * Converts an image/video/canvas element to a plain-text ASCII string\n * suitable for server-side rendering, clipboard export, or terminal output.\n */\nimport type { AsciiOptions } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { imageToAsciiFrame } from './renderer';\n\n/**\n * Convert any image/video/canvas source to a plain multi-line string of ASCII.\n *\n * @example\n * ```ts\n * const text = asciiText(imgEl, { fontSize: 8, colorMode: 'grayscale' });\n * console.log(text);\n * ```\n *\n * @example SSR (Node/JSDOM)\n * ```ts\n * const { createCanvas, loadImage } = require('@napi-rs/canvas');\n * const img = await loadImage('./photo.jpg');\n * const canvas = createCanvas(img.width, img.height);\n * const ctx = canvas.getContext('2d');\n * ctx.drawImage(img, 0, 0);\n * const text = asciiText(canvas as unknown as HTMLCanvasElement, { fontSize: 10 });\n * ```\n */\nexport function asciiText(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const lines: string[] = [];\n for (const row of frame) {\n lines.push(row.map(cell => cell.char).join(''));\n }\n return lines.join('\\n');\n}\n\n/**\n * Convert any source to an ASCII string with ANSI 256-colour escape codes.\n * Works in any terminal that supports ANSI colours.\n *\n * @example\n * ```ts\n * process.stdout.write(asciiTextAnsi(imgEl, { fontSize: 8 }));\n * ```\n */\nexport function asciiTextAnsi(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const RESET = '\\x1b[0m';\n const lines: string[] = [];\n\n for (const row of frame) {\n let line = '';\n for (const cell of row) {\n if (cell.char === ' ' || cell.a < 10) {\n line += ' ';\n } else {\n // Truecolor ANSI: \\x1b[38;2;R;G;Bm\n line += `\\x1b[38;2;${cell.r};${cell.g};${cell.b}m${cell.char}${RESET}`;\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n}\n","/**\n * text-frame.ts — Build and render ASCII frames from tiling text patterns.\n *\n * Enables interactive text backgrounds with the full hover-effect system\n * (spotlight, magnify, repel, glow, colorShift, …) without needing an image\n * source.\n *\n * @example — basic usage\n * ```ts\n * import { renderTextBackground } from 'asciify-engine';\n *\n * function tick(ctx, w, h, mousePos) {\n * renderTextBackground(ctx, w, h, 'asciify·engine·v1·', {\n * hoverEffect: 'spotlight',\n * hoverColor: '#d4ff00',\n * }, mousePos);\n * requestAnimationFrame(() => tick(ctx, w, h, mousePos));\n * }\n * ```\n *\n * @example — build the frame yourself and pass it to renderFrameToCanvas\n * ```ts\n * import { buildTextFrame, renderFrameToCanvas, DEFAULT_OPTIONS } from 'asciify-engine';\n *\n * const frame = buildTextFrame('hello world · ', 80, 24);\n * renderFrameToCanvas(ctx, frame, {\n * ...DEFAULT_OPTIONS,\n * hoverEffect: 'repel',\n * hoverStrength: 0.9,\n * hoverColor: '#a0e8ff',\n * }, width, height, 0, mousePos);\n * ```\n */\n\nimport type { AsciiFrame, AsciiOptions, HoverEffect } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseColor } from '../backgrounds/_shared';\nimport { renderFrameToCanvas } from './renderer';\n\n// ─── Public types ──────────────────────────────────────────────────────────\n\nexport interface TextBackgroundOptions {\n /**\n * Character size in pixels.\n * Controls the grid density: smaller → more cells, finer text.\n * @default 10\n */\n fontSize?: number;\n\n /**\n * Line-height multiplier applied on top of `fontSize` to derive row height.\n * Matches the default monospace aspect ratio used by the renderer.\n * @default 1.6\n */\n lineHeight?: number;\n\n /**\n * Base colour for the text cells (inactive state).\n * Accepts any CSS hex or rgb string.\n * @default '#505050'\n */\n color?: string;\n\n /**\n * Base alpha for the text cells, 0–255.\n * @default 100\n */\n opacity?: number;\n\n /**\n * Which hover effect to activate when `hoverPos` is supplied.\n * @default 'spotlight'\n */\n hoverEffect?: HoverEffect;\n\n /**\n * Intensity of the hover distortion / glow, 0–1.\n * @default 0.85\n */\n hoverStrength?: number;\n\n /**\n * Normalised radius of the hover influence zone, 0–1.\n * @default 0.18\n */\n hoverRadius?: number;\n\n /**\n * Accent colour applied by the hover effect.\n * @default '#d4ff00'\n */\n hoverColor?: string;\n}\n\n// ─── buildTextFrame ────────────────────────────────────────────────────────\n\n/**\n * Build an `AsciiFrame` filled with a tiling text pattern.\n *\n * The `text` string is repeated (wrapping at column boundaries) across every\n * cell of the `cols × rows` grid. Each cell carries the supplied base colour\n * and opacity as `{r, g, b, a}` values.\n *\n * The returned frame can be passed directly to `renderFrameToCanvas` with any\n * `AsciiOptions` including hover effects.\n *\n * @param text - Pattern string to tile across the grid (e.g. `'hello · '`)\n * @param cols - Number of character columns\n * @param rows - Number of character rows\n * @param color - Base RGB colour string for the cells (default: `'#505050'`)\n * @param opacity - Base alpha 0–255 (default: `100`)\n */\nexport function buildTextFrame(\n text: string,\n cols: number,\n rows: number,\n color: string = '#505050',\n opacity: number = 100,\n): AsciiFrame {\n if (!text || cols <= 0 || rows <= 0) return [];\n const parsed = parseColor(color) ?? { r: 80, g: 80, b: 80 };\n const pattern = text;\n const len = pattern.length;\n\n return Array.from({ length: rows }, (_, row) =>\n Array.from({ length: cols }, (_, col) => ({\n char: pattern[(row * cols + col) % len],\n r: parsed.r,\n g: parsed.g,\n b: parsed.b,\n a: opacity,\n }))\n );\n}\n\n// ─── renderTextBackground ─────────────────────────────────────────────────\n\n/**\n * All-in-one: build a tiling text grid and render it to a canvas with the\n * full hover-effect system (spotlight, magnify, repel, glow, colorShift, …).\n *\n * Call this inside a `requestAnimationFrame` loop, passing updated `hoverPos`\n * each frame to get smooth interactive effects.\n *\n * @param ctx - 2D rendering context of the target canvas\n * @param width - Canvas logical width in pixels\n * @param height - Canvas logical height in pixels\n * @param text - Pattern string to tile (e.g. `'asciify·engine·v1·'`)\n * @param options - {@link TextBackgroundOptions}\n * @param hoverPos - Normalised mouse position `{x, y}` in 0–1 range,\n * optionally with an `intensity` multiplier (0–1).\n * Pass `null` or omit to render without hover.\n */\nexport function renderTextBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n text: string,\n options: TextBackgroundOptions = {},\n hoverPos?: { x: number; y: number; intensity?: number } | null,\n): void {\n const {\n fontSize = 10,\n lineHeight = 1.6,\n color = '#505050',\n opacity = 100,\n hoverEffect = 'spotlight',\n hoverStrength = 0.85,\n hoverRadius = 0.18,\n hoverColor = '#d4ff00',\n } = options;\n\n const cols = Math.max(1, Math.floor(width / fontSize));\n const rows = Math.max(1, Math.floor(height / (fontSize * lineHeight)));\n\n const frame = buildTextFrame(text, cols, rows, color, opacity);\n\n const renderOpts: AsciiOptions = {\n ...DEFAULT_OPTIONS,\n fontSize,\n hoverEffect,\n hoverStrength,\n hoverRadius,\n hoverColor,\n };\n\n renderFrameToCanvas(ctx, frame, renderOpts, width, height, 0, hoverPos ?? null);\n}\n","// ── Snapshot ─────────────────────────────────────────────────────────────\n\nexport interface SnapshotOptions {\n /**\n * Image format.\n * - 'png' — lossless (default)\n * - 'jpeg' — smaller, no transparency\n * - 'webp' — best compression with transparency\n */\n format?: 'png' | 'jpeg' | 'webp';\n /** 0–1 quality for jpeg/webp. Default: 0.92 */\n quality?: number;\n /**\n * Scale factor applied before capture. Default: 1.\n * Use 2 for a high-resolution export at 2× the canvas size.\n */\n scale?: number;\n}\n\n/**\n * Capture a single frame from a canvas as a Blob.\n *\n * @example\n * ```ts\n * const blob = await captureSnapshot(canvas);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport function captureSnapshot(\n canvas: HTMLCanvasElement,\n { format = 'png', quality = 0.92, scale = 1 }: SnapshotOptions = {},\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let src: HTMLCanvasElement = canvas;\n if (scale !== 1) {\n const off = document.createElement('canvas');\n off.width = Math.round(canvas.width * scale);\n off.height = Math.round(canvas.height * scale);\n const offCtx = off.getContext('2d');\n if (!offCtx) { reject(new Error('captureSnapshot: could not get 2d context')); return; }\n offCtx.drawImage(canvas, 0, 0, off.width, off.height);\n src = off;\n }\n src.toBlob(\n (blob) => blob ? resolve(blob) : reject(new Error('captureSnapshot: toBlob returned null')),\n `image/${format}`,\n quality,\n );\n });\n}\n\n/**\n * Capture a single frame and immediately trigger a browser download.\n *\n * @example\n * ```ts\n * await snapshotAndDownload(canvas);\n * await snapshotAndDownload(canvas, { format: 'jpeg', filename: 'my-art' });\n * ```\n */\nexport async function snapshotAndDownload(\n canvas: HTMLCanvasElement,\n options: SnapshotOptions & { filename?: string } = {},\n): Promise<void> {\n const { filename = 'asciify-snapshot', format = 'png', ...snapOpts } = options;\n const blob = await captureSnapshot(canvas, { format, ...snapOpts });\n const ext = format === 'jpeg' ? 'jpg' : format;\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${filename}.${ext}`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 10_000);\n}\n","/**\n * asciifyWebcam — live webcam → ASCII art on canvas.\n *\n * Requests camera access, attaches the stream to a hidden video element, and\n * runs a rAF loop that converts each frame to ASCII and renders it onto a\n * supplied canvas.\n *\n * @example\n * const stop = await asciifyWebcam(canvas);\n * // later: stop();\n *\n * @example\n * const stop = await asciifyWebcam(canvas, {\n * fontSize: 8,\n * style: 'terminal',\n * mirror: true, // horizontal flip (selfie mode)\n * constraints: { facingMode: 'user' },\n * });\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, renderFrameToCanvas } from './renderer';\n\nexport interface WebcamOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra AsciiOptions merged on top of the preset */\n options?: Partial<AsciiOptions>;\n /**\n * Called every frame to get the latest options. Takes priority over `options`.\n * Use this to keep the rendering in sync with live UI controls without\n * restarting the camera.\n *\n * @example\n * const optionsRef = useRef(currentOptions);\n * optionsRef.current = currentOptions;\n * asciifyWebcam(canvas, { liveOptions: () => optionsRef.current });\n */\n liveOptions?: () => Partial<AsciiOptions>;\n /**\n * Flip the output horizontally so it reads like a mirror / selfie camera.\n * Default: true\n */\n mirror?: boolean;\n /**\n * Passed directly to `getUserMedia({ video: constraints })`.\n * Defaults to `{ facingMode: 'user' }`.\n */\n constraints?: MediaTrackConstraints;\n /**\n * Device pixel ratio used to compute logical render dimensions from the\n * canvas's physical pixel size. Defaults to `window.devicePixelRatio ?? 1`.\n * Set this when you size the canvas at physical resolution (e.g. width × dpr)\n * so that ASCII column/row counts are based on CSS pixels, not physical ones.\n */\n dpr?: number;\n}\n\n/**\n * Start a live webcam ASCII-art loop and render it onto `canvas`.\n * Returns a `stop()` function that cancels the loop and releases the camera.\n *\n * Throws if the browser doesn't support `getUserMedia` or the user denies\n * camera permission.\n */\nexport async function asciifyWebcam(\n canvas: HTMLCanvasElement,\n {\n fontSize = 10,\n style = 'classic',\n options = {},\n liveOptions,\n mirror = true,\n constraints = { facingMode: 'user' },\n dpr: dprOverride,\n }: WebcamOptions = {}\n): Promise<() => void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n throw new Error('asciifyWebcam: getUserMedia is not supported in this browser.');\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ video: constraints });\n\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n video.playsInline = true;\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error('asciifyWebcam: video stream failed to load.'));\n video.play().catch(reject);\n });\n\n const merged: AsciiOptions = {\n ...DEFAULT_OPTIONS,\n ...ART_STYLE_PRESETS[style],\n ...options,\n fontSize,\n };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('asciifyWebcam: could not get 2d context from canvas.');\n\n // ── DPR — scale ctx once so renderFrameToCanvas uses CSS (logical) pixels ──\n const deviceRatio = dprOverride ?? (typeof window !== 'undefined' ? window.devicePixelRatio : 1) ?? 1;\n if (deviceRatio !== 1) {\n ctx.scale(deviceRatio, deviceRatio);\n }\n\n // ── Hover tracking ────────────────────────────────────────────────────────\n let hoverPos: { x: number; y: number } | null = null;\n const smoothHover = { x: 0.5, y: 0.5, intensity: 0 };\n\n const onMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n hoverPos = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height,\n };\n };\n const onMouseLeave = () => { hoverPos = null; };\n\n if (merged.hoverStrength > 0) {\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n }\n\n let cancelled = false;\n let animId: number;\n const startTime = performance.now();\n\n const tick = (timestamp: number) => {\n if (cancelled) return;\n\n if (video.readyState >= video.HAVE_CURRENT_DATA) {\n // Logical (CSS) dimensions — used for ASCII column/row count\n const displayW = canvas.width / deviceRatio;\n const displayH = canvas.height / deviceRatio;\n const elapsed = (timestamp - startTime) / 1000;\n\n // Merge live options on top of base if a getter was provided\n const frameOptions: AsciiOptions = liveOptions\n ? { ...merged, ...liveOptions() }\n : merged;\n\n // Sync hover listeners when hoverStrength changes via liveOptions\n const wantsHover = frameOptions.hoverStrength > 0;\n if (wantsHover) {\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n } else {\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n }\n\n const { frame } = imageToAsciiFrame(video, frameOptions, displayW, displayH);\n\n // Smooth hover interpolation\n if (hoverPos) {\n const dx = hoverPos.x - smoothHover.x;\n const dy = hoverPos.y - smoothHover.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const speed = Math.min(0.25, 0.06 + dist * 0.8);\n smoothHover.x += dx * speed;\n smoothHover.y += dy * speed;\n smoothHover.intensity += (1 - smoothHover.intensity) * 0.12;\n } else {\n smoothHover.intensity *= 0.965;\n if (smoothHover.intensity < 0.003) smoothHover.intensity = 0;\n }\n\n const hoverArg = smoothHover.intensity > 0.003\n ? { x: smoothHover.x, y: smoothHover.y, intensity: smoothHover.intensity }\n : null;\n\n if (mirror) {\n ctx.save();\n ctx.scale(-1, 1);\n ctx.translate(-displayW, 0);\n renderFrameToCanvas(ctx, frame, frameOptions, displayW, displayH, elapsed, hoverArg);\n ctx.restore();\n } else {\n renderFrameToCanvas(ctx, frame, frameOptions, displayW, displayH, elapsed, hoverArg);\n }\n }\n\n animId = requestAnimationFrame(tick);\n };\n\n animId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(animId);\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n stream.getTracks().forEach(t => t.stop());\n video.srcObject = null;\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/fire.ts","../src/backgrounds/dna.ts","../src/backgrounds/terrain.ts","../src/backgrounds/circuit.ts","../src/backgrounds/index.ts","../src/core/ascii-text.ts","../src/core/text-frame.ts","../src/core/record.ts","../src/core/webcam.ts","../src/core/big-text.ts"],"names":["fade","parseGIF","decompressFrames","video","renderW","renderH","cancelled","animId","firstFrame","tick","alpha","_"],"mappings":";AAgBO,IAAM,cAAA,GAAiG;AAAA,EAC5G,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAc,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EAClF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,IAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,UAAA,EAAY,EAAE,IAAA,EAAM,YAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,SAAA,EAAY,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA;AACzE;AA0NO,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,wEAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,mDAAA;AAAA,EACN,OAAA,EAAS,sDAAA;AAAA,EACT,UAAA,EAAY,+JAAA;AAAA,EACZ,GAAA,EAAK,iCAAA;AAAA,EACL,KAAA,EAAO,uCAAA;AAAA,EACP,OAAA,EAAS,6yBAAA;AAAA,EACT,QAAA,EAAU,6UAAA;AAAA,EACV,OAAA,EAAS,6CAAA;AAAA,EACT,KAAA,EAAO,8EAAA;AAAA,EACP,OAAA,EAAW,2CAAA;AAAA,EACX,OAAA,EAAW,iDAAA;AAAA,EACX,SAAA,EAAY,uDAAA;AAAA,EACZ,SAAA,EAAY,uDAAA;AAAA,EACZ,KAAA,EAAY,iFAAA;AAAA,EACZ,KAAA,EAAY,yDAAA;AAAA,EACZ,MAAA,EAAY,2EAAA;AAAA,EACZ,KAAA,EAAY;AACd;AAUO,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,QAAU,CAAC,QAAA,CAAS,WAAW,QAAA,CAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA;AAAA,EAEjE,MAAU,CAAC,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA;AAAA,EAE/D,UAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,UAAA,EAAY,SAAS,QAAQ,CAAA;AAAA;AAAA,EAEjE,SAAU,CAAC,QAAA,CAAS,QAAQ,QAAA,CAAS,SAAA,EAAW,SAAS,MAAM,CAAA;AAAA;AAAA,EAE/D,OAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA;AAAA,EAE3D,OAAU,CAAC,QAAA,CAAS,OAAO,QAAA,CAAS,QAAA,EAAU,SAAS,MAAM,CAAA;AAAA;AAAA,EAE7D,OAAU,CAAC,QAAA,CAAS,SAAS,QAAA,CAAS,OAAA,EAAS,SAAS,KAAK,CAAA;AAAA;AAAA,EAE7D,SAAU,CAAC,QAAA,CAAS,WAAW,QAAA,CAAS,MAAA,EAAQ,SAAS,SAAS;AACpE;AASO,IAAM,iBAAA,GAA6D;AAAA,EACxE,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,UAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,GAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,SAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,SAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,MAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA;AAEjB;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,SAAS,QAAA,CAAS,QAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,SAAA;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY,OAAA;AAAA,EACZ,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,UAAA,EAAY,IAAA;AAAA,EACZ,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,CAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,SAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,IAAA;AAAA,EACX,kBAAA,EAAoB;AACtB;AAKO,IAAM,aAAA,GAAwF;AAAA,EACnG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,EAAG,aAAa,WAAA,EAAa,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GACjG;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACrG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAC/F;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,eAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU;AAEvG;;;ACheO,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAGnD;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAChE,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AACvB;AAIO,SAAS,eAAA,CAAgB,GAAA,EAAa,UAAA,EAAoB,QAAA,EAA0B;AACzF,EAAA,IAAI,QAAA,GAAW,MAAM,UAAA,GAAa,GAAA;AAClC,EAAA,MAAM,SAAU,GAAA,IAAO,QAAA,GAAW,MAAM,GAAA,CAAA,IAAS,GAAA,IAAO,MAAM,QAAA,GAAW,GAAA,CAAA,CAAA;AACzE,EAAA,QAAA,GAAW,MAAA,IAAU,WAAW,GAAA,CAAA,GAAO,GAAA;AACvC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC5C;AAEO,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,EAAiB,MAAA,EAAyB;AACrF,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AACzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAC7D;AAEO,SAAS,iBACd,GAAA,EAAa,IAAA,EAAc,CAAA,EAAW,CAAA,EAAW,MAAc,MAAA,EACvD;AACR,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,IAAI,UAAA,GAAa,MAAM,OAAO,GAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,CAAA;AACtB,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,GAAO,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM,CAAA;AACjC;AAIA,IAAM,SAAA,GAAY;AAAA,EAChB,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAE,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACZ,CAAE,CAAA,EAAE,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC;AACd,CAAA;AAEO,SAAS,WAAA,CAAY,GAAA,EAAa,CAAA,EAAW,CAAA,EAAW,QAAA,EAA0B;AACvF,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,GAAA;AAC1B,EAAA,MAAM,SAAA,GAAA,CAAa,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,EAAA,GAAK,GAAA,IAAO,QAAA,GAAW,GAAA;AACpE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,GAAA,GAAM,SAAS,CAAC,CAAA;AACnD;AAIO,IAAM,QAAA,GAAqB,IAAI,KAAA,CAAM,GAAG,CAAA;AACxC,IAAM,SAAA,GAAsB,IAAI,KAAA,CAAM,GAAG,CAAA;AAChD,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,EAAA,QAAA,CAAS,EAAE,CAAA,GAAK,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,EAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA,MAAA,EAAS,EAAE,CAAA,GAAA,CAAA;AAC7B;AAIO,SAAS,gBACd,IAAA,EAAiB,SAAA,EAAmB,KAAa,GAAA,EAAa,GAAA,EAC9D,cAAc,KAAA,EACN;AACR,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA,IACzE,KAAK,QAAA,EAAU;AAMb,MAAA,OAAO,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,IACjC;AAAA,IACA,SAAS;AAKP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,OAAO,SAAS,IAAI,CAAA;AAAA,IACtB;AAAA;AAEJ;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACnB,SAAS,gBACd,IAAA,EAAiB,SAAA,EAAmB,KAAa,GAAA,EAAa,GAAA,EAC9D,cAAc,KAAA,EACJ;AACV,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAClE,MAAA;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAI,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AAEb,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AAAK,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AAAK,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AACvD,MAAA;AAAA,IACF;AAAA,IACA,SAAS;AAEP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACzD,MAAA;AAAA,IACF;AAAA;AAEF,EAAA,OAAO,SAAA;AACT;AAkCO,SAAS,oBACd,KAAA,EACqC;AACrC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,MAAM,IAAI,GAAA,CAAI,YAAA,CAAa,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA;AACvC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACrC;;;ACtKO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC1B;AAEO,SAAS,uBACd,CAAA,EACA,CAAA,EACA,MACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,CAAA;AAE7B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACjE,MAAA,OAAO,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,GAAA,CAAA;AAAA,IAC3C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,OAAO,CAAA,GAAA,CAAK,CAAA,GAAI,OAAO,CAAC,CAAA;AACpD,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACpE,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA;AAAA,IACrB;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxE,MAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC1D,MAAA,OAAO,GAAA,GAAM,MAAM,IAAA,GAAOA,KAAAA;AAAA,IAC5B;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAA,CAAK,IAAI,CAAA,IAAK,GAAA,GAAM,CAAC,CAAA,GAAI,GAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AAChF,MAAA,MAAM,OAAA,GAAW,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,OAAO,OAAA,GAAU,GAAA,GAAM,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,GAAA;AAAA,IAC9C;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,OAAO,IAAA,CAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,KAAK,CAAA,GAAI,UAAA;AACxE,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpD,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,IAAI,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,OAAO,OAAA,GAAU,MAAM,CAAA,GAAI,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAClF,MAAA,OAAO,OAAO,IAAA,GAAO,MAAA;AAAA,IACvB;AAAA,IACA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,GAAO,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAa,IAAI,GAAA,GAAO,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,WAAW,UAAA,GAAa,GAAA;AAC5C,MAAA,MAAM,OAAO,SAAA,GAAY,WAAA;AACzB,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,MAAA,MAAMA,QAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,IAAQ,aAAa,IAAA,CAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAI,CAAA;AAAA,IACzB;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChF,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,aAAa,CAAC,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,KAAA,GAAQ,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,WAAA;AAEH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC7C,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAK,KAAA,GAAQ,QAAA,GAAY,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC3E,MAAA,MAAM,WAAW,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,IAAS,WAAW,GAAA,CAAI,CAAA;AACzD,MAAA,OAAO,GAAA,GAAM,GAAA,GAAM,MAAA,IAAU,GAAA,GAAM,QAAA,GAAW,GAAA,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,MAAA,EAAQ;AAEX,MAAA,MAAM,QAAA,GAAY,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA;AACnC,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,QAAA,GAAW,IAAI,GAAA,GAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAC7D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAI,CAAA,GAAI,IAAA,GAAO,GAAI,CAAA,GAAI,GAAA;AAChD,MAAA,OAAO,IAAA,GAAO,IAAA,IAAQ,IAAA,IAAQ,CAAA,GAAI,OAAA,GAAU,GAAA,CAAA,CAAA;AAAA,IAC9C;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AAClC,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACjF,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,QAAQ,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAClE,MAAA,OAAO,MAAM,GAAA,GAAM,KAAA;AAAA,IACrB;AAAA,IACA,KAAK,UAAA,EAAY;AAEf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,KAAuB;AAChD,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,QAAQ,EAAA,GAAK,KAAA,GAAQ,IAAA,GAAO,UAAU,CAAA,GAAI,UAAA;AAClE,QAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AAAA,MACxC,CAAA;AACA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,MAAM,aACJ,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAChC,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,GAChC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GACxC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,IAAA,KAAS,CAAA,GACtB,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA,GAC3C,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA;AAC5B,MAAA,OAAO,SAAA,KAAc,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/B;AAAA,IACA;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAE;AAEvF,SAAS,kBAAA,CACd,EAAA,EACA,EAAA,EACA,MAAA,EACA,QACA,cAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,GAAsB,WAAA,EACtB,YAAA,GAAuB,GAAA,EACvB,QAAoB,QAAA,EACC;AACrB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAEhB,EAAA,MAAM,MAAA,GAAU,IAAA,GAAO,YAAA,GAAe,IAAA,GAAQ,QAAA,GAAW,IAAA;AAGzD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,UAAU,KAAA,EAAO;AAEnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC5B,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ,CAAA,MAAO;AAEL,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClC,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,YAAA,CAAa,KAAA,GAAQ,CAAA;AACrB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,IAAA,GAAO,CAAA;AACpB,IAAA,YAAA,CAAa,UAAA,GAAa,CAAA;AAC1B,IAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,OAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,GAAI,cAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA,EAAa;AAChB,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AAC7C,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,KAAA,GAAQ,QAAQ,QAAA,GAAW,IAAA;AACxC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,CAAA;AAExC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,GAAO,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AACjD,MAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,QAAA,GAAW,GAAA,IAAO,MAAM,MAAA,GAAS,GAAA,CAAA;AACzD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,KAAA,GAAQ,WAAW,GAAG,CAAA;AAChD,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,IAAA;AAC/B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,YAAA,EAAc;AAGjB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,YAAA,CAAa,KAAA,GAAQ,KAAA;AACrB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AACpB,EAAA,YAAA,CAAa,UAAA,GAAa,UAAA;AAC1B,EAAA,YAAA,CAAa,SAAA,GAAY,KAAA;AACzB,EAAA,OAAO,YAAA;AACT;;;ACnRO,SAAS,WAAW,CAAA,EAAuD;AAChF,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,KAAK,CAAA,EAAmB;AAAE,EAAA,OAAO,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAI,EAAA,CAAA,GAAM,EAAA,CAAA;AAAK;AAC/E,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAG;AAGjF,SAAS,KAAA,CAAM,IAAY,EAAA,EAAoB;AACpD,EAAA,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AACxB,EAAA,CAAA,GAAM,KAAK,EAAA,GAAM,CAAA;AACjB,EAAA,OAAA,CAAS,KAAK,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAA,GAAU,aAAc,UAAA,IAAc,UAAA;AACtE;AAGO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA;AAC5B,EAAA,MAAM,KAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,GAAK,KAAK,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAA,GAAK,CAAC,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAChC,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA;AACxD;AAGO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,OAAA,CACE,OAAO,CAAA,EAAS,CAAO,IAAI,GAAA,GAC3B,MAAA,CAAO,IAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA,GAAI,OAC3B,MAAA,CAAO,CAAA,GAAI,KAAK,CAAA,GAAI,GAAG,IAAI,KAAA,IACzB,KAAA;AACN;;;AChBO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,UAAA,GAAkB,IAAA;AAAA,IAClB,eAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,YAAA;AAAA,IAClB,SAAA,GAAkB,IAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,cAAA,GAAkB,IAAA;AAAA,IAClB,YAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,MAAA,GAAkB,IAAA;AAAA,IAClB,QAAA,GAAkB,IAAA;AAAA,IAClB,OAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,UAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,eAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AACpB,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AAEpB,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,CAAA;AAEvE,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,aAAa,CAAA,GAAI,IAAA;AACvB,MAAA,MAAM,SAAA,GAAa,GAAA,CAAI,GAAA,GAAM,UAAA,GAAa,UAAA,EAAY,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAEzG,MAAA,MAAM,SAAA,GAAY,IAAA;AAClB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,GAAA,GAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAE7E,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,GAAO,SAAA,GAAY,IAAA,GAAO,YAAY,GAAA,GAAO,UAAA;AAEzE,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAK,CAAA;AACvD,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,IAAU,UAAU,IAAA,EAAM;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,GAAA,GAAM,UAAU,EAAE,CAAA;AACzD,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,IAAI,CAAA;AAC9C,QAAA,UAAA,GAAa,KAAA,GAAQ,UAAU,OAAA,GAAU,IAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,YAAY,CAAA;AACxD,MAAA,MAAM,SAAA,GACJ,YAAY,CAAA,GAAI,cAAA,CAAA,GAAA,CACf,YAAY,UAAA,GAAa,GAAA,IAAO,iBAC/B,UAAA,GAAa,IAAA;AACjB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAElD,MAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,MAAA,IAAI,QAAA,IAAY,UAAU,IAAA,EAAM;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,GAAM,CAAA,GAAI,SAAS,CAAA,EAAG,GAAA,GAAM,KAAK,MAAM,CAAA;AACjE,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAA,CAAW,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,KAAM,GAAA,EAAK;AAE5B,MAAA,MAAM,KAAA,GAAQ,QAAQ,cAAA,GAAiB,IAAA;AACvC,MAAA,MAAM,WAAW,cAAA,GAAiB,eAAA;AAElC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,SAAA,GAAY,MAAO,IAAA,EAAM,KAAA,IAAS,SAAA,GAAY,EAAA,GAAK,GAAA,CAAI,CAAA;AACpF,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,MAC1D,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,YAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxD,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,SAAA,GAAY,oBAAoB,KAAK,CAAA,CAAA,CAAA;AAAA,MAC3C;AAEA,MAAA,GAAA,CAAI,SAAS,KAAA,CAAM,OAAO,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AACF;;;AC5HA,SAAS,UAAA,GAAsB;AAC7B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,KAAK,QAAA,CAAS,eAAA;AACpB,IAAA,MAAM,MAAM,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA,IAAK,IAAI,WAAA,EAAY;AAC7D,IAAA,IAAI,EAAA,KAAO,QAAQ,OAAO,IAAA;AAC1B,IAAA,IAAI,EAAA,KAAO,SAAS,OAAO,KAAA;AAC3B,IAAA,IAAI,EAAA,CAAG,SAAA,CAAU,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAAA,EAC5C;AACA,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IACpB,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACzD;AAGA,SAAS,cAAc,MAAA,EAAmC;AACxD,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA;AAC9B,EAAA,OAAO,CAAC,UAAA,EAAW;AACrB;AAMA,SAAS,cAAc,GAAA,EAA4B;AACjD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,uBAAuB,CAAA;AAClD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAA,GAAI,SAAS,CAAC,CAAA;AAClB,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA,GAAE,EAAE,CAAC,CAAA;AACpD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,4CAA4C,CAAA;AACvE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAC1C,GAAA,CAAI,OAAK,QAAA,CAAS,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAClD,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,iBAAiB,WAAA,EAAyC;AACjE,EAAA,MAAM,IAAI,WAAA,IAAe,MAAA;AACzB,EAAA,IAAI,MAAM,MAAA,EAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AAE1C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA;AAC3D,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,YAAY,iBAAA,EAAmB,WAAA,EAAa,eAAe,CAAA,EAAG;AACpH,MAAA,MAAM,MAAM,aAAA,CAAc,SAAA,CAAU,iBAAiB,IAAI,CAAA,CAAE,MAAM,CAAA;AACjE,MAAA,IAAI,KAAK,OAAO,GAAA;AAAA,IAClB;AACA,IAAA,MAAM,SAAS,aAAA,CAAe,gBAAA,CAAiB,SAAS,IAAI,CAAA,CAAqD,eAAe,EAAE,CAAA;AAClI,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAEA,EAAA,OAAO,UAAA,KAAe,QAAA,GAAW,QAAA;AACnC;AAKO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACmD;AACnD,EAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,aAAa,MAAA,CAAO,KAAA;AACjF,EAAA,MAAM,SAAA,GAAY,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,cAAc,MAAA,CAAO,MAAA;AAEnF,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,WAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,UAAA,GAAa,OAAA,CAAQ,WAAA;AAEtD,EAAA,MAAM,UAAU,WAAA,IAAe,QAAA;AAC/B,EAAA,MAAM,UAAU,YAAA,IAAgB,SAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AAEvC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAQA,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAI,CAAC,CAAC,CAAA;AACxF,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAC,CAAC,CAAA;AACzF,EAAA,MAAM,UAAU,IAAA,GAAO,GAAA;AACvB,EAAA,MAAM,UAAU,IAAA,GAAO,GAAA;AAEvB,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,qBAAA,CAAsB,SAAS,OAAO,CAAA;AACtD,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,SAAS,OAAO,CAAA;AACzD,EAAA,MAAM,SAAS,SAAA,CAAU,IAAA;AAMzB,EAAA,MAAM,KAAK,OAAA,CAAQ,SAAA;AACnB,EAAA,MAAM,SAAA,GAAY,EAAA,IAAM,IAAA,IAAQ,EAAA,KAAO,KAAA;AACvC,EAAA,MAAM,mBAAmB,EAAA,KAAO,IAAA;AAChC,EAAA,MAAM,kBAAmB,EAAA,KAAO,aAAA;AAChC,EAAA,IAAI,KAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,SAAA,IAAa,CAAC,gBAAA,IAAoB,CAAC,eAAA,EAAiB;AACtD,IAAA,KAAA,GAAQ,oBAAoB,EAAkD,CAAA;AAC9E,IAAA,OAAA,GAAA,CAAW,OAAA,CAAQ,sBAAsB,EAAA,KAAO,CAAA;AAAA,EAClD;AAMA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,SAAA,GAAY,GAAA;AAChB,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,IAAI,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACnB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AAEzC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC3D,QAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,QACjD,WAAW,eAAA,EAAiB;AAC1B,UAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,QACjD,CAAA,MAAA,IAAW,UAAU,IAAA,EAAM;AACzB,UAAA,MAAM,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA;AAC5D,UAAA,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,IAAM,OAAA;AAAA,QACzC;AACA,QAAA,IAAI,KAAA,EAAO;AAAA,MACb;AACA,MAAA,MAAM,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAC,CAAA;AAC1E,MAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACjB,MAAA,IAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAAA,IACnB;AACA,IAAA,OAAA,GAAU,EAAA;AACV,IAAA,SAAA,GAAY,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,EAClC;AAEA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAM9C,EAAA,MAAM,gBAAA,GAAmB,SAAA,GACrB,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,CAAA,IAAK,OAAA,CAAQ,OAAA,GAC7C,OAAA,CAAQ,OAAA;AAEZ,EAAA,MAAM,UAAU,GAAA,GAAM,GAAA;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAE7B,MAAA,IAAI,OAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACzC,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,QAAA,MAAM,MAAA,GAAA,CAAU,CAAA,GAAI,GAAA,GAAM,EAAA,IAAM,OAAA;AAChC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,UAAA,MAAM,CAAA,GAAA,CAAK,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA,IAAM,CAAA;AACpC,UAAA,MAAM,KAAK,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,CAAA,GAAI,CAAC,GAAG,EAAA,GAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAG/E,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,YAAA,IAAI,gBAAA,EAAkB;AACpB,cAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,YACjD,WAAW,eAAA,EAAiB;AAC1B,cAAA,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA;AAAA,YACjD,CAAA,MAAA,IAAW,UAAU,IAAA,EAAM;AACzB,cAAA,MAAM,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,KAAA,CAAM,CAAA;AAC5D,cAAA,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,IAAM,OAAA;AAAA,YACzC;AACA,YAAA,IAAI,KAAA,EAAO;AAAE,cAAA,UAAA,EAAA;AAAc,cAAA;AAAA,YAAU;AAAA,UACvC;AAEA,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAI,UAAA,IAAA,IAAQ,EAAA;AAAA,QAC9C;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,IAAa,UAAA,GAAa,OAAA,GAAU,CAAA,EAAG;AACzC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,OAAA,GAAU,UAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,QAAA,GAAW,CAAA;AAE3C,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC/C,MAAA,MAAM,MAAM,OAAA,CAAQ,SAAA,GAAA,CACd,MAAA,GAAS,OAAA,IAAW,YAAa,GAAA,GACnC,MAAA;AACJ,MAAA,MAAM,cAAc,eAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC7E,MAAA,MAAM,cAAc,WAAA,CAAY,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,QAAQ,cAAc,CAAA;AACzE,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,UAAA,GACjB,gBAAA,CAAiB,aAAa,OAAA,CAAQ,UAAA,EAAY,CAAA,EAAG,CAAA,EAAG,MAAM,SAAS,CAAA,GACvE,eAAA,CAAgB,WAAA,EAAa,kBAAkB,SAAS,CAAA;AAE5D,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,WAAA,EAAa,CAAA;AAAA,IACjD;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAC7B;AAKA,eAAsB,kBAAA,CACpB,KAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACA,SAAA,GAAoB,EAAA,EACpB,WAAA,GAAsB,EAAA,EACtB,UAAA,EACA,SAAA,GAAoB,CAAA,EACwD;AAC5E,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,GAAW,WAAW,WAAW,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,SAAS,CAAA;AAClD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,YAAa,CAAA,GAAI,SAAA;AAC9B,IAAA,IAAI,IAAA,GAAO,YAAY,QAAA,EAAU;AAEjC,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAC3C,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,aAAa,YAAY,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAC9C;AAKA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACA,cACA,UAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAMC,kBAAS,MAAM,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAYC,yBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AAE5C,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,QAAQ,EAAC,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAA,EAAG;AAAA,EACjD;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,MAAA,IAAU,IAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AAAE,IAAA,UAAA,IAAe,EAAE,KAAA,IAAS,GAAA;AAAA,EAAM;AAC7D,EAAA,MAAM,QAAA,GAAW,aAAa,SAAA,CAAU,MAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,QAAQ,CAAC,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,GAAG,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAa,GAAI,CAAA;AAEtC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,SAAA,CAAU,IAAI,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACjG,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AACxB,IAAA,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAA,EAAgB,CAAA,EAAG,CAAC,CAAA;AAEzC,IAAA,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,UAAA,EAAY,OAAA,EAAS,aAAa,YAAY,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,iBAAiB,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AACnC;AAMO,SAAS,mBAAA,CACd,KACA,KAAA,EACA,OAAA,EACA,aACA,YAAA,EACA,IAAA,GAAe,GACf,QAAA,EACA;AAEA,EAAA,IAAI,OAAA,CAAQ,mBAAmB,WAAA,EAAa;AAC1C,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACjF,IAAA,MAAM,UAAU,OAAA,CAAQ,WAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA,GAAI,QAAA;AAC9E,IAAA,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW;AAAA,MACpE,WAAA,EAAa,IAAI,OAAO,CAAA,CAAA;AAAA,MACxB,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,OAAA,CAAQ,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAA,CAAQ,aAAA,GAAgB,GAAG,CAAA,GAAI,IAAA;AAAA,MAC7F,YAAA,EAAc,GAAA;AAAA,MACd,OAAO,OAAA,CAAQ,cAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,aAAA,GAAgB,CAAA;AAAA,MAChC,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,SAAS,CAAA,EAAG;AAChB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAEtB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAE7C,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,KAAA;AACA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA;AACzB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,QAAA,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK;AAAE,UAAA,eAAA,GAAkB,IAAA;AAAM,UAAA,MAAM,KAAA;AAAA,QAAO;AAAA,MACnE;AAAA,IACF;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AAIpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,EAAW,GAAI,SAAA,GAAY,SAAA;AAC3C,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,QAAQ,WAAA,GAAc,IAAA;AAC5B,EAAA,MAAM,QAAQ,YAAA,GAAe,IAAA;AAC7B,EAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAE1B,EAAA,MAAM,cAAA,GAAiB,UAAU,SAAA,IAAa,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,QAAQ,cAAA,KAAmB,MAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,UAAA,GAAa,GAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,aAAA,IAAiB,CAAC,EAAE,QAAA,IAAY,OAAA,CAAQ,aAAA,GAAgB,CAAA,IAAK,cAAA,GAAiB,IAAA,CAAA;AAEnG,EAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAEnD,EAAA,MAAM,WAAA,GAAc,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GACtB,CAAA;AACpB,EAAA,MAAM,oBAAA,GAAuB,QAAQ,WAAA,GAAc,WAAA;AAEnD,EAAA,IAAI,cAAc,CAAA,EAAG,WAAA,GAAc,IAAA,EAAM,WAAA,GAAc,GAAG,WAAA,GAAc,IAAA;AACxE,EAAA,IAAI,SAAA,GAAY,GAAG,SAAA,GAAY,CAAA;AAC/B,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,MAAM,eAAA,GAAmB,IAAA,GAAO,oBAAA,GAAuB,IAAA,GAAQ,QAAQ,aAAA,GAAgB,IAAA;AACvF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAChF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,cAAc,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,QAAA;AACzC,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AACzB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AACpB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AAEpB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAQ;AACjC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,YAAA;AAEzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AAEjB,QAAA,MAAM,GAAA,GAAA,CAAO,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,aAAA;AACjE,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,GAAA;AACzC,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAEvE,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa,iBAAA;AAAA,YAAmB;AAAA,WAC/D;AACA,UAAA,QAAA,GAAW,EAAA,CAAG,KAAA;AACd,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,OAAA,GAAU,QAAA;AACjD,QAAA,IAAI,SAAS,GAAA,EAAK;AAElB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,WAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AACtE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAE9E,QAAA,IAAI,UAAU,SAAA,EAAW;AAAE,UAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,UAAA,SAAA,GAAY,KAAA;AAAA,QAAO;AACvE,QAAA,IAAI,UAAU,aAAA,EAAe;AAAE,UAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,UAAA,aAAA,GAAgB,KAAA;AAAA,QAAO;AAE7E,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,SAAS,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,GAAG,MAAM,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,UAAA,EAAY,KAAK,CAAA,GAAI,GAAA;AACvD,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAE/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,KAAa,OAAA;AACrC,MAAA,GAAA,CAAI,OAAO,OAAA,GACP,CAAA,EAAG,QAAQ,CAAA,2FAAA,CAAA,GACX,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACf,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAA,IACrB;AAEA,IAAA,IAAI,WAAA,GAA6C,IAAA;AAEjD,IAAA,MAAM,UAAU,OAAA,CAAQ,aAAA;AACxB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAC,OAAA,EAAS,MAAA;AAC1B,IAAA,MAAM,aAAa,MAAA,GACf,OAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,IAAK,QAAQ,UAAA,IAAc,CAAA,CAAE,IAAI,OAAA,CAAS,MAAM,IACpF,OAAA,CAAQ,OAAA;AAEZ,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,UAAU,CAAA;AAC9B,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,GAAc,GAAA,CAAI,cAAa,GAAI,IAAA;AAO1D,IAAA,MAAM,YAAA,GAAe,gBAAgB,YAAA,IAAgB,WAAA;AACrD,IAAA,MAAM,YAAA,GAAe,gCAAA;AACrB,IAAA,MAAM,YAAY,YAAA,CAAa,MAAA;AAC/B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,IAAa,SAAA;AACrC,MAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAA;AACzC,MAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAA;AAGzC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9C,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,KAAA,CAAM,KAAK,SAAS,CAAA;AAC5C,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAC,CAAA;AACzE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAC,CAAA;AACzE,QAAA,MAAM,GAAA,GAAA,CAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA;AACjF,QAAA,MAAA,GAAS,MAAM,GAAG,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,OAAA,IAAW,SAAA;AAAA,MACtB;AACA,MAAA,SAAA,GAAY,MAAA,CAAO,MAAA;AAGnB,MAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,oBAAA,GAAuB,GAAG,CAAC,CAAC,CAAA;AACtF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA;AAC5C,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,QAAQ,CAAA;AAC/C,MAAA,IAAI,UAAA,GAAa,eAAe,IAAA,EAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,YAAY,CAAA;AAGlF,MAAA,UAAA,GAAa,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AACjB,QAAA,IAAI,QAAA,GAAW,MAAA,IAAU,IAAA,CAAK,GAAA,IAAO,IAAA,GACjC,eAAA,CAAgB,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,UAAU,CAAA,GAChD,IAAA,CAAK,IAAA;AACT,QAAA,IAAI,aAAa,GAAA,EAAK;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AACvE,QAAA,IAAI,UAAU,IAAA,EAAM;AAEpB,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,CAAC,YAAA,IAAgB,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,WAAA,IAAe,CAAA,IAAK,WAAA,EAAa;AAChH,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa,iBAAA;AAAA,YAAmB;AAAA,WAC/D;AACA,UAAA,UAAA,GAAa,EAAA,CAAG,KAAA;AAChB,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAMA,QAAA,IAAI,YAAA,IAAgB,CAAA,IAAK,UAAA,IAAc,CAAA,GAAI,aAAa,YAAA,EAAc;AACpE,UAAA,MAAM,UAAU,CAAA,GAAI,UAAA;AACpB,UAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,GAAU,SAAA,EAAW;AACvC,YAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AAGjC,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,GAAG,CAAA;AAC1E,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,GAAI,WAAW,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AACjE,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACtC,YAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAG3D,YAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAE,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AACjF,YAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAEtC,YAAA,IAAI,MAAM,WAAA,EAAa;AAErB,cAAA,QAAA,GAAW,UAAA;AAAA,YACb,CAAA,MAAO;AAEL,cAAA,QAAA,GAAW,YAAA,CAAa,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA,GAAI,SAAS,CAAA;AAAA,YAClE;AACA,YAAA,SAAA,GAAY,MAAM,WAAA,GAAc,GAAA;AAChC,YAAA,UAAA,GAAa,MAAM,WAAA,GAAc,IAAA;AAAA,UACnC;AAAA,QACF;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,WAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AACtE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,gBAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,QACpE;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,MAAA,GAAS,WAAA,CAAa,QAAQ,CAAA,IAAK,GAAA;AACzC,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,IAAA,CAAK,IAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA,GAAI,MAAA;AACrF,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI,aAAa,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAAU,YAAA,SAAA,GAAY,QAAA;AAAA,UAAU;AAChF,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,GAAA,CAAI,QAAA,CAAS,KAAK,EAAA,GAAK,GAAA,EAAK,KAAK,EAAA,GAAK,GAAA,EAAK,IAAI,EAAE,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAC9E,UAAA,IAAI,UAAU,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,YAAA,SAAA,GAAY,KAAA;AAAA,UAAO;AACvE,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AACpB,YAAA,GAAA,CAAI,KAAA,CAAM,YAAY,UAAU,CAAA;AAChC,YAAA,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU,CAAA,EAAG,CAAC,CAAA;AAC3B,YAAA,GAAA,CAAI,aAAa,aAAc,CAAA;AAAA,UACjC,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU,EAAA,EAAI,EAAE,CAAA;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACtpBA,SAAS,cAAc,EAAA,EAAuF;AAC5G,EAAA,IAAI,EAAA,YAAc,kBAAkB,OAAO,EAAE,GAAG,EAAA,CAAG,UAAA,EAAY,CAAA,EAAG,EAAA,CAAG,WAAA,EAAY;AACjF,EAAA,IAAI,EAAA,YAAc,gBAAA,EAAkB,OAAO,EAAE,CAAA,EAAG,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,KAAA,EAAO,CAAA,EAAG,EAAA,CAAG,aAAA,IAAiB,GAAG,MAAA,EAAO;AAC9G,EAAA,OAAO,EAAE,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,CAAA,EAAG,GAAG,MAAA,EAAO;AACrC;AAUA,SAAS,iBAAA,CAAkB,MAAc,IAAA,EAAoD;AAC3F,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAC,CAAA;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,CAAA,EAAE;AAChF;AAgBA,SAAS,qBAAA,CACP,MAAA,EACA,SAAA,EACA,MAAA,EACA,MACA,IAAA,EACmD;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAU,qBAAA,EAAsB;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAG/D,EAAA,IAAI,IAAA,GAAO,KAAA,EAAO,IAAA,GAAO,IAAA,GAAO,MAAA;AAChC,EAAA,IAAI,OAAO,MAAA,EAAQ;AAAE,IAAA,IAAA,GAAO,MAAA;AAAQ,IAAA,IAAA,GAAO,IAAA,GAAO,MAAA;AAAA,EAAQ;AAC1D,EAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACtB,EAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAItB,EAAA,IAAI,OAAA,EAAiB,OAAA;AACrB,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,CAAC,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAGA,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AAEJ,EAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,CAAM,QAAS,IAAA,GAAO,IAAA;AAC7B,EAAA,MAAA,CAAO,KAAA,CAAM,SAAS,IAAA,GAAO,IAAA;AAE7B,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,SAAA,EAAU;AAC5C;AAoBA,eAAsB,OAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EAC5C;AAC9B,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC3B,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,GAAA,GAAM,MAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,GAAA;AAAA,EACP,CAAA,MAAA,IAAW,MAAA,YAAkB,gBAAA,IAAoB,CAAC,OAAO,QAAA,EAAU;AACjE,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,MAAA;AAAA,EACP,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,MAAA;AAAA,EACP;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,MAAA,EAAQ,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAErG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAGhE,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,cAAc,EAAE,CAAA;AAC7C,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAGzD,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,OAAA,IAAW,MAAA,CAAO,SAAS,OAAA,EAAS;AACrD,IAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,EAAA,EAAI,MAAA,EAAQ,SAAS,OAAO,CAAA;AAIhE,EAAA,IAAI,MAAA,CAAO,gBAAgB,CAAA,EAAG;AAC5B,IAAA,IAAI,QAAA,GAA4C,IAAA;AAChD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,QAAA,GAAW;AAAA,QACT,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,QAClC,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,OACnC;AAAA,IACF,CAAA;AACA,IAAA,MAAM,eAAe,MAAM;AAAE,MAAA,QAAA,GAAW,IAAA;AAAA,IAAM,CAAA;AAE9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc;AAC1B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,MAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAA,EAAS,CAAA,GAAI,KAAM,QAAQ,CAAA;AAC5E,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAAA,IACpC,CAAA;AACA,IAAA,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AAElC,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,IACvD,CAAA;AAAA,EACF;AAGA,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,EAAA,mBAAA,CAAoB,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACxD,EAAA,GAAA,CAAI,OAAA,EAAQ;AACd;AAUA,eAAsB,UAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACrD;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAW,QAAA,GAC7B,MAAM,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,GAC7C,MAAA;AAEJ,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,iBAAA,CAAkB,QAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAC1H,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE1F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;AA4BA,eAAsB,aACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,EAAU,QAAA,GAAW,WAAW,OAAA,GAAU,EAAC,EAAG,KAAA,EAAO,aAAa,KAAA,EAAO,IAAA,EAAM,SAAS,OAAA,EAAQ,GAAyB,EAAC,EACvG;AACrB,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,IAAS,CAAA;AACjC,EAAA,MAAM,UAAY,IAAA,EAAM,GAAA;AACxB,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,OAAA,CAAQ,QAAA,IAAY,EAAA;AACzD,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,iBAAA,CAAkB,QAAQ,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAU,gBAAA,EAAiB;AAC1H,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAE/E,EAAA,MAAM,SAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GAAW,QAAA,CAAS,cAA2B,KAAK,CAAA,GACrE,KAAA,YAAiB,WAAA,GAAc,KAAA,GAAQ,IAAA;AAGzC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAIC,MAAAA;AACJ,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAAA,MAAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACtC,MAAAA,OAAM,WAAA,GAAc,WAAA;AACpB,MAAAA,OAAM,GAAA,GAAM,MAAA;AACZ,MAAA,IAAIA,MAAAA,CAAM,aAAa,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,UAAAA,MAAAA,CAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AACnC,UAAAA,MAAAA,CAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,QACpF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,MAAAA,GAAQ,MAAA;AAAA,IACV;AAEA,IAAA,IAAI,SAAA,EAAW,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAWA,MAAAA,CAAM,UAAA,GAAaA,MAAAA,CAAM,WAAA,EAAaA,MAAAA,CAAM,UAAA,EAAYA,MAAAA,CAAM,WAAW,CAAA;AAGjI,IAAA,MAAM,EAAE,OAAA,EAAAC,QAAAA,EAAS,OAAA,EAAAC,QAAAA,KAAY,iBAAA,CAAkBF,MAAAA,CAAM,UAAA,EAAYA,MAAAA,CAAM,WAAW,CAAA;AAGlF,IAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,SAAA,GAAaC,QAAAA,GAAU,GAAA,GAAMC,QAAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAUD,QAAAA,GAAUC,QAAAA,CAAQ,CAAA,GACtC,GAAA;AAGJ,IAAA,IAAI,OAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAMD,QAAAA,GAAU,SAAS,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAMA,QAAAA,GAAU,SAAS,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAMC,QAAAA,GAAU,SAAS,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,KAAY,MAAA,GAAY,OAAA,GAAU,SAAA,GAAY,EAAA;AAC7D,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,kBAAA,CAAmBF,MAAAA,EAAO,MAAA,EAAQC,QAAAA,EAASC,QAAAA,EAAS,MAAA,EAAW,MAAA,EAAQ,QAAW,SAAS,CAAA;AACzH,IAAA,IAAIC,aAAY,KAAA,EAAOC,OAAAA,EAAgB,IAAI,CAAA,EAAG,IAAA,GAAO,YAAY,GAAA,EAAI;AACrE,IAAA,IAAIC,WAAAA,GAAa,IAAA;AACjB,IAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AACxB,IAAA,MAAMC,KAAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,MAAA,IAAIH,UAAAA,EAAW;AACf,MAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AACjD,QAAA,mBAAA,CAAoB,KAAK,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,EAAQF,UAASC,QAAO,CAAA;AAC5D,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,IAAIG,WAAAA,EAAY;AAAE,UAAAA,WAAAA,GAAa,KAAA;AAAO,UAAA,OAAA,GAAUL,MAAK,CAAA;AAAA,QAAG;AACxD,QAAA,OAAA,IAAU;AAAA,MACZ;AACA,MAAAI,OAAAA,GAAS,sBAAsBE,KAAI,CAAA;AAAA,IACrC,CAAA;AACA,IAAAF,OAAAA,GAAS,sBAAsBE,KAAI,CAAA;AACnC,IAAA,OAAO,MAAM;AAAE,MAAAH,UAAAA,GAAY,IAAA;AAAM,MAAA,oBAAA,CAAqBC,OAAM,CAAA;AAAA,IAAG,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAE9B,IAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AACZ,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,KAAA,CAAM,YAAA,CAAa,eAAe,EAAE,CAAA;AACpC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACzB,QAAA,EAAU,OAAA;AAAA,MAAS,GAAA,EAAK,GAAA;AAAA,MAAK,IAAA,EAAM,GAAA;AAAA,MACnC,KAAA,EAAO,KAAA;AAAA,MAAO,MAAA,EAAQ,KAAA;AAAA,MACtB,OAAA,EAAS,GAAA;AAAA,MAAK,aAAA,EAAe,MAAA;AAAA,MAAQ,MAAA,EAAQ;AAAA,KAC9C,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,OAAA,EAAQ;AACvC,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,8BAAA,EAAiC,MAAM,GAAG,CAAC,CAAA;AAAA,IACpF,CAAC,CAAA;AACD,IAAA,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,IAAI,MAAM,MAAA,EAAQ,MAAM,MAAM,IAAA,EAAK,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AACpB,IAAA,MAAM,IAAI,QAAc,CAAA,OAAA,KAAW;AACjC,MAAA,MAAM,IAAI,MAAM;AAAE,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAA;AACrE,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAIA,EAAA,IAAI,iBAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,SAAA,GAAY,CAAA,IAAK,OAAA,KAAY,MAAA,EAAW;AAC1C,IAAA,iBAAA,GAAoB,MAAM;AACxB,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,WAAA,IAAe,OAAA,EAAS;AAAE,QAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,MAAW,CAAA,MAAA,IACnF,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,cAAc,SAAA,EAAY;AAAE,QAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,MAAW;AAAA,IAC7F,CAAA;AACA,IAAA,KAAA,CAAM,gBAAA,CAAiB,cAAc,iBAAiB,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,EAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,EAAE,SAAS,OAAA,EAAQ,GAAI,kBAAkB,KAAA,CAAM,UAAA,EAAY,MAAM,WAAW,CAAA;AAElF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA;AACxC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,UAAA,EAAY,EAAA,GAAK,KAAA,CAAM,WAAA;AACxC,IAAA,MAAM,SAAS,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAI,EAAE,CAAA;AAEtE,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,GAAG,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAE9D,IAAA,EAAA,GAAK,IAAI,eAAe,MAAM;AAC5B,MAAA,MAAM,IAAI,qBAAA,CAAsB,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAI,EAAE,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACnC,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,GAAA,EAAK,GAAG,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAAA,IACtD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AAAA,EACtB,CAAA,MAAO;AAEL,IAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAO,oBAAoB,CAAA,GAAK,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,SAAA,GAAa,OAAA,GAAU,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,MAAA,GAC/C,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,OAAA,GAAU,OAAA,CAAQ,CAAA,GACtC,GAAA;AACJ,IAAA,IAAI,OAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAAA,IAChD;AACA,IAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,GAAG,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,IAAK,MAAA,CAAO,UAAU,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAEvE,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,WAAA,GAAc,SAAA,EAAW;AACpD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,WAAA,IAAe,OAAA,EAAS;AAE3D,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAO,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,GAAG,IAAI,CAAA;AACjE,MAAA,IAAI,UAAA,EAAY;AAAE,QAAA,UAAA,GAAa,KAAA;AAAO,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA,MAAG;AACxD,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,IAAA,EAAA,EAAI,UAAA,EAAW;AACf,IAAA,IAAI,iBAAA,EAAmB,KAAA,CAAM,mBAAA,CAAoB,YAAA,EAAc,iBAAiB,CAAA;AAChF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAM,KAAA,EAAM;AACZ,MAAA,KAAA,CAAM,GAAA,GAAM,EAAA;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA;AACF;AAMO,SAAS,gBAAA,CACd,MAAA,EACA,MAAA,EACA,IAAA,EACqB;AACrB,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAC1C;;;ACxfO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,4BAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,OAAA,GAAc,IAAA;AAAA,IACd,UAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EACzC;AAEA,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,SAAS,IAAA,GAAO,UAAA;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,IAAI,OAAA,EAAS;AAEhC,IAAA,MAAM,YAAY,GAAA,GAAM,KAAA,CAAM,IAAI,EAAA,EAAI,CAAC,IAAI,GAAA,IAAO,KAAA;AAClD,IAAA,MAAM,KAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACrC,IAAA,MAAM,UAAW,IAAA,CAAK,KAAA,CAAA,CAAO,OAAO,QAAA,GAAW,CAAA,GAAI,SAAS,MAAM,CAAA;AAClE,IAAA,MAAM,IAAW,CAAA,GAAI,KAAA;AAErB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,WAAW,UAAA,GAAa,CAAA,CAAA;AACpC,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,EAAM;AAE5B,MAAA,MAAM,IAAI,GAAA,GAAM,KAAA;AAChB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACjE,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AACpD,MAAA,MAAM,SAAS,CAAA,GAAI,UAAA;AAEnB,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,GAAA,GAAO,IAAI,CAAA,CAAA,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AACnD,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACjD;AACA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACF;;;ACrEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,yBAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,KAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,KAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,MAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,IAAA;AAE1D,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,QAAU,KAAA,CAAM,CAAA,GAAI,IAAK,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC9C,IAAA,MAAM,UAAU,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAM,KAAA,GAAU,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA;AAEhC,IAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,OAAA,GAAU,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAErD,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AACrC,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AAErC,IAAA,IAAI,CAAA,GAAI,OAAO,CAAA,GAAI,KAAA,GAAQ,MAAM,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,MAAA,GAAS,EAAA,EAAI;AAE7D,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,IAAY,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA;AACjD,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,EAAE,CAAA,YAAA,CAAA;AAEhB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,EAAA,GAAK,QAAQ,OAAO,CAAA;AAC1B,IAAA,MAAM,WAAW,CAAA,GAAI,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,GAAA;AAEzC,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,IAAA,EAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAC7E,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;AChEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,6BAAA;AAAA,IACb,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAa,CAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,QAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,SAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAM,KAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,GAAA;AAElG,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,QAAQ,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,QAAQ,CAAA;AAExC,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,OAAO,IAAA,GAAO,OAAA;AAEpB,MAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAM,QAAQ,CAAA,GAAI,KAAA;AAClB,QAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,IAAA,GAAO,KAAA,IAAS,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,QAAA,GAAW,OAAA,IAAW,QAAA,IAAY,EAAA,GAAK,SAAA,CAAA,CAAW,CAAA;AACnF,QAAA,cAAA,IAAkB,KAAK,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,GAAI,QAAA;AAAA,MACzD;AACA,MAAA,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAA;AAE3C,MAAA,IAAI,iBAAiB,IAAA,EAAM;AAE3B,MAAA,MAAM,WAAW,cAAA,GAAiB,GAAA;AAClC,MAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,MAAM,EAAA,GAAK,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,cAAA,GAAiB,IAAA,GAAO,cAAA,GAAiB,IAAA;AAEnE,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,EAAK,cAAA,GAAiB,IAAI,CAAC,CAAA,CAAA,CAAA,GACpF,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;ACxEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,KAAA,GAAkB,kCAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB,GAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,aAAa,KAAA,GAAQ,KAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAG5C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,CAAA,KAAsB;AAC7C,IAAA,IAAI,IAAI,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,CAAA,IAAQ,MAAA,CAAO,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AACrC,MAAA,IAAA,IAAQ,GAAA;AACR,MAAA,GAAA,IAAQ,GAAA;AACR,MAAA,IAAA,IAAQ,GAAA;AAAA,IACV;AACA,IAAA,OAAO,CAAA,GAAI,IAAA;AAAA,EACb,CAAA;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,CAAA,GAAI,IAAA;AAClC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,CAAA,GAAI,IAAA;AAGxC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,GAAO,SAAS,CAAA,GAAI,IAAA,GAAO,CAAA;AACxE,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAChD,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAEhD,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,GAAM,GAAA;AAE1B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAElB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACrD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAEhB,MAAA,MAAM,WAAW,KAAA,GAAQ,eAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,KAAA,GAAQ,IAAA,GAAO,KAAA,GAAQ,IAAA;AAEjD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,WAAA;AAAA,IACZ,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,MAAA,GAAY,IAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,cAAc,EAAA,GAAK,KAAA,GAAQ,CAAA,GAAI,GAAA,IAAO,IAAM,CAAA,IAAO,CAAA;AAEzD,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,YAAY,SAAS,CAAA;AAG3D,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACvC,MAAA,MAAM,QAAA,GAAA,CAAY,QAAA,GAAW,GAAA,GAAM,GAAA,IAAO,IAAA;AAG1C,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,QAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,CAAA;AACzB,QAAA,MAAM,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtC,QAAA,IAAI,IAAI,IAAA,EAAM;AACZ,UAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACtD,UAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA;AAAA,QAChE;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,aAAA,GAAgB,GAAA,GAAM,aAAa,GAAG,CAAA;AAC/E,MAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACzD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,aAAA,GAAgB,IAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAEzD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AC9EO,SAAS,sBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAmC,EAAC,EAC9B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,qCAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,CAAA;AAAA,IACd,QAAA,GAAc,GAAA;AAAA,IACd,WAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,cAAyF,EAAC;AAChG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,OAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACtC,IAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAE,CAAA;AACtC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,EAAA,EAAO,MAAM,IAAA,GAAQ,GAAA;AAAA,MACrB,EAAA,EAAO,MAAM,KAAA,GAAQ,GAAA;AAAA,MACrB,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA;AAAA,MACxB,EAAA,EAAA,CAAQ,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,IAAI,CAAA,GAAI,EAAA,CAAA;AAAA,MACnE,KAAO,IAAA,GAAO,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA,KACtC,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,KAAM,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,GAAc,IAAA,CAAK,IAAI,CAAC,EAAA,GAAK,KAAK,IAAI,CAAA;AACnD,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AACxB,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AAGxB,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,EAAE,IAAI,EAAA,EAAI,KAAA,EAAO,IAAI,GAAA,EAAI,GAAI,YAAY,CAAC,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,KAAK,IAC/C,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,KAAA,GAAQ,GAAG,CAAA;AACxE,QAAA,GAAA,IAAY,IAAA,GAAO,GAAA;AACnB,QAAA,QAAA,IAAY,GAAA;AAAA,MACd;AAGA,MAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AACrB,MAAA,MAAM,SAAS,GAAA,GAAM,GAAA,GAAM,KAAK,IAAA,CAAK,MAAA,GAAS,WAAW,GAAG,CAAA;AAE5D,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,MAAM,UAAA,GAAA,CAAc,SAAS,IAAA,IAAQ,IAAA;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAChF,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,MAAA,GAAS,IAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AAEnD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACrGO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,MAAA,GAAa,CAAA;AAAA,IACb,UAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,MAAG,CAAA;AAE7D,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,KAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AACnC,QAAA,MAAM,MAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACpC,QAAA,MAAM,EAAA,GAAM,MAAM,EAAA,GAAM,GAAA;AACxB,QAAA,MAAM,EAAA,GAAM,MAAM,GAAA,GAAM,CAAA;AACxB,QAAA,MAAM,EAAA,GAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAA,CAAO,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAA;AAErE,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAG,CAAA;AAElE,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,CAAA,GAAI,KAAK,GAAG,CAAA;AAErG,QAAA,QAAA,IAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAC,CAAA;AAC7C,QAAA,YAAA,IAAA,CAAiB,CAAA,GAAI,IAAI,CAAA,IAAK,GAAA;AAAA,MAChC;AAEA,MAAA,MAAM,QAAY,QAAA,GAAW,MAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,MAAM,CAAA;AAEnD,MAAA,IAAI,YAAY,GAAA,EAAK;AAErB,MAAA,MAAM,SAAA,GAAA,CAAa,KAAA,GAAQ,IAAA,CAAK,EAAA,KAAO,KAAK,EAAA,GAAK,CAAA,CAAA;AACjD,MAAA,MAAM,UAAY,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,MAAA;AACrE,MAAA,MAAM,EAAA,GAAY,SAAS,OAAO,CAAA;AAElC,MAAA,MAAM,WAAW,SAAA,GAAY,GAAA;AAC7B,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,GAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,MAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACjFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,eAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,SAAS,KAAA,GAAQ,MAAA;AAEvB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAA,CAAQ,EAAA,GAAK,QAAA,CAAS,CAAA,IAAK,MAAA;AACjC,MAAA,MAAM,EAAA,GAAO,KAAK,QAAA,CAAS,CAAA;AAC3B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAO,IAAA,GAAO,MAAA;AAGpB,MAAA,IAAI,IAAI,CAAA,EAAG;AACT,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAC,CAAA;AACxE,QAAA,IAAI,aAAa,IAAA,EAAM;AACvB,QAAA,MAAMG,MAAAA,GAAQ,UAAA,IAAc,SAAA,GAAY,IAAA,GAAO,IAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAIA,MAAK,CAAA,CAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAS,KAAA,CAAM,CAAC,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAC/C,QAAA;AAAA,MACF;AAQA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA;AACxF,MAAA,MAAM,OAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,GAAG,CAAA;AACrC,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,YAAY,GAAG,CAAA;AAEvD,MAAA,IAAI,YAAY,IAAA,EAAM;AAGtB,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,UAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,GAAG,QAAQ,CAAA;AACpD,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,IAAA,IAAQ,CAAA,GAAI,IAAA;AACzC,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,sBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,yBAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA,CAAE,EAAE,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAE/F,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AAEnC,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,KAAA,GAAS,MAAM,GAAA,IAAO,CAAA,GAAI,KAAK,CAAA,EAAG,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,EAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAC9B,QAAA,MAAM,KAAA,GAAS,KAAA,CAAM,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,EAAI,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,CAAC,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AACnE,QAAA,MAAM,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA,CAAA;AACxB,QAAA,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,MACrC;AAEA,MAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,GAAA;AAE9B,MAAA,IAAI,OAAO,IAAA,EAAM;AAEjB,MAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,IAAA;AACjC,MAAA,MAAM,OAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAC/E,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,WAAW,IAAA,GAAO,IAAA;AACxB,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,QAAA,GAAW,IAAA,GAAO,QAAA,GAAW,IAAA;AAE1D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AClEO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,cAAA;AAAA,IACZ,KAAA,GAAY,SAAA;AAAA,IACZ,QAAA,GAAY,SAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,IAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,MAAS,IAAA,GAAO,IAAA;AAGtB,EAAA,MAAM,GAAA,GAAM,eAAA;AACZ,EAAA,MAAM,YAAY,GAAA,CAAI,MAAA;AACtB,EAAA,IAAI,IAAA,GAAqB,UAAU,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AAChC,IAAA,IAAA,GAAO,IAAI,aAAa,GAAG,CAAA;AAC3B,IAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAK,KAAA,GAAQ,KAAA;AACnB,EAAA,MAAM,cAAc,IAAA,GAAO,EAAA;AAC3B,EAAA,MAAM,SAAA,GAAc,OAAO,KAAA,GAAQ,GAAA;AAGnC,EAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACrD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACtD,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,GAAU,GAAA,GAAM,QAAA,GAAW,GAAA,IAAO,SAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,GAAO,SAAS,CAAA;AAC9E,IAAA,IAAI,UAAU,CAAA,EAAG,IAAA,CAAA,CAAM,OAAA,GAAU,CAAA,IAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,GAAO,IAAA,GAAO,KAAK,MAAA,EAAO,GAAI,MAAM,SAAS,CAAA;AAAA,EAC7G;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,GAAG,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,OAAO,CAAC,CAAA;AACxC,MAAA,MAAM,SAAW,IAAA,CAAA,CAAM,CAAA,GAAI,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AACjG,MAAA,MAAM,IAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAChE,MAAA,MAAM,MAAY,KAAA,GAAQ,GAAA,GAAM,SAAS,IAAA,GAAO,IAAA,GAAO,QAAQ,KAAA,GAAQ,KAAA;AACvE,MAAA,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,WAAA,GAAc,IAAA,CAAK,MAAA,EAAO,GAAI,OAAO,KAAK,CAAA;AAAA,IACtF;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,OAAA,CAAA,CAAS,IAAA,GAAO,KAAK,IAAA,GAAO,CAAC,IAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAA,CAAA,CAAS,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,SAAA,CAAU,GAAG,CAAA,GAAI,OAAA;AAGjB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAQ,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAC1D,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAE7D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA;AAC9B,MAAA,IAAI,IAAI,IAAA,EAAM;AAEd,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAGhB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AACjC,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAE5C,MAAA,MAAM,KAAA,GAAQ,YAAa,CAAA,GAAI,CAAA,GAAI,MAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA;AAC9D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC/FO,SAAS,oBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAgC,EAAC,EAC3B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc,MAAA;AAAA,IACd,WAAA,GAAc,UAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,MAAA,GAAc,SAAA;AAAA,IACd,WAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,UAAA;AAAA,IACA,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,WAAW,IAAA,GAAO,QAAA;AAExB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAW,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAM,CAAA,IAAU,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,WAAW,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAKhE,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,YAAa,QAAA,GAAW,IAAA;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,SAAA,GAAY,YAAY,CAAA,GAAI,GAAA,CAAA;AAElC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,QAAS,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAiB,SAAA;AAC/D,MAAA,MAAM,cAAc,SAAA,GAAY,IAAA,CAAK,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAA,GAAO,SAAA;AAC/D,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC1C,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAE1C,MAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,IAAc,IAAA,EAAM;AAC1C,MAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AACzC,MAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAG9D,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,IAAK,GAAA;AACvC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAE,IAAI,CAAA,IAAK,GAAA;AAEjD,MAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,MAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAE/C,MAAA,IAAI,UAAA,IAAc,CAAA,IAAK,UAAA,GAAa,IAAA,EAAM;AACxC,QAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC1C,QAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAC9D,QAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAC9C,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,cAAA,GAAiB,CAAA;AACvB,MAAA,IAAI,CAAA,GAAI,mBAAmB,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AACtC,UAAA,MAAM,MAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AAChE,UAAA,MAAM,cAAA,GAAA,CAAkB,MAAA,GAAS,MAAA,IAAU,IAAA,GAAO,GAAA;AAClD,UAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,UAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,UAAA,KAAA,IAAS,EAAA,GAAK,IAAA,GAAO,CAAA,EAAG,EAAA,GAAK,MAAM,EAAA,EAAA,EAAM;AACvC,YAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,EAAA,GAAK,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC1FO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,WAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,QAAA,GAAc,SAAA;AAAA,IACd,SAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc,IAAA;AAAA,IACd,WAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,IAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAO,UAAA,CAAW,KAAK,CAAA,IAAS,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI;AAC/D,EAAA,MAAM,GAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,IAAM,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC/D,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,SAAS,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAG/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAG9B,EAAA,MAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,IAAA,GAAO,MAAA,IAAU,SAAA,GAAY,CAAA;AAC7C,IAAA,MAAM,KAAK,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA,GAAI,MAAM,GAAA,IAAO,WAAA;AACvC,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,YAAA,GAAe,IAAA,GAAO,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,WAAW,CAAA,IAAK,YAAA;AACtB,MAAA,MAAM,aAAa,CAAA,KAAM,YAAA;AAEzB,MAAA,IAAI,CAAC,QAAA,EAAU;AAEb,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,MAAM,MAAA,GAAS,GAAG,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AAC/D,UAAA,IAAI,WAAW,IAAA,EAAM;AACnB,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,QAAA,GAAW,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5D,YAAA,GAAA,CAAI,cAAc,OAAA,GAAU,GAAA;AAC5B,YAAA,GAAA,CAAI,SAAA,GAAY,CAAA,IAAA,EAAO,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,CAAA;AAC7D,YAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAK,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACxC;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAA,CAAS,IAAI,YAAA,IAAgB,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA;AAC5D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,UAAA,EAAY;AAE/B,MAAA,MAAM,SAAA,GAAY,aAAa,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC5D,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AAEnD,MAAA,GAAA,CAAI,WAAA,GAAc,MAAM,KAAA,GAAQ,GAAA;AAChC,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,KAAK,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACvFA,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AAEd,IAAM,SAAA,GAAoC;AAAA,EACxC,CAAC,IAAA,GAAO,IAAI,GAAgB,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAK,GAAc,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAA,GAAQ,KAAK,GAAG,QAAA;AAAA,EAC/B,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,KAAK,GAAG,QAAA;AAAA,EACT,CAAC,KAAK,GAAG;AACX,CAAA;AAEO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,UAAA,GAAa,SAAA;AAAA,IACb,KAAA,GAAa,SAAA;AAAA,IACb,OAAA,GAAa,IAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,KAAK,CAAA,IAAU,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC9D,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,UAAU,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAK9D,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,CAAA,KAAsB;AACvD,IAAA,IAAI,KAAA,CAAM,IAAI,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,EAAS,OAAO,CAAA;AACnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,EAAM,IAAA,IAAQ,IAAA;AACjE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAA,CAAO,CAAA,GAAE,CAAA,IAAG,EAAA,GAAG,CAAA,EAAG,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,MAAW,IAAA,IAAQ,IAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,CAAI,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAO,IAAA,IAAQ,KAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAM,CAAA,GAAE,EAAA,GAAG,CAAA,EAAA,CAAG,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAY,IAAA,IAAQ,KAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAChC,MAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAI,CAAA,IAAK,MAAA;AAG9B,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA,GAAI,EAAE,IAAI,EAAA,IAAM,IAAA;AACrD,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA,IAAM,IAAA;AAC1D,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,IAAA,IAAQ,IAAA,GAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AACxE,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,KAAA,IAAS,IAAA,GAAO,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AAC1E,MAAA,MAAM,UAAU,KAAA,IAAS,KAAA;AAEzB,MAAA,MAAM,YAAY,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAE/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C;AAEA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACpCA,SAAS,YAAY,CAAA,EAAuD;AAC1E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAiEO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAC3C,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAC1B,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW;AAC5B;AAoBO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACV;AACzB,EAAA,MAAM;AAAA,IACJ,IAAA,GAAc,MAAA;AAAA,IACd,OAAA,GAAc,GAAA;AAAA,IACd,SAAA;AAAA,IACA,MAAA,GAAc,CAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,YAAY,OAAO,MAAA,KAAW,WAC/B,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAC9B,MAAA;AAEJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,MAAM,CAAA;AAClE,IAAA,OAAO,EAAE,SAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,MAAM,YAAA,GAAe,UAAU,KAAA,CAAM,QAAA;AACrC,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AACrD,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,UAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,IACrB,mBAAA;AAAA,IAAqB,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,aAAA;AAAA,IAC9C,WAAW,OAAO,CAAA,CAAA;AAAA,IAAI,qBAAA;AAAA,IAAuB,WAAW,MAAM,CAAA;AAAA,GAChE,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,IAAI,SAAA,SAAkB,SAAA,GAAY,SAAA;AAClC,EAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAExB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,MAAM,KAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACrC,EAAA,MAAM,WAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAGrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,+BAA+B,CAAA;AAC5D,EAAA,MAAM,UAAU,MAAe;AAC7B,IAAA,IAAI,WAAA,KAAgB,SAAS,OAAO,IAAA;AACpC,IAAA,IAAI,WAAA,KAAgB,QAAS,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,OAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AASjD,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,SAAA,EAAW,WAAA,GACP,CAAA,KAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,KAAA,CAAA,GACtD,UAAA,CAAqC;AAAA,GAC5C,CAAA;AACA,EAAA,MAAM,gBAAiB,OAA8B;AAAA,IACnD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,kBAAkB,OAAgC;AAAA,IACtD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAuC;AAAA,GAC1D,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,eAAe,OAA6B;AAAA,IAChD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAoC;AAAA,GACvD,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,aAAA,EAAc,EAAmB;AAC5D,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAS,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,QAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,eAAA,EAAgB;AAAA,SAAA,IACtD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,KAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,YAAA,EAAa;AAAA,SAAA,IACnD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SAAA,IACvD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SACnC,OAAA,CAAQ,UAAU,aAAA,EAAc;AAAA,EAC/D,CAAA;AACA,EAAA,WAAA,EAAY;AAEZ,EAAA,MAAM,iBAAiB,MAAM;AAAE,IAAA,WAAA,EAAY;AAAA,EAAG,CAAA;AAC9C,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAExE,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,MAAA,CAAO,KAAA,GAAS,EAAE,KAAA,GAAS,GAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,GAAS,GAAA;AAC3B,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,MAAA,EAAO;AAEP,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AACnC,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAQ,CAAA,CAAE,MAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAEhD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAO,CAAA;AACX,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAE1C,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,sBAAA,CAAuB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAkC,CAAA;AAAA,IAC9G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAiC,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAA+B,CAAA;AAAA,IAC3F,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AACb,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAC3E,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,SAAA,CAAU,MAAM,QAAA,GAAW,YAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAGO,IAAM,mBAAA,GAAsB;;;AC1X5B,SAAS,UACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWO,SAAS,cACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAI,EAAA,EAAI;AACpC,QAAA,IAAA,IAAQ,GAAA;AAAA,MACV,CAAA,MAAO;AAEL,QAAA,IAAA,IAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,GAAG,KAAK,CAAA,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACgCO,SAAS,eACd,IAAA,EACA,IAAA,EACA,MACA,KAAA,GAAgB,SAAA,EAChB,UAAkB,GAAA,EACN;AACZ,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,IAAQ,KAAK,IAAA,IAAQ,CAAA,SAAU,EAAC;AAC7C,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,IAAK,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG;AAC1D,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,MAAM,OAAA,CAAQ,MAAA;AAEpB,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,IAAA,EAAK;AAAA,IAAG,CAAC,CAAA,EAAG,GAAA,KACtC,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,CAACC,EAAAA,EAAG,GAAA,MAAS;AAAA,MACxC,IAAA,EAAM,OAAA,CAAA,CAAS,GAAA,GAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AAAA,MACtC,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,CAAA,EAAG;AAAA,KACL,CAAE;AAAA,GACJ;AACF;AAoBO,SAAS,oBAAA,CACd,KACA,KAAA,EACA,MAAA,EACA,MACA,OAAA,GAAiC,IACjC,QAAA,EACM;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,UAAA,GAAc,GAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,OAAA,GAAc,GAAA;AAAA,IACd,WAAA,GAAe,WAAA;AAAA,IACf,aAAA,GAAgB,IAAA;AAAA,IAChB,WAAA,GAAe,IAAA;AAAA,IACf,UAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAS,QAAQ,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,IAAU,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA;AAErE,EAAA,MAAM,QAAQ,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,OAAO,CAAA;AAE7D,EAAA,MAAM,UAAA,GAA2B;AAAA,IAC/B,GAAG,eAAA;AAAA,IAEH,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,UAAA,EAAY,OAAO,MAAA,EAAQ,CAAA,EAAG,YAAY,IAAI,CAAA;AAChF;;;AC/JO,SAAS,eAAA,CACd,MAAA,EACA,EAAE,MAAA,GAAS,KAAA,EAAO,OAAA,GAAU,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAE,GAAqB,EAAC,EACnD;AACf,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,GAAA,GAAyB,MAAA;AAC7B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAS,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,KAAK,CAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2CAA2C,CAAC,CAAA;AAAG,QAAA;AAAA,MAAQ;AACvF,MAAA,MAAA,CAAO,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA,EAAO,IAAI,MAAM,CAAA;AACpD,MAAA,GAAA,GAAM,GAAA;AAAA,IACR;AACA,IAAA,GAAA,CAAI,MAAA;AAAA,MACF,CAAC,IAAA,KAAS,IAAA,GAAO,OAAA,CAAQ,IAAI,IAAI,MAAA,CAAO,IAAI,KAAA,CAAM,uCAAuC,CAAC,CAAA;AAAA,MAC1F,SAAS,MAAM,CAAA,CAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAWA,eAAsB,mBAAA,CACpB,MAAA,EACA,OAAA,GAAmD,EAAC,EACrC;AACf,EAAA,MAAM,EAAE,QAAA,GAAW,kBAAA,EAAoB,SAAS,KAAA,EAAO,GAAG,UAAS,GAAI,OAAA;AACvE,EAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAG,UAAU,CAAA;AAClE,EAAA,MAAM,GAAA,GAAM,MAAA,KAAW,MAAA,GAAS,KAAA,GAAQ,MAAA;AACxC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAW,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACrC,EAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC/B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,CAAA,CAAE,IAAI,GAAG,GAAM,CAAA;AACtD;;;ACJA,eAAsB,cACpB,MAAA,EACA;AAAA,EACE,QAAA,GAAW,EAAA;AAAA,EACX,KAAA,GAAQ,SAAA;AAAA,EACR,UAAU,EAAC;AAAA,EACX,WAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,WAAA,GAAc,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,EACnC,GAAA,EAAK;AACP,CAAA,GAAmB,EAAC,EACC;AACrB,EAAA,IAAI,CAAC,SAAA,CAAU,YAAA,EAAc,YAAA,EAAc;AACzC,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,aAAa,CAAA;AAE/E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,EAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AAEpB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,OAAA,EAAQ;AACvC,IAAA,KAAA,CAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,6CAA6C,CAAC,CAAA;AACrF,IAAA,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,GAAG,eAAA;AAAA,IACH,GAAG,kBAAkB,KAAK,CAAA;AAAA,IAC1B,GAAG,OAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAGhF,EAAA,MAAM,cAAc,WAAA,KAAgB,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,mBAAmB,CAAA,CAAA,IAAM,CAAA;AACpG,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,KAAA,CAAM,aAAa,WAAW,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAA,GAA4C,IAAA;AAChD,EAAA,MAAM,cAAc,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,WAAW,CAAA,EAAE;AAEnD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,IAAA,QAAA,GAAW;AAAA,MACT,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,MAClC,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,KACnC;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AAAE,IAAA,QAAA,GAAW,IAAA;AAAA,EAAM,CAAA;AAE9C,EAAA,IAAI,MAAA,CAAO,gBAAgB,CAAA,EAAG;AAC5B,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,EAAA,MAAM,IAAA,GAAO,CAAC,SAAA,KAAsB;AAClC,IAAA,IAAI,SAAA,EAAW;AAEf,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,iBAAA,EAAmB;AAE/C,MAAA,MAAM,QAAA,GAAW,OAAO,KAAA,GAAQ,WAAA;AAChC,MAAA,MAAM,QAAA,GAAW,OAAO,MAAA,GAAS,WAAA;AACjC,MAAA,MAAM,OAAA,GAAA,CAAW,YAAY,SAAA,IAAa,GAAA;AAG1C,MAAA,MAAM,YAAA,GAA6B,cAC/B,EAAE,GAAG,QAAQ,GAAG,WAAA,IAAc,GAC9B,MAAA;AAGJ,MAAA,MAAM,UAAA,GAAa,aAAa,aAAA,GAAgB,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAChD,QAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,YAAY,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,QAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,MACvD;AAEA,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,kBAAkB,KAAA,EAAO,YAAA,EAAc,UAAU,QAAQ,CAAA;AAG3E,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,CAAA;AACpC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,CAAA;AACpC,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AAC9C,QAAA,WAAA,CAAY,KAAK,EAAA,GAAK,KAAA;AACtB,QAAA,WAAA,CAAY,KAAK,EAAA,GAAK,KAAA;AACtB,QAAA,WAAA,CAAY,SAAA,IAAA,CAAc,CAAA,GAAI,WAAA,CAAY,SAAA,IAAa,IAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,SAAA,IAAa,KAAA;AACzB,QAAA,IAAI,WAAA,CAAY,SAAA,GAAY,IAAA,EAAO,WAAA,CAAY,SAAA,GAAY,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,GAAY,IAAA,GACrC,EAAE,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,WAAA,CAAY,CAAA,EAAG,SAAA,EAAW,WAAA,CAAY,WAAU,GACvE,IAAA;AAEJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AACf,QAAA,GAAA,CAAI,SAAA,CAAU,CAAC,QAAA,EAAU,CAAC,CAAA;AAC1B,QAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA;AACnF,QAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,MACd,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,MACrF;AAAA,IACF;AAEA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,IAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,YAAY,CAAA;AACrD,IAAA,MAAA,CAAO,WAAU,CAAE,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AACxC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAAA,EACpB,CAAA;AACF;;;ACxLA,IAAM,IAAA,GAAiC;AAAA;AAAA,EAErC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAK,GAAA,EAAM,IAAK,EAAA,EAAK,EAAA,EAAI,KAAK,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAO,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAG,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAM,CAAA,EAAK,GAAK,CAAA,EAAG,GAAA,EAAK,KAAM,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAM,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAI,GAAA,EAAK,KAAK,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAI,GAAA,EAAK,KAAM,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAK,IAAI,GAAA,EAAK,GAAA,EAAK,KAAM,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAM,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAO,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAK,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAM,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAO,CAAA,EAAK,GAAI,EAAA,EAAK,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA;AAAA,EAGvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAM,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAM,EAAA,EAAK,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAI,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAM,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAM,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAM,CAAA,EAAK,CAAA,EAAK,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAM,CAAA,EAAK,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAM,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAI,GAAA,EAAK,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAG,KAAM,EAAA,EAAI,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAM,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAM,GAAG,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAM,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAI,KAAM,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAI,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAM,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAG,KAAO,CAAA,EAAI,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA;AAAA,EAGvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAM,CAAA,EAAK,CAAA,EAAK,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAM,GAAK,CAAA,EAAI,EAAA,EAAK,IAAI,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAM,GAAI,EAAA,EAAM,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAK,EAAA,EAAI,GAAA,EAAO,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAI,KAAO,CAAA,EAAK,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAC,GAAA,EAAO,CAAA,EAAK,GAAI,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAM,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA;AAAA,EAGvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAM,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAM,GAAI,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAM,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAM,CAAA,EAAI,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAI,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAG,GAAG,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAM,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAM,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAM,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAM,GAAK,CAAA,EAAK,CAAA,EAAI,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAM,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAI,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAM,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAK,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,IAAA,EAAM,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACxC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAK,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAK,GAAI,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAM,CAAA,EAAI,EAAA,EAAM,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAI,GAAA,EAAM,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAM,EAAA,EAAI,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAI,KAAK,GAAA,EAAK,GAAA,EAAM,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAM,GAAK,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAK,EAAA,EAAM,CAAA,EAAI,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAM,CAAA,EAAK,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAK,CAAA,EAAI,IAAK,EAAA,EAAM,CAAA,EAAK,GAAK,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAG,CAAA,EAAI,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAM,CAAC,CAAA;AAAA,EACvC,GAAA,EAAK,CAAE,EAAA,EAAK,EAAA,EAAK,IAAM,CAAA,EAAI,EAAA,EAAK,IAAK,EAAE;AACzC,CAAA;AAGA,IAAM,QAAA,GAAqB,CAAC,GAAA,EAAM,EAAA,EAAK,IAAK,EAAA,EAAK,EAAA,EAAK,IAAI,GAAG,CAAA;AAE7D,SAAS,MAAM,EAAA,EAAsB;AACnC,EAAA,OAAO,KAAK,EAAE,CAAA,IAAK,KAAK,EAAA,CAAG,WAAA,EAAa,CAAA,IAAK,QAAA;AAC/C;AAyCO,SAAS,WAAA,CAAY,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAW;AAC9E,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,MAAM,EAAE,IAAA,GAAO,QAAA,EAAK,KAAA,GAAQ,GAAE,GAAI,OAAA;AAClC,EAAA,MAAM,WAAW,CAAC,GAAG,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,QAAA;AACjC,EAAA,MAAM,KAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,OAAW,CAAA,GAAI,EAAA;AACrB,EAAA,MAAM,GAAA,GAAW,EAAA;AAEjB,EAAA,MAAM,IAAA,GAAiB,MAAM,IAAA,CAAK,EAAE,QAAQ,IAAA,EAAK,EAAG,MAAM,EAAE,CAAA;AAE5D,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,QAAQ,EAAA,EAAA,EAAM;AACvC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AACxB,IAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,CAAA,EAAG,MAAA,EAAA,EAAU;AACzC,MAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AACrB,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,IAAU,CAAA,EAAG,MAAA,EAAA,EAAU;AAC1C,QAAA,GAAA,IAAA,CAAS,QAAQ,MAAA,GAAU,CAAA,GAAI,QAAA,GAAW,GAAA,EAAK,OAAO,EAAE,CAAA;AAAA,MAC1D;AACA,MAAA,KAAA,IAAS,GAAA,GAAM,GAAG,GAAA,GAAM,EAAA,EAAI,OAAO,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,GAAG,CAAA,IAAK,GAAA;AAAA,IAChE;AACA,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACxB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,OAAU,CAAC,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACvB;AAYO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACrB;AACN,EAAA,MAAM,EAAE,KAAA,GAAQ,SAAA,EAAW,OAAA,EAAS,QAAA,GAAW,IAAG,GAAI,OAAA;AAEtD,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AAEV,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,GAAG,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA;AAGvD,EAAA,MAAA,CAAO,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,WAAW,GAAG,CAAA;AAC/C,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,QAAQ,CAAA;AAEjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAElC,EAAA,IAAI,OAAA,IAAW,YAAY,aAAA,EAAe;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,IAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,EACjD;AAEA,EAAA,GAAA,CAAI,SAAA,GAAe,KAAA;AACnB,EAAA,GAAA,CAAI,IAAA,GAAe,GAAG,QAAQ,CAAA,YAAA,CAAA;AAC9B,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ,GAAA,CAAI,SAAS,IAAA,EAAM,CAAA,EAAG,GAAA,GAAM,QAAQ,CAAC,CAAA;AACpE","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField' | 'ripple' | 'melt' | 'orbit' | 'cellular';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines' | 'braille' | 'katakana' | 'musical' | 'emoji' | 'circles' | 'shadows' | 'starfield' | 'geometric' | 'pipes' | 'waves' | 'shards' | 'smoke';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail' | 'glitchText';\nexport type HoverShape = 'circle' | 'box';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice' | 'gravity' | 'shatter' | 'ghost' | 'glitchReveal';\n\n/**\n * Named colour palette presets — pass as `colorMode` for themed rendering.\n * Applied as a post-process colour remap over the standard grayscale output.\n */\nexport type PaletteTheme = 'dracula' | 'monokai' | 'nord' | 'catppuccin' | 'solarized' | 'gruvbox';\n\nexport const PALETTE_THEMES: Record<PaletteTheme, { name: string; accent: string; bg: string; fg: string }> = {\n dracula: { name: 'Dracula', accent: '#bd93f9', bg: '#282a36', fg: '#f8f8f2' },\n monokai: { name: 'Monokai', accent: '#a6e22e', bg: '#272822', fg: '#f8f8f2' },\n nord: { name: 'Nord', accent: '#88c0d0', bg: '#2e3440', fg: '#eceff4' },\n catppuccin: { name: 'Catppuccin',accent: '#cba6f7', bg: '#1e1e2e', fg: '#cdd6f4' },\n solarized: { name: 'Solarized', accent: '#268bd2', bg: '#002b36', fg: '#839496' },\n gruvbox: { name: 'Gruvbox', accent: '#b8bb26', bg: '#282828', fg: '#ebdbb2' },\n};\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n /** Character cell size in pixels. Smaller = more detail, more cells. Default: `10` */\n fontSize: number;\n /** Extra horizontal spacing between characters (pixels). Default: `1` */\n charSpacing: number;\n /**\n * Brightness adjustment applied before luminance mapping.\n * Range −1 (black) → 0 (unchanged) → 1 (white). Default: `0`\n */\n brightness: number;\n /**\n * Contrast boost applied before luminance mapping.\n * `0` = unchanged, positive values increase contrast, negative decrease it.\n * Default: `0`\n */\n contrast: number;\n /**\n * Character density ramp — ordered from lightest to darkest.\n * Use `CHARSETS` for pre-built ramps or supply your own string.\n * Default: `' .:-=+*#%@'`\n */\n charset: string;\n /**\n * Colour output mode.\n * - `'grayscale'` — white-on-black monochrome\n * - `'fullcolor'` — samples pixel colours from the source\n * - `'matrix'` — green phosphor terminal look\n * - `'accent'` — single accent colour with intensity-driven brightness\n * Default: `'grayscale'`\n */\n colorMode: ColorMode;\n /**\n * The accent colour used when `colorMode` is `'accent'` or `'matrix'`.\n * Any CSS colour string. Default: `'#d4ff00'`\n */\n /**\n * Hex color string used when `colorMode` is `'accent'`.\n * Set to `'auto'` to let the engine pick contrasting ink automatically:\n * dark ink (`#0d0d0d`) in light mode, light ink (`#faf9f7`) in dark mode.\n */\n accentColor: string;\n /**\n * Invert luminance mapping (light pixels → dense chars). Default: `false`\n *\n * Set to `'auto'` to let the engine detect the OS color scheme:\n * - Light mode → inverts (bright pixel = dark char = visible on white background)\n * - Dark mode → normal (bright pixel = bright char = visible on dark background)\n */\n invert: boolean | 'auto';\n /**\n * Render mode.\n * - `'ascii'` — characters drawn as text\n * - `'dots'` — each cell rendered as a filled circle (particle look)\n * Default: `'ascii'`\n */\n renderMode: RenderMode;\n /**\n * Per-character animation driven over time.\n * Applies wave, glitch, rain-drop, spiral, and other effects to the rendered text.\n * Default: `'none'`\n */\n animationStyle: AnimationStyle;\n /** Speed multiplier for `animationStyle` effects. Default: `1` */\n animationSpeed: number;\n /**\n * Size of each dot relative to the cell when `renderMode === 'dots'`.\n * `1` fills the whole cell, `0.5` draws half-size circles. Default: `0.8`\n */\n dotSizeRatio: number;\n /**\n * Floyd-Steinberg dither strength applied to the luminance map.\n * `0` = no dithering, `1` = full dithering. Default: `0`\n */\n ditherStrength: number;\n /**\n * Assumed aspect ratio (width ÷ height) of a single output character.\n * Controls how many rows vs columns are generated — must match your rendering\n * environment to preserve the source image's proportions.\n * - `0.55` — browser monospace at `line-height: 1.09` (default)\n * - `0.52` — browser monospace at `line-height: 1.15`\n * - `0.5` — most terminal emulators\n * Default: `0.55`\n */\n charAspect: number;\n /**\n * Auto-stretch the luminance range before charset mapping.\n * When `true`, the darkest pixel in the frame maps to the first charset character\n * and the brightest to the last, maximising perceived detail and contrast.\n * Particularly useful for images with low inherent contrast or muted tones.\n * Default: `false`\n */\n normalize: boolean;\n /**\n * Overall intensity of the hover / cursor interaction effect.\n * `0` disables the effect. Default: `0`\n */\n hoverStrength: number;\n /**\n * Radius of the hover interaction zone as a fraction of the canvas size.\n * `0.1` = 10% of canvas width. Default: `0.2`\n */\n hoverRadius: number;\n /**\n * Which cursor interaction style to apply when `hoverStrength > 0`.\n * See `HoverPreset` or `HOVER_PRESETS` for ready-made configurations.\n * Default: `'spotlight'`\n */\n hoverEffect: HoverEffect;\n /**\n * Tint colour used by hover effects such as spotlight, glow, and colorShift.\n * Any CSS colour string. Default: `'#ffffff'`\n */\n hoverColor: string;\n /**\n * Shape of the hover interaction zone.\n * - `'circle'` — radial falloff (default)\n * - `'box'` — rectangular zone, text fills a block around the cursor\n * Default: `'circle'`\n */\n hoverShape: HoverShape;\n /**\n * Text string revealed by the `'glitchText'` hover effect.\n * Characters around the cursor scramble and resolve into this text.\n * Supports `\\n` for multi-line reveals.\n *\n * Pass an **array** of strings to cycle through different words based on\n * the cursor's grid region — the engine picks one via a spatial hash so\n * each area of the canvas shows a different word.\n *\n * Default: `'ASCIIFY'`\n *\n * @example\n * // Single word:\n * options: { hoverEffect: 'glitchText', hoverText: 'HELLO' }\n *\n * // Word pool — different text at different cursor positions:\n * options: { hoverEffect: 'glitchText', hoverText: ['DEPLOY', 'SCALE', 'SHIP', 'BUILD'] }\n */\n hoverText: string | string[];\n /**\n * Art style preset applied at render time.\n * Shorthand for a specific combination of `charset`, `renderMode`, and `colorMode`.\n * See `ART_STYLE_PRESETS` for the full list. Default: `'classic'`\n */\n artStyle: ArtStyle;\n /**\n * Custom repeating text used when `artStyle` is `'letters'` or when you set\n * a custom charset. Leave empty to use the selected `charset`. Default: `''`\n */\n customText: string;\n /**\n * Chroma-key colour to remove from the source (green screen / blue screen).\n * Pixels whose RGB distance from this colour is within `chromaKeyTolerance`\n * are keyed out: their character becomes a space and alpha is set to 0,\n * letting the canvas background show through.\n *\n * - `true` — **smart green screen**: heuristic detection (`g > r*1.4 && g > b*1.4`)\n * catches every shade of green screen (lime, broadcast, chroma green) with no\n * config. Works on virtually all studio/streaming footage.\n * - `'blue-screen'` — **smart blue screen**: same heuristic for blue.\n * - `{ r, g, b }` or CSS colour string — custom key colour + `chromaKeyTolerance`\n * - `null` / `false` — disabled (default)\n *\n * @example\n * // Standard green screen — zero config:\n * options: { chromaKey: true }\n *\n * // Blue screen — zero config:\n * options: { chromaKey: 'blue-screen' }\n *\n * // Custom CSS colour:\n * options: { chromaKey: '#00b140', chromaKeyTolerance: 70 }\n */\n chromaKey: { r: number; g: number; b: number } | string | boolean | null;\n /**\n * Euclidean RGB tolerance radius for chroma-key detection.\n * `0` = exact match only, `441` ≈ key out everything.\n * Higher values remove more pixels. Default: `60`\n */\n chromaKeyTolerance: number;\n /**\n * Array of charset strings to cycle through over time.\n * The engine picks `charsetFrames[Math.floor(time * charsetFps) % length]` on each\n * render tick, re-mapping characters from stored cell luminance.\n * Pairs beautifully with `animationStyle` and `asciiBackground`.\n *\n * Use `CHARSET_SEQUENCES` for curated combinations or build your own:\n * @example\n * options: { charsetFrames: CHARSET_SEQUENCES.cosmic }\n * options: { charsetFrames: [CHARSETS.standard, CHARSETS.blocks, CHARSETS.circles] }\n */\n charsetFrames?: string[];\n /** Cycle rate for `charsetFrames` in frames-per-second. Default: `2` */\n charsetFps?: number;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n /** Stored dithered luminance (0–255). Present when the frame was generated by the engine. Used for dynamic charset re-selection at render time via `charsetFrames`. */\n lum?: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n braille: ' ⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿',\n katakana: ' ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン',\n musical: ' ♩♪♫♬♭♮♯',\n emoji: ' ⬛🟫🟥🟧🟨🟩🟦🟪⬜',\n circles: ' .·:∘○◦°•∙',\n shadows: ' ·∘◦○◎⊙●◉',\n starfield: ' ˙·∘∗✦✧★◆●',\n geometric: ' ·△▷◇◈◆▣■█',\n pipes: ' ╶─┐└├┤┬┴┼╬▒▓█',\n waves: ' ˜∼≈〰≋∿∾∭∫',\n shards: ' ╱╲╳◤◥◣◢△▲◆◼█',\n smoke: ' ·˙⁚⁖∶∷⋮⋰⋱∴∵',\n} as const;\n\n/**\n * Curated charset sequences for use with `charsetFrames`.\n * Each sequence morphs between 2–3 complementary charsets over time,\n * creating a living texture effect.\n *\n * @example\n * asciiBackground('#hero', { charsetFrames: CHARSET_SEQUENCES.cosmic })\n */\nexport const CHARSET_SEQUENCES = {\n /** Stars → softcircles → orbs — dreamy space feel */\n cosmic: [CHARSETS.starfield, CHARSETS.circles, CHARSETS.shadows] as string[],\n /** Katakana → braille dots → binary — hacker rain */\n rain: [CHARSETS.katakana, CHARSETS.braille, CHARSETS.binary] as string[],\n /** Box pipes → Claude glyphs → classic — terminal morph */\n terminal: [CHARSETS.pipes, CHARSETS.claudeCode, CHARSETS.standard] as string[],\n /** Shards → blocks → squares — shattering crystal */\n crystal: [CHARSETS.shards, CHARSETS.geometric, CHARSETS.blocks] as string[],\n /** Wave glyphs → smoke dots → circles — fluid / organic */\n fluid: [CHARSETS.waves, CHARSETS.smoke, CHARSETS.circles] as string[],\n /** Dense classic → art → blocks — maximum detail pulse */\n pulse: [CHARSETS.dense, CHARSETS.standard, CHARSETS.blocks] as string[],\n /** Braille → shadows → smoke — ethereal / dream-like */\n dream: [CHARSETS.braille, CHARSETS.shadows, CHARSETS.smoke] as string[],\n /** Geometric shapes → shards → starfield — sci-fi angular */\n angular: [CHARSETS.geometric, CHARSETS.shards, CHARSETS.starfield] as string[],\n} as const;\n\nexport type CharsetSequenceKey = keyof typeof CHARSET_SEQUENCES;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n braille: {\n renderMode: 'ascii',\n charset: CHARSETS.braille,\n colorMode: 'fullcolor',\n },\n katakana: {\n renderMode: 'ascii',\n charset: CHARSETS.katakana,\n colorMode: 'matrix',\n },\n musical: {\n renderMode: 'ascii',\n charset: CHARSETS.musical,\n colorMode: 'accent',\n accentColor: '#e040fb',\n },\n emoji: {\n renderMode: 'ascii',\n charset: CHARSETS.emoji,\n colorMode: 'fullcolor',\n },\n circles: {\n renderMode: 'ascii',\n charset: CHARSETS.circles,\n colorMode: 'accent',\n accentColor: '#d4ff00',\n },\n shadows: {\n renderMode: 'ascii',\n charset: CHARSETS.shadows,\n colorMode: 'accent',\n accentColor: '#50a0ff',\n },\n starfield: {\n renderMode: 'ascii',\n charset: CHARSETS.starfield,\n colorMode: 'fullcolor',\n },\n geometric: {\n renderMode: 'ascii',\n charset: CHARSETS.geometric,\n colorMode: 'grayscale',\n },\n pipes: {\n renderMode: 'ascii',\n charset: CHARSETS.pipes,\n colorMode: 'accent',\n accentColor: '#00ff88',\n },\n waves: {\n renderMode: 'ascii',\n charset: CHARSETS.waves,\n colorMode: 'fullcolor',\n },\n shards: {\n renderMode: 'ascii',\n charset: CHARSETS.shards,\n colorMode: 'grayscale',\n },\n smoke: {\n renderMode: 'ascii',\n charset: CHARSETS.smoke,\n colorMode: 'accent',\n accentColor: '#c850ff',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n charAspect: 0.55,\n normalize: false,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n hoverShape: 'circle',\n hoverText: 'ASCIIFY',\n artStyle: 'classic',\n customText: '',\n chromaKey: null,\n chromaKeyTolerance: 60,\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n gravity: {\n label: 'Gravity',\n options: { hoverStrength: 0.7, hoverEffect: 'attract', hoverRadius: 0.18, hoverColor: '#a5d6ff' },\n },\n shatter: {\n label: 'Shatter',\n options: { hoverStrength: 0.8, hoverEffect: 'shatter', hoverRadius: 0.14, hoverColor: '#ff6090' },\n },\n ghost: {\n label: 'Ghost',\n options: { hoverStrength: 0.55, hoverEffect: 'trail', hoverRadius: 0.2, hoverColor: '#b39ddb' },\n },\n glitchReveal: {\n label: 'Glitch Reveal',\n options: { hoverStrength: 0.8, hoverEffect: 'glitchText', hoverRadius: 0.18, hoverColor: '#a3e635' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const chars = [...charset]; // Unicode-aware split (handles surrogate pairs / emoji)\n const index = Math.floor(normalized * (chars.length - 1));\n return chars[Math.max(0, Math.min(chars.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const chars = [...text];\n const pos = y * cols + x;\n return chars[pos % chars.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number,\n _isInverted = false\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n // Accent mode: constant colour — the character density (chosen by\n // luminanceToChar) already encodes brightness. Scaling the colour\n // by luminance too creates a double-emphasis that makes dark source\n // areas invisible on dark backgrounds and bright areas invisible on\n // light backgrounds.\n return `rgb(${acR},${acG},${acB})`;\n }\n default: {\n // Grayscale: always use the source luminance as-is.\n // `invert` controls character DENSITY (sparse ↔ dense) but NOT color.\n // Inverting color would cancel out the density swap (dense + bright\n // on white = invisible), defeating the purpose of light-mode invert.\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n return GRAY_LUT[gray];\n }\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number,\n _isInverted = false\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n // Constant accent colour — density encodes brightness (see getCellColorStr).\n _colorRGB[0] = acR; _colorRGB[1] = acG; _colorRGB[2] = acB;\n break;\n }\n default: {\n // Grayscale: no color inversion — see getCellColorStr comment.\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n// ─── Chroma key ───────────────────────────────────────────────────\n\n/**\n * Resolve a chroma-key colour spec to `{ r, g, b }`.\n * Accepts a plain RGB object (returned unchanged) or any CSS colour string\n * — the string is parsed via a temporary 1×1 canvas so it supports hex,\n * `rgb()`, named colours, etc.\n */\nexport function parseChromaKeyColor(\n color: { r: number; g: number; b: number } | string\n): { r: number; g: number; b: number } {\n if (typeof color !== 'string') return color;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const d = ctx.getImageData(0, 0, 1, 1).data;\n return { r: d[0], g: d[1], b: d[2] };\n}","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect, HoverShape } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n case 'ripple': {\n // Ripples emanate from the center outward over time.\n const cx2 = cols / 2;\n const cy2 = rows / 2;\n const dx2 = x - cx2;\n const dy2 = y - cy2;\n const dist2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n const maxDist2 = Math.sqrt(cx2 * cx2 + cy2 * cy2);\n const ripple = Math.sin((dist2 / maxDist2) * Math.PI * 10 - t * 5) * 0.5 + 0.5;\n const fadeEdge = 1 - Math.min(1, dist2 / (maxDist2 * 1.1));\n return 0.1 + 0.9 * ripple * (0.4 + fadeEdge * 0.6);\n }\n case 'melt': {\n // Chars droop downward as if melting — lower rows lag behind.\n const lagPhase = (y / rows) * Math.PI;\n const drip = Math.sin(lagPhase - t * 1.8 + x * 0.15) * 0.5 + 0.5;\n const gravity = Math.max(0, (y / rows - 0.1)) / 0.9;\n return 0.05 + 0.95 * (drip * (1 - gravity * 0.6));\n }\n case 'orbit': {\n // Each cell rotates around the center at a speed proportional to radius.\n const ocx = cols / 2;\n const ocy = rows / 2;\n const odx = x - ocx;\n const ody = y - ocy;\n const oAngle = Math.atan2(ody, odx);\n const oDist = Math.sqrt(odx * odx + ody * ody) / Math.sqrt(ocx * ocx + ocy * ocy);\n const orbit = Math.sin(oAngle * 2 + oDist * 6 - t * 2.5) * 0.5 + 0.5;\n return 0.1 + 0.9 * orbit;\n }\n case 'cellular': {\n // Conway-ish: cell \"lives\" based on a hash of its neighbours at a quantised time.\n const tick = Math.floor(t * 4);\n const alive = (cx: number, cy: number): number => {\n const h = Math.sin(cx * 127.1 + cy * 311.7 + tick * 43758.5453) * 43758.5453;\n return h - Math.floor(h) > 0.38 ? 1 : 0;\n };\n const self = alive(x, y);\n const neighbours =\n alive(x - 1, y) + alive(x + 1, y) +\n alive(x, y - 1) + alive(x, y + 1) +\n alive(x - 1, y - 1) + alive(x + 1, y - 1) +\n alive(x - 1, y + 1) + alive(x + 1, y + 1);\n const nextAlive = self === 1\n ? (neighbours === 2 || neighbours === 3 ? 1 : 0)\n : (neighbours === 3 ? 1 : 0);\n return nextAlive === 1 ? 1 : 0.05;\n }\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5,\n shape: HoverShape = 'circle'\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n // Compute distance based on shape\n let dist: number;\n let maxDist: number;\n if (shape === 'box') {\n // Chebyshev distance — creates a rectangular zone\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n dist = Math.max(absDx, absDy);\n maxDist = radius;\n } else {\n // Euclidean distance — circular zone (default)\n dist = Math.sqrt(dx * dx + dy * dy);\n maxDist = radius;\n }\n\n if (dist >= maxDist) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const t = 1 - dist / maxDist;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n case 'attract': {\n // Inverse of repel — chars drift toward the cursor.\n const angle3 = Math.atan2(dy, dx);\n const pull = eased * eased * strength * 1.0;\n // Offset toward cursor (negative direction = toward)\n offsetX = -Math.cos(angle3) * pull * cellW;\n offsetY = -Math.sin(angle3) * pull * cellH;\n glow = eased * strength * 0.3;\n break;\n }\n case 'shatter': {\n // Chars scatter radially outward with jitter, then reform.\n const angle4 = Math.atan2(dy, dx);\n const jitter = Math.sin(dx * 43.7 + dy * 29.3) * 0.5;\n const scatter = eased * strength * 1.4 * (0.7 + jitter * 0.3);\n offsetX = Math.cos(angle4 + jitter) * scatter * cellW;\n offsetY = Math.sin(angle4 + jitter) * scatter * cellH;\n scale = Math.max(0.1, 1 - eased * strength * 0.6);\n glow = eased * strength * 0.25;\n break;\n }\n case 'trail': {\n // Leaves a fading colour ghost: increase colorBlend and glow strongly within radius.\n colorBlend = eased * strength * 0.9;\n glow = eased * strength * 0.6;\n scale = 1 + eased * strength * 0.15;\n break;\n }\n case 'glitchText': {\n // Clean text reveal — minimal displacement, just glow + color tint.\n // The heavy lifting (char replacement) is in renderer.ts.\n scale = 1;\n glow = eased * strength * 0.5;\n colorBlend = eased * strength * 0.6;\n break;\n }\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x7fffffff;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = undefined as string | undefined,\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n {\n const hex = resolvedAccent.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(55,55,55,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n parseChromaKeyColor,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/**\n * Detect whether the current environment is in dark mode.\n * Checks document-level theme indicators first (`data-theme`, `class=\"dark\"`),\n * then falls back to the OS colour-scheme media query.\n */\nfunction isDarkMode(): boolean {\n if (typeof document !== 'undefined') {\n const el = document.documentElement;\n const dt = (el.getAttribute('data-theme') || '').toLowerCase();\n if (dt === 'dark') return true;\n if (dt === 'light') return false;\n if (el.classList.contains('dark')) return true;\n }\n return typeof window !== 'undefined'\n && window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/** Resolve `invert: 'auto'` to a concrete boolean using the active colour scheme. */\nfunction resolveInvert(invert: boolean | 'auto'): boolean {\n if (invert !== 'auto') return invert;\n return !isDarkMode();\n}\n\n/**\n * Parse a CSS color value (hex or rgb()) to a 6-char hex string (no `#`).\n * Returns null if the value isn't a recognized color format.\n */\nfunction cssValueToHex(val: string): string | null {\n const hexMatch = val.match(/^#([0-9a-fA-F]{3,6})$/);\n if (hexMatch) {\n let h = hexMatch[1];\n if (h.length === 3) h = h[0]+h[0]+h[1]+h[1]+h[2]+h[2];\n if (h.length === 6) return h;\n }\n const rgbMatch = val.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (rgbMatch) {\n return [rgbMatch[1], rgbMatch[2], rgbMatch[3]]\n .map(n => parseInt(n).toString(16).padStart(2, '0'))\n .join('');\n }\n return null;\n}\n\n/**\n * Resolve `accentColor: 'auto'` to a concrete hex string (no `#`).\n * Detection order:\n * 1. Probe common CSS custom properties on `:root` set by the user's project\n * (`--accent-color`, `--color-accent`, `--accent`, `--color-primary`, `--primary`, `--brand-color`)\n * 2. Native CSS `accent-color` computed value\n * 3. OS color-scheme fallback: `#0d0d0d` in light mode, `#faf9f7` in dark mode\n */\nfunction resolveAccentHex(accentColor: string | undefined): string {\n const v = accentColor || 'auto';\n if (v !== 'auto') return v.replace('#', '');\n\n if (typeof document !== 'undefined') {\n const rootStyle = getComputedStyle(document.documentElement);\n for (const prop of ['--accent-color', '--color-accent', '--accent', '--color-primary', '--primary', '--brand-color']) {\n const hex = cssValueToHex(rootStyle.getPropertyValue(prop).trim());\n if (hex) return hex;\n }\n const native = cssValueToHex((getComputedStyle(document.body) as CSSStyleDeclaration & { accentColor?: string }).accentColor ?? '');\n if (native) return native;\n }\n\n return isDarkMode() ? 'faf9f7' : '0d0d0d';\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = options.charAspect;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n // ── Supersampling ──────────────────────────────────────────────────\n // Drawing the source at cols×rows (one pixel per cell) discards most\n // of the source detail (e.g. 1920×1080 → 100×55). Instead we sample\n // at a higher resolution and average multiple source pixels per cell.\n // The supersample factor is clamped so the intermediate buffer never\n // exceeds ~4 MP (2048×2048) to stay GPU-friendly.\n const maxDim = 2048;\n const ssX = Math.max(1, Math.min(Math.floor(maxDim / cols), Math.floor(srcWidth / cols)));\n const ssY = Math.max(1, Math.min(Math.floor(maxDim / rows), Math.floor(srcHeight / rows)));\n const sampleW = cols * ssX;\n const sampleH = rows * ssY;\n\n const { ctx } = createOffscreenCanvas(sampleW, sampleH);\n ctx.drawImage(source, 0, 0, sampleW, sampleH);\n const imageData = ctx.getImageData(0, 0, sampleW, sampleH);\n const pixels = imageData.data;\n\n // ── Chroma-key pre-processing ────────────────────────────────────\n // `true` — heuristic green: g > r*1.4 && g > b*1.4 && g > 80\n // `'blue-screen'` — heuristic blue: b > r*1.4 && b > g*1.4 && b > 80\n // string / {r,g,b} — Euclidean distance with chromaKeyTolerance\n const ck = options.chromaKey;\n const ckEnabled = ck != null && ck !== false;\n const ckHeuristicGreen = ck === true;\n const ckHeuristicBlue = ck === 'blue-screen';\n let ckRGB: { r: number; g: number; b: number } | null = null;\n let ckTolSq = 0;\n if (ckEnabled && !ckHeuristicGreen && !ckHeuristicBlue) {\n ckRGB = parseChromaKeyColor(ck as string | { r: number; g: number; b: number });\n ckTolSq = (options.chromaKeyTolerance ?? 60) ** 2;\n }\n\n // ── Optional normalize pre-scan ──────────────────────────────────\n // Find the actual luminance range *of non-keyed pixels* so we can\n // stretch it to full [0, 255] — maximises perceived detail.\n // Must run AFTER chroma-key setup so keyed pixels are excluded.\n let normMin = 0;\n let normRange = 255;\n if (options.normalize) {\n let lo = 255, hi = 0;\n for (let k = 0; k < pixels.length; k += 4) {\n // Skip chroma-keyed pixels — they're bg and would inflate the range\n if (ckEnabled) {\n const pr = pixels[k], pg = pixels[k + 1], pb = pixels[k + 2];\n let keyed = false;\n if (ckHeuristicGreen) {\n keyed = pg > pr * 1.4 && pg > pb * 1.4 && pg > 80;\n } else if (ckHeuristicBlue) {\n keyed = pb > pr * 1.4 && pb > pg * 1.4 && pb > 80;\n } else if (ckRGB !== null) {\n const dr = pr - ckRGB.r, dg = pg - ckRGB.g, db = pb - ckRGB.b;\n keyed = dr * dr + dg * dg + db * db <= ckTolSq;\n }\n if (keyed) continue;\n }\n const l = 0.299 * pixels[k] + 0.587 * pixels[k + 1] + 0.114 * pixels[k + 2];\n if (l < lo) lo = l;\n if (l > hi) hi = l;\n }\n normMin = lo;\n normRange = hi > lo ? hi - lo : 255;\n }\n\n const frame: AsciiFrame = [];\n const invertVal = resolveInvert(options.invert);\n\n // When chroma-key is active, strip spaces from the charset.\n // Keyed pixels are already transparent (a=0, skipped in renderer) so spaces\n // are redundant. Keeping them wastes charset range and makes the lightest\n // (or darkest, depending on invert) subject pixels invisible.\n const effectiveCharset = ckEnabled\n ? options.charset.replace(/ /g, '') || options.charset\n : options.charset;\n\n const ssCount = ssX * ssY;\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n // Average the ssX × ssY pixel block for this cell\n let sumR = 0, sumG = 0, sumB = 0, sumA = 0;\n let keyedCount = 0;\n\n for (let sy = 0; sy < ssY; sy++) {\n const rowOff = (y * ssY + sy) * sampleW;\n for (let sx = 0; sx < ssX; sx++) {\n const i = (rowOff + x * ssX + sx) * 4;\n const pr = pixels[i], pg = pixels[i + 1], pb = pixels[i + 2], pa = pixels[i + 3];\n\n // Chroma-key: count keyed sub-pixels\n if (ckEnabled) {\n let keyed = false;\n if (ckHeuristicGreen) {\n keyed = pg > pr * 1.4 && pg > pb * 1.4 && pg > 80;\n } else if (ckHeuristicBlue) {\n keyed = pb > pr * 1.4 && pb > pg * 1.4 && pb > 80;\n } else if (ckRGB !== null) {\n const dr = pr - ckRGB.r, dg = pg - ckRGB.g, db = pb - ckRGB.b;\n keyed = dr * dr + dg * dg + db * db <= ckTolSq;\n }\n if (keyed) { keyedCount++; continue; }\n }\n\n sumR += pr; sumG += pg; sumB += pb; sumA += pa;\n }\n }\n\n // If majority of sub-pixels are keyed, treat whole cell as keyed\n if (ckEnabled && keyedCount > ssCount / 2) {\n row.push({ char: ' ', r: 0, g: 0, b: 0, a: 0 });\n continue;\n }\n\n const nonKeyed = ssCount - keyedCount;\n const r = nonKeyed > 0 ? sumR / nonKeyed : 0;\n const g = nonKeyed > 0 ? sumG / nonKeyed : 0;\n const b = nonKeyed > 0 ? sumB / nonKeyed : 0;\n const a = nonKeyed > 0 ? sumA / nonKeyed : 0;\n\n const rawLum = 0.299 * r + 0.587 * g + 0.114 * b;\n const lum = options.normalize\n ? ((rawLum - normMin) / normRange) * 255\n : rawLum;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, invertVal)\n : luminanceToChar(ditheredLum, effectiveCharset, invertVal);\n\n row.push({ char, r, g, b, a, lum: ditheredLum });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void,\n startTime: number = 0,\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration - startTime, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = startTime + (i / targetFps);\n if (time > startTime + duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = options.accentColor ? resolveAccentHex(options.accentColor) : 'd4ff00';\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n // Fill based on the active colour scheme so the canvas background matches\n // the page regardless of the `invert` setting (which controls char\n // density / accent brightness, NOT background colour).\n ctx.fillStyle = isDarkMode() ? '#0a0a0a' : '#faf9f7';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = resolveAccentHex(options.accentColor);\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const hoverShape = options.hoverShape || 'circle';\n const isInverted = resolveInvert(options.invert);\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor, hoverShape\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB, isInverted);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB, isInverted);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n const isEmoji = options.artStyle === 'emoji';\n ctx.font = isEmoji\n ? `${fontSize}px \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Twemoji Mozilla\", sans-serif`\n : `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n // ── Dynamic charset (charsetFrames) ──────────────────────────────────\n const dynFrms = options.charsetFrames;\n const hasDyn = !!dynFrms?.length;\n const dynCharset = hasDyn\n ? dynFrms![Math.floor(Math.max(0, time) * (options.charsetFps ?? 2)) % dynFrms!.length]\n : options.charset;\n\n if (useFastRect) {\n charWeights = {};\n const csChars = [...dynCharset]; // Unicode-aware\n const csLen = csChars.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[csChars[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n // ── glitchText pre-computation ───────────────────────────────────────\n // Stacks the hover-text word on multiple consecutive rows centred on the\n // cursor. Each character scrambles (glitch) then resolves to the real\n // letter based on proximity to the cursor. No box, no fill — only the\n // word characters themselves replace the underlying ASCII.\n const isGlitchText = hoverEffect === 'glitchText' && hoverActive;\n const GLITCH_CHARS = '!@#$%^&*<>{}[]|/\\\\~`0123456789';\n const glitchLen = GLITCH_CHARS.length;\n let gtWord = '';\n let gtWordLen = 0;\n let gtCursorCol = 0;\n let gtCursorRow = 0;\n let gtRepeatRows = 0; // total rows of repeated words\n let gtStartRow = 0; // first row of the text block\n let gtStartCol = 0; // first col of each line (left-aligned to center)\n if (isGlitchText) {\n const rawText = options.hoverText ?? 'ASCIIFY';\n gtCursorCol = Math.round(hoverPosX * cols);\n gtCursorRow = Math.round(hoverPosY * rows);\n\n // Pick one word (cycle through array based on cursor region)\n if (Array.isArray(rawText)) {\n const words = rawText.filter(w => w.length > 0);\n if (words.length === 0) words.push('ASCIIFY');\n const regionX = Math.floor(gtCursorCol / Math.max(1, Math.ceil(cols / 5)));\n const regionY = Math.floor(gtCursorRow / Math.max(1, Math.ceil(rows / 3)));\n const idx = ((regionX * 7 + regionY * 13) % words.length + words.length) % words.length;\n gtWord = words[idx];\n } else {\n gtWord = rawText || 'ASCIIFY';\n }\n gtWordLen = gtWord.length;\n\n // Number of repeated rows — roughly proportional to hoverRadius\n gtRepeatRows = Math.max(3, Math.min(12, Math.round(rows * effectiveHoverRadius * 0.6)));\n const halfRows = Math.floor(gtRepeatRows / 2);\n gtStartRow = Math.max(0, gtCursorRow - halfRows);\n if (gtStartRow + gtRepeatRows > rows) gtStartRow = Math.max(0, rows - gtRepeatRows);\n\n // Center the word horizontally on the cursor\n gtStartCol = gtCursorCol - Math.floor(gtWordLen / 2);\n }\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n let drawChar = hasDyn && cell.lum != null\n ? luminanceToChar(cell.lum, dynCharset, isInverted)\n : cell.char;\n if (drawChar === ' ') continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && !isGlitchText && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor, hoverShape\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n // ── glitchText character replacement ───────────────────────────\n // Only affects cells that fall on a word-character position.\n // The word is stacked on multiple rows, centered on cursor.\n // Near cursor → resolved letter. Far → scrambled glyph.\n if (isGlitchText && y >= gtStartRow && y < gtStartRow + gtRepeatRows) {\n const charIdx = x - gtStartCol;\n if (charIdx >= 0 && charIdx < gtWordLen) {\n const targetChar = gtWord[charIdx];\n\n // Distance from cursor row (normalised 0..1)\n const rowDist = Math.abs(y - gtCursorRow) / Math.max(1, gtRepeatRows * 0.5);\n const colDist = Math.abs(x - gtCursorCol) / Math.max(1, gtWordLen);\n const dist = Math.max(rowDist, colDist);\n const resolveRate = Math.max(0, Math.min(1, 1 - dist * 0.9));\n\n // Per-cell animated hash for scramble flickering\n const h = Math.sin(x * 127.1 + y * 311.7 + Math.floor(time * 12) * 43758.5453) * 43758.5453;\n const rng = Math.abs(h - Math.floor(h));\n\n if (rng < resolveRate) {\n // Resolved — show the real character\n drawChar = targetChar;\n } else {\n // Scrambled — random glyph\n drawChar = GLITCH_CHARS[Math.abs(Math.floor(h * 97)) % glitchLen];\n }\n hoverGlow = 0.3 + resolveRate * 0.7;\n hoverBlend = 0.3 + resolveRate * 0.65;\n }\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB, isInverted);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB, isInverted);\n }\n\n if (useFastRect) {\n const weight = charWeights![drawChar] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(drawChar, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(drawChar, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /**\n * Art style preset — controls charset, render mode, and color mode together.\n * Shorthand for spreading `ART_STYLE_PRESETS[artStyle]` into options.\n * Default: `'classic'`\n */\n artStyle?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\nexport interface AsciifyVideoOptions extends AsciifySimpleOptions {\n /**\n * Fit the canvas to a container element, maintaining the video's aspect ratio.\n * Accepts an HTMLElement or a CSS selector string. The canvas is resized on\n * load and again whenever the container resizes (via ResizeObserver).\n * `stop()` automatically disconnects the observer.\n *\n * @example\n * // Fill the hero div, re-size on window resize automatically:\n * asciifyVideo('/clip.mp4', canvas, { fitTo: '#hero' });\n */\n fitTo?: HTMLElement | string | null;\n /**\n * Pre-extract all video frames into memory before starting playback.\n * Useful for short clips where you need frame-perfect control.\n *\n * Default: `false` — streams live directly from the playing video (instant\n * start, constant memory, unlimited duration).\n *\n * ⚠️ Memory-intensive. Capped at 10 s / 300 frames.\n */\n preExtract?: boolean;\n /**\n * Trim the video to a specific time range (in seconds).\n * - `start` — seek to this time before playback begins. Default: `0`\n * - `end` — loop back to `start` when this time is reached.\n * In `preExtract` mode, only frames up to `end` are extracted.\n *\n * @example\n * // Play only seconds 2–8, looping:\n * asciifyVideo('/clip.mp4', canvas, { trim: { start: 2, end: 8 } });\n */\n trim?: { start?: number; end?: number };\n /**\n * Called once when the video metadata is loaded and playback has started.\n * Receives the backing video element.\n */\n onReady?: (video: HTMLVideoElement) => void;\n /** Called after every rendered frame. */\n onFrame?: () => void;\n}\n\n/** @deprecated Use {@link AsciifyVideoOptions} */\nexport type AsciifyLiveVideoOptions = AsciifyVideoOptions;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\n/** Get the intrinsic pixel dimensions of a media source. */\nfunction getSourceDims(el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement): { w: number; h: number } {\n if (el instanceof HTMLVideoElement) return { w: el.videoWidth, h: el.videoHeight };\n if (el instanceof HTMLImageElement) return { w: el.naturalWidth || el.width, h: el.naturalHeight || el.height };\n return { w: el.width, h: el.height };\n}\n\n/**\n * Compute high-quality render dimensions from source dims.\n * Returns render dimensions (capped at 2048 on the longer edge) that should be\n * used as the coordinate space for both `imageToAsciiFrame` and\n * `renderFrameToCanvas`. This ensures characters are rendered at readable font\n * sizes regardless of how small the CSS display canvas is — exactly matching\n * the playground pipeline.\n */\nfunction computeRenderDims(srcW: number, srcH: number): { renderW: number; renderH: number } {\n const MAX = 2048;\n const scale = Math.min(1, MAX / Math.max(srcW, srcH));\n return { renderW: Math.round(srcW * scale), renderH: Math.round(srcH * scale) };\n}\n\n/**\n * Size the canvas to fit a container while maintaining aspect ratio.\n *\n * **Quality approach (matching the playground):**\n * - The canvas _buffer_ is set to source dimensions × DPR so characters are\n * rendered at their natural font size (well above the 6 px fast-rect cutoff).\n * - `ctx.scale(dpr)` maps the source-sized coordinate space into the DPR-scaled\n * buffer for crisp Retina text.\n * - CSS `width`/`height` is the container-fitted display size — the browser's\n * compositor handles the high-quality visual down-scale.\n *\n * Returns the render dimensions and DPR factor the caller should use for\n * all subsequent `imageToAsciiFrame` / `renderFrameToCanvas` calls.\n */\nfunction sizeCanvasToContainer(\n canvas: HTMLCanvasElement,\n container: HTMLElement,\n aspect: number,\n srcW?: number,\n srcH?: number,\n): { renderW: number; renderH: number; dpr: number } {\n const { width, height } = container.getBoundingClientRect();\n if (!width || !height) return { renderW: 0, renderH: 0, dpr: 1 };\n\n // CSS display size — fits inside the container keeping aspect ratio.\n let cssW = width, cssH = cssW / aspect;\n if (cssH > height) { cssH = height; cssW = cssH * aspect; }\n cssW = Math.round(cssW);\n cssH = Math.round(cssH);\n\n // Render dimensions = source size (capped) for high-quality frame generation.\n // Fall back to CSS size when no source dims are available.\n let renderW: number, renderH: number;\n if (srcW && srcH) {\n ({ renderW, renderH } = computeRenderDims(srcW, srcH));\n } else {\n renderW = cssW;\n renderH = cssH;\n }\n\n // DPR for crisp Retina text, capped so the total buffer stays ≤ ~8 MP.\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n canvas.style.width = cssW + 'px';\n canvas.style.height = cssH + 'px';\n\n return { renderW, renderH, dpr: cappedDpr };\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * When hover options are active (`hoverStrength > 0` in `options`), the engine\n * automatically sets up mouse tracking and a `requestAnimationFrame` loop so\n * the hover effect works out of the box. In that case, a `stop()` function is\n * returned to tear down the loop and listeners.\n *\n * @example\n * // Static (no hover):\n * await asciify('/photo.jpg', canvas);\n *\n * // With hover — returns a cleanup handle:\n * const stop = await asciify('/photo.jpg', canvas, {\n * options: { hoverEffect: 'glitchText', hoverStrength: 0.8, hoverText: 'HI' }\n * });\n * // later: stop?.();\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<(() => void) | void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[artStyle];\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize: resolvedFontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n // Use source dims for frame gen → maximum detail.\n const { w: srcW, h: srcH } = getSourceDims(el);\n const { renderW, renderH } = computeRenderDims(srcW, srcH);\n\n // DPR scaling for crisp Retina text\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n if (canvas.width < renderW || canvas.height < renderH) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n\n const { frame } = imageToAsciiFrame(el, merged, renderW, renderH);\n\n // ── Hover-interactive mode ──────────────────────────────────────────\n // When hoverStrength > 0, set up mouse tracking + RAF loop automatically.\n if (merged.hoverStrength > 0) {\n let hoverPos: { x: number; y: number } | null = null;\n let cancelled = false;\n let rafId = 0;\n\n const onMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n hoverPos = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height,\n };\n };\n const onMouseLeave = () => { hoverPos = null; };\n\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n\n const tick = (t: number) => {\n if (cancelled) return;\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH, t / 1000, hoverPos);\n ctx.restore();\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n };\n }\n\n // ── Static mode (no hover) ─────────────────────────────────────────\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH);\n ctx.restore();\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[artStyle], ...options, fontSize: resolvedFontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Render a video as ASCII art on a canvas. Defaults to live streaming —\n * instant start, constant memory, unlimited duration.\n *\n * Pass `{ preExtract: true }` to pre-decode all frames before playback starts\n * (useful for short clips that need frame-perfect looping).\n *\n * Pass `{ fitTo: '#container' }` to automatically size and re-size the canvas\n * to fill a container element, maintaining the video's aspect ratio.\n *\n * Returns a `stop()` function that cancels the loop and cleans up.\n *\n * ⚠️ Never set the backing `<video>` to `display: none` — browsers skip GPU\n * frame decoding for hidden elements. When given a URL string, this function\n * handles that automatically.\n *\n * @example\n * // Minimal\n * const stop = await asciifyVideo('/clip.mp4', canvas);\n *\n * // Fit to container, re-size on window resize:\n * const stop = await asciifyVideo('/clip.mp4', canvas, { fitTo: '#hero' });\n *\n * // Pre-extract frames (old behavior):\n * const stop = await asciifyVideo('/clip.mp4', canvas, { preExtract: true });\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize, artStyle = 'classic', options = {}, fitTo, preExtract = false, trim, onReady, onFrame }: AsciifyVideoOptions = {}\n): Promise<() => void> {\n const trimStart = trim?.start ?? 0;\n const trimEnd = trim?.end;\n const resolvedFontSize = fontSize ?? options.fontSize ?? 10;\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[artStyle], ...options, fontSize: resolvedFontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('asciifyVideo: could not get 2d context from canvas.');\n\n const container: HTMLElement | null =\n typeof fitTo === 'string' ? document.querySelector<HTMLElement>(fitTo) :\n fitTo instanceof HTMLElement ? fitTo : null;\n\n // ── Pre-extract mode ─────────────────────────────────────────────────────\n if (preExtract) {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n if (video.readyState < 2) {\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`asciifyVideo: failed to load \"${source}\"`));\n });\n }\n } else {\n video = source;\n }\n\n if (container) sizeCanvasToContainer(canvas, container, video.videoWidth / video.videoHeight, video.videoWidth, video.videoHeight);\n\n // Render dimensions = source size for maximum detail\n const { renderW, renderH } = computeRenderDims(video.videoWidth, video.videoHeight);\n\n // Compute DPR for the canvas buffer\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n\n // Ensure buffer is large enough\n if (canvas.width < Math.round(renderW * cappedDpr)) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n\n const maxDur = trimEnd !== undefined ? trimEnd - trimStart : 10;\n const { frames, fps } = await videoToAsciiFrames(video, merged, renderW, renderH, undefined, maxDur, undefined, trimStart);\n let cancelled = false, animId: number, i = 0, last = performance.now();\n let firstFrame = true;\n const interval = 1000 / fps;\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n ctx.save();\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n renderFrameToCanvas(ctx, frames[i], merged, renderW, renderH);\n ctx.restore();\n i = (i + 1) % frames.length;\n last = now;\n if (firstFrame) { firstFrame = false; onReady?.(video); }\n onFrame?.();\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n }\n\n // ── Live streaming mode (default) ────────────────────────────────────────\n let video: HTMLVideoElement;\n let ownedVideo = false;\n\n if (typeof source === 'string') {\n // Keep off-screen but not display:none — browsers skip GPU decoding for hidden elements\n video = document.createElement('video');\n video.src = source;\n video.muted = true;\n video.loop = true;\n video.playsInline = true;\n video.setAttribute('playsinline', '');\n Object.assign(video.style, {\n position: 'fixed', top: '0', left: '0',\n width: '1px', height: '1px',\n opacity: '0', pointerEvents: 'none', zIndex: '-1',\n });\n document.body.appendChild(video);\n ownedVideo = true;\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`asciifyVideo: failed to load \"${source}\"`));\n });\n await video.play().catch(() => {});\n } else {\n video = source;\n if (video.paused) await video.play().catch(() => {});\n }\n\n // Apply trim start\n if (trimStart > 0) {\n video.currentTime = trimStart;\n await new Promise<void>(resolve => {\n const h = () => { video.removeEventListener('seeked', h); resolve(); };\n video.addEventListener('seeked', h);\n });\n }\n\n // Enforce trim bounds — seek back to trimStart when the video loops to 0\n // or when currentTime exceeds trimEnd.\n let timeupdateHandler: (() => void) | null = null;\n if (trimStart > 0 || trimEnd !== undefined) {\n timeupdateHandler = () => {\n if (trimEnd !== undefined && video.currentTime >= trimEnd) { video.currentTime = trimStart; }\n else if (trimStart > 0 && video.currentTime < trimStart) { video.currentTime = trimStart; }\n };\n video.addEventListener('timeupdate', timeupdateHandler);\n }\n\n let ro: ResizeObserver | null = null;\n // Render dimensions = source size for maximum detail (same as playground)\n const { renderW, renderH } = computeRenderDims(video.videoWidth, video.videoHeight);\n\n if (container) {\n const aspect = video.videoWidth / video.videoHeight;\n const vw = video.videoWidth, vh = video.videoHeight;\n const sizing = sizeCanvasToContainer(canvas, container, aspect, vw, vh);\n // Apply DPR scale transform once — will be refreshed on resize\n const sCtx = canvas.getContext('2d');\n if (sCtx) sCtx.setTransform(sizing.dpr, 0, 0, sizing.dpr, 0, 0);\n\n ro = new ResizeObserver(() => {\n const s = sizeCanvasToContainer(canvas, container, aspect, vw, vh);\n const rCtx = canvas.getContext('2d');\n if (rCtx) rCtx.setTransform(s.dpr, 0, 0, s.dpr, 0, 0);\n });\n ro.observe(container);\n } else {\n // No container — set up buffer at source dims for quality\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const MAX_PX = 8_000_000;\n const cappedDpr = (renderW * dpr * renderH * dpr > MAX_PX)\n ? Math.sqrt(MAX_PX / (renderW * renderH))\n : dpr;\n if (canvas.width < Math.round(renderW * cappedDpr)) {\n canvas.width = Math.round(renderW * cappedDpr);\n canvas.height = Math.round(renderH * cappedDpr);\n }\n ctx.setTransform(cappedDpr, 0, 0, cappedDpr, 0, 0);\n }\n\n let cancelled = false;\n let animId: number;\n let firstFrame = true;\n const tick = () => {\n if (cancelled) return;\n animId = requestAnimationFrame(tick);\n if (video.readyState < 2 || canvas.width === 0 || canvas.height === 0) return;\n // Skip frames outside trim window (prevents flash at time 0 on loop)\n if (trimStart > 0 && video.currentTime < trimStart) return;\n if (trimEnd !== undefined && video.currentTime >= trimEnd) return;\n\n const { frame } = imageToAsciiFrame(video, merged, renderW, renderH);\n if (frame.length > 0) {\n renderFrameToCanvas(ctx, frame, merged, renderW, renderH, 0, null);\n if (firstFrame) { firstFrame = false; onReady?.(video); }\n onFrame?.();\n }\n };\n animId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(animId);\n ro?.disconnect();\n if (timeupdateHandler) video.removeEventListener('timeupdate', timeupdateHandler);\n if (ownedVideo) {\n video.pause();\n video.src = '';\n document.body.removeChild(video);\n }\n };\n}\n\n/**\n * @deprecated Use {@link asciifyVideo} instead — it now defaults to live streaming\n * and accepts the same options including `fitTo` and `preExtract`.\n */\nexport function asciifyLiveVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n opts?: AsciifyVideoOptions,\n): Promise<() => void> {\n return asciifyVideo(source, canvas, opts);\n}\n\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = undefined as string | undefined,\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#007a5e' : '#00ffcc');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = undefined as string | undefined,\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 55; bgc = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = undefined as string | undefined,\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 55; bgv = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = undefined as string | undefined,\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = undefined as string | undefined,\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderFireBackground — upward-drifting fire simulation using a cellular\n * automata heat-propagation approach rendered as ASCII chars.\n */\nimport { parseColor } from './_shared';\n\nexport interface FireBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters mapped from cool→hot (default: ' .,:;i+xX#&@') */\n chars?: string;\n /** Base flame colour (default: '#ff4500') */\n color?: string;\n /** Secondary hot-tip colour (default: '#ffe066') */\n hotColor?: string;\n /** Flame intensity 0–1 (default: 0.85) */\n intensity?: number;\n /** Horizontal wind force -1..1 (default: 0) */\n wind?: number;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Light mode: invert text colours (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderFireBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: FireBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;i+xX#&@',\n color = '#ff4500',\n hotColor = '#ffe066',\n intensity = 0.85,\n wind = 0,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const len = cols * rows;\n\n // Persistent heat buffer stored on the canvas element to survive redraws.\n const key = '__fire_heat__';\n const canvasAny = ctx.canvas as unknown as Record<string, Float32Array>;\n let heat: Float32Array = canvasAny[key] as Float32Array;\n if (!heat || heat.length !== len) {\n heat = new Float32Array(len);\n canvasAny[key] = heat;\n }\n\n const dt = 0.016 * speed;\n const coolingRate = 0.18 * dt;\n const windShift = wind * speed * 0.8;\n\n // Seed the bottom 2 rows with hot cells every frame.\n const baseRow = rows - 1;\n const t = time * speed;\n for (let c = 0; c < cols; c++) {\n const flicker = Math.sin(c * 0.31 + t * 4.1) * 0.5 + 0.5;\n const flicker2 = Math.sin(c * 0.73 - t * 2.7) * 0.5 + 0.5;\n const seed = (flicker * 0.6 + flicker2 * 0.4) * intensity;\n heat[baseRow * cols + c] = Math.min(1, seed + Math.random() * 0.15 * intensity);\n if (baseRow > 0) heat[(baseRow - 1) * cols + c] = Math.min(1, seed * 0.85 + Math.random() * 0.1 * intensity);\n }\n\n // Propagate heat upward.\n const newHeat = new Float32Array(len);\n for (let r = 0; r < rows - 2; r++) {\n for (let c = 0; c < cols; c++) {\n const below = heat[(r + 1) * cols + c];\n const below2 = heat[(r + 2) * cols + Math.max(0, Math.min(cols - 1, c + Math.round(windShift)))];\n const left = heat[(r + 1) * cols + Math.max(0, c - 1)];\n const right = heat[(r + 1) * cols + Math.min(cols - 1, c + 1)];\n const avg = (below * 0.4 + below2 * 0.25 + left * 0.175 + right * 0.175);\n newHeat[r * cols + c] = Math.max(0, avg - coolingRate - Math.random() * 0.02 * speed);\n }\n }\n // Copy bottom seeded rows unchanged.\n for (let c = 0; c < cols; c++) {\n newHeat[(rows - 1) * cols + c] = heat[(rows - 1) * cols + c];\n if (rows > 1) newHeat[(rows - 2) * cols + c] = heat[(rows - 2) * cols + c];\n }\n canvasAny[key] = newHeat;\n\n // Parse colours.\n const cp = parseColor(color) ?? { r: 255, g: 69, b: 0 };\n const hp = parseColor(hotColor) ?? { r: 255, g: 224, b: 102 };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const v = newHeat[r * cols + c];\n if (v < 0.03) continue;\n\n const charIdx = Math.min(chars.length - 1, Math.floor(v * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n // Interpolate colour from base to hot tip.\n const blend = Math.min(1, v * 1.2);\n const r2 = (cp.r + (hp.r - cp.r) * blend) | 0;\n const g2 = (cp.g + (hp.g - cp.g) * blend) | 0;\n const b2 = (cp.b + (hp.b - cp.b) * blend) | 0;\n\n const alpha = lightMode ? (1 - v * 0.3) : Math.min(1, v + 0.15);\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n ctx.globalAlpha = 1;\n}\n","/**\n * renderDnaBackground — animated double-helix DNA strands scrolling vertically\n * with base-pair characters between them.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface DnaBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for strand nodes (default: 'ATCG') */\n baseChars?: string;\n /** Characters for the connectors between strands (default: '-=≡') */\n bridgeChars?: string;\n /** Primary strand colour (default: '#00e5ff') */\n color?: string;\n /** Secondary strand colour (default: '#ff4081') */\n color2?: string;\n /** Bridge / connector colour (default: '#88ffcc') */\n bridgeColor?: string;\n /** Speed multiplier (default: 1) */\n speed?: number;\n /** Number of helix columns (default: auto, ~1 per 80px) */\n helixCount?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderDnaBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: DnaBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n baseChars = 'ATCG',\n bridgeChars = '-=≡',\n color = '#00e5ff',\n color2 = '#ff4081',\n bridgeColor = '#88ffcc',\n speed = 1,\n helixCount,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const numHelix = helixCount ?? Math.max(1, Math.floor(width / 80));\n const sectionW = cols / numHelix;\n\n const cp = parseColor(color) ?? { r: 0, g: 229, b: 255 };\n const cp2 = parseColor(color2) ?? { r: 255, g: 64, b: 129 };\n const bp = parseColor(bridgeColor) ?? { r: 136, g: 255, b: 204 };\n\n const defaultColor = lightMode ? 'rgb(55,55,55)' : 'rgb(255,255,255)';\n void defaultColor; // used below\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const amplitude = (sectionW * 0.35);\n\n for (let h = 0; h < numHelix; h++) {\n const centerCol = sectionW * (h + 0.5);\n\n for (let r = 0; r < rows; r++) {\n const phase = (r / rows) * Math.PI * 6 - t * 1.8;\n const strand1ColF = centerCol + Math.sin(phase) * amplitude;\n const strand2ColF = centerCol + Math.sin(phase + Math.PI) * amplitude;\n const strand1Col = Math.round(strand1ColF);\n const strand2Col = Math.round(strand2ColF);\n\n if (strand1Col < 0 || strand1Col >= cols) continue;\n const baseSeed1 = hash2(h * 31 + r * 7, 3);\n const ch1 = baseChars[Math.floor(baseSeed1 * baseChars.length)];\n\n // Depth cue: alpha based on sine value (-1..1)\n const depth1 = (Math.sin(phase) + 1) * 0.5;\n const depth2 = (Math.sin(phase + Math.PI) + 1) * 0.5;\n\n ctx.globalAlpha = 0.35 + depth1 * 0.65;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n ctx.fillText(ch1, strand1Col * charW, r * lineH);\n\n if (strand2Col >= 0 && strand2Col < cols) {\n const baseSeed2 = hash2(h * 53 + r * 11, 7);\n const ch2 = baseChars[Math.floor(baseSeed2 * baseChars.length)];\n ctx.globalAlpha = 0.35 + depth2 * 0.65;\n ctx.fillStyle = `rgb(${cp2.r},${cp2.g},${cp2.b})`;\n ctx.fillText(ch2, strand2Col * charW, r * lineH);\n }\n\n // Draw bridge every ~3 rows when strands are roughly horizontal.\n const bridgeInterval = 3;\n if (r % bridgeInterval === 0) {\n const minC = Math.min(strand1Col, strand2Col);\n const maxC = Math.max(strand1Col, strand2Col);\n const bridgeLen = maxC - minC;\n if (bridgeLen > 1) {\n const bSeed = hash2(r * 17 + h * 43, 5);\n const bCh = bridgeChars[Math.floor(bSeed * bridgeChars.length)];\n const midBridgeAlpha = (depth1 + depth2) * 0.25 + 0.2;\n ctx.globalAlpha = midBridgeAlpha;\n ctx.fillStyle = `rgb(${bp.r},${bp.g},${bp.b})`;\n for (let bc = minC + 1; bc < maxC; bc++) {\n ctx.fillText(bCh, bc * charW, r * lineH);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderTerrainBackground — scrolling ASCII side-scroll heightmap landscape\n * generated from layered Perlin-style noise.\n */\nimport { parseColor, fbm, hash2 } from './_shared';\n\nexport interface TerrainBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for terrain density (default: ' .,:;+*#@') */\n chars?: string;\n /** Foreground ground colour (default: '#4caf50') */\n color?: string;\n /** Sky / star colour (default: '#1a237e') */\n skyColor?: string;\n /** Peak / snow-cap colour (default: '#e0e0e0') */\n peakColor?: string;\n /** Horizontal scroll speed (default: 1) */\n speed?: number;\n /** Terrain roughness 0.1–1 (default: 0.55) */\n roughness?: number;\n /** Mountain height fraction 0–1 (default: 0.55) */\n heightScale?: number;\n /** Show faint background stars (default: true) */\n stars?: boolean;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderTerrainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: TerrainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;+*#@',\n color = '#4caf50',\n skyColor = '#1a237e',\n peakColor = '#e0e0e0',\n speed = 1,\n roughness = 0.55,\n heightScale = 0.55,\n stars = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 76, g: 175, b: 80 };\n const sky = parseColor(skyColor) ?? { r: 26, g: 35, b: 126 };\n const peak = parseColor(peakColor) ?? { r: 224, g: 224, b: 224 };\n void lightMode;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const scroll = time * speed * 0.4;\n\n // Pre-compute terrain height per column.\n const terrainRow: number[] = new Array(cols);\n for (let c = 0; c < cols; c++) {\n const nx = (c / cols + scroll) * roughness * 3;\n const h = (fbm(nx, 0.5) * 0.5 + 0.5) * heightScale;\n terrainRow[c] = Math.floor(h * rows);\n }\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const terrainStart = rows - 1 - terrainRow[c];\n const isGround = r >= terrainStart;\n const isNearPeak = r === terrainStart;\n\n if (!isGround) {\n // Sky region: occasional stars.\n if (stars) {\n const starSeed = hash2(c * 7 + Math.floor(scroll * 0.3), r * 13);\n if (starSeed > 0.97) {\n const twinkle = Math.sin(time * 2 + starSeed * 100) * 0.3 + 0.7;\n ctx.globalAlpha = twinkle * 0.5;\n ctx.fillStyle = `rgb(${sky.r + 60},${sky.g + 60},${sky.b + 80})`;\n ctx.fillText('·', c * charW, r * lineH);\n }\n }\n continue;\n }\n\n // Ground: depth based on distance from surface.\n const depth = (r - terrainStart) / Math.max(1, terrainRow[c]);\n const charIdx = Math.min(chars.length - 1, Math.floor(depth * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ' && !isNearPeak) continue;\n\n const blendPeak = isNearPeak ? 1 : Math.max(0, 1 - depth * 4);\n const r2 = ((cp.r + (peak.r - cp.r) * blendPeak) | 0);\n const g2 = ((cp.g + (peak.g - cp.g) * blendPeak) | 0);\n const b2 = ((cp.b + (peak.b - cp.b) * blendPeak) | 0);\n\n ctx.globalAlpha = 0.5 + depth * 0.5;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(isNearPeak ? chars[chars.length - 1] : ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderCircuitBackground — procedural PCB trace growth with signal pulses\n * traveling along horizontal and vertical edges.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface CircuitBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Trace characters (default: '─│┌┐└┘├┤┬┴┼') */\n chars?: string;\n /** Trace colour (default: '#00ff88') */\n color?: string;\n /** Signal pulse colour (default: '#ffffff') */\n pulseColor?: string;\n /** Fraction of cells that have a trace (default: 0.38) */\n density?: number;\n /** Signal pulse speed (default: 1) */\n speed?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\n// Direction flags (bit-field per cell)\nconst EAST = 1;\nconst WEST = 2;\nconst NORTH = 4;\nconst SOUTH = 8;\n\nconst DIR_CHARS: Record<number, string> = {\n [EAST | WEST]: '─',\n [NORTH | SOUTH]: '│',\n [EAST | SOUTH]: '┌',\n [WEST | SOUTH]: '┐',\n [EAST | NORTH]: '└',\n [WEST | NORTH]: '┘',\n [EAST | WEST | SOUTH]: '┬',\n [EAST | WEST | NORTH]: '┴',\n [NORTH | SOUTH | EAST]: '├',\n [NORTH | SOUTH | WEST]: '┤',\n [EAST | WEST | NORTH | SOUTH]: '┼',\n [EAST]: '╶',\n [WEST]: '╴',\n [NORTH]: '╵',\n [SOUTH]: '╷',\n};\n\nexport function renderCircuitBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: CircuitBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n pulseColor = '#ffffff',\n color = '#00ff88',\n density = 0.38,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 0, g: 255, b: 136 };\n const pp = parseColor(pulseColor) ?? { r: 255, g: 255, b: 255 };\n void lightMode;\n\n // Build a stable grid from hash functions (no per-frame allocation).\n // Each cell stores a bitmask of connections.\n const getConnections = (c: number, r: number): number => {\n if (hash2(c * 17 + 1, r * 7 + 2) > density) return 0;\n let mask = 0;\n if (c + 1 < cols && hash2(c * 17 + 1, r * 7 + 2) > 0.15) mask |= EAST;\n if (c - 1 >= 0 && hash2((c-1)*17+1, r*7+2) > 0.15) mask |= WEST;\n if (r + 1 < rows && hash2(c * 17 + 1, (r+1)*7+2) > 0.15) mask |= SOUTH;\n if (r - 1 >= 0 && hash2(c*17+1,(r-1)*7+2) > 0.15) mask |= NORTH;\n return mask;\n };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const mask = getConnections(c, r);\n if (mask === 0) continue;\n\n const ch = DIR_CHARS[mask] ?? '·';\n\n // Pulse wave along horizontal traces.\n const pulsePosH = ((t * 8 + hash2(c, r * 23) * 40) % cols);\n const pulsePosV = ((t * 6 + hash2(r * 17, c * 11) * 40) % rows);\n const nearH = (mask & EAST || mask & WEST) && Math.abs(c - pulsePosH) < 1.5;\n const nearV = (mask & NORTH || mask & SOUTH) && Math.abs(r - pulsePosV) < 1.5;\n const isPulse = nearH || nearV;\n\n const baseAlpha = 0.25 + hash2(c * 3, r * 5) * 0.35;\n\n if (isPulse) {\n ctx.globalAlpha = 0.95;\n ctx.fillStyle = `rgb(${pp.r},${pp.g},${pp.b})`;\n } else {\n ctx.globalAlpha = baseAlpha;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n }\n\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nexport type { FireBackgroundOptions } from './fire';\nexport { renderFireBackground } from './fire';\n\nexport type { DnaBackgroundOptions } from './dna';\nexport { renderDnaBackground } from './dna';\n\nexport type { TerrainBackgroundOptions } from './terrain';\nexport { renderTerrainBackground } from './terrain';\n\nexport type { CircuitBackgroundOptions } from './circuit';\nexport { renderCircuitBackground } from './circuit';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\nimport { renderFireBackground } from './fire';\nimport type { FireBackgroundOptions } from './fire';\nimport { renderDnaBackground } from './dna';\nimport type { DnaBackgroundOptions } from './dna';\nimport { renderTerrainBackground } from './terrain';\nimport type { TerrainBackgroundOptions } from './terrain';\nimport { renderCircuitBackground } from './circuit';\nimport type { CircuitBackgroundOptions } from './circuit';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions,\n FireBackgroundOptions,\n DnaBackgroundOptions,\n TerrainBackgroundOptions,\n CircuitBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n * - 'fire' — upward cellular-automata flame simulation\n * - 'dna' — double-helix strand scrolling with base-pair chars\n * - 'terrain' — scrolling ASCII side-scroll heightmap landscape\n * - 'circuit' — procedural PCB traces with traveling signal pulses\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph' | 'fire' | 'dna' | 'terrain' | 'circuit';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * All supported background type identifiers — single source of truth for\n * counts, type-safe option values, and documentation.\n */\nexport const BACKGROUND_TYPES = [\n 'wave', 'rain', 'stars', 'pulse', 'noise', 'grid',\n 'aurora', 'silk', 'void', 'morph',\n 'fire', 'dna', 'terrain', 'circuit',\n] as const;\n\nexport type BackgroundType = typeof BACKGROUND_TYPES[number];\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions | FireBackgroundOptions | DnaBackgroundOptions\n | TerrainBackgroundOptions | CircuitBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n const buildFireOpts = (): FireBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as FireBackgroundOptions).color,\n });\n const buildDnaOpts = (): DnaBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as DnaBackgroundOptions).color,\n });\n const buildTerrainOpts = (): TerrainBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as TerrainBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n const buildCircuitOpts = (): CircuitBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as CircuitBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else if (type === 'fire') optsRef.current = buildFireOpts();\n else if (type === 'dna') optsRef.current = buildDnaOpts();\n else if (type === 'terrain') optsRef.current = buildTerrainOpts();\n else if (type === 'circuit') optsRef.current = buildCircuitOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else if (type === 'fire') {\n renderFireBackground(ctx, r.width, r.height, time, optsRef.current as FireBackgroundOptions);\n } else if (type === 'dna') {\n renderDnaBackground(ctx, r.width, r.height, time, optsRef.current as DnaBackgroundOptions);\n } else if (type === 'terrain') {\n renderTerrainBackground(ctx, r.width, r.height, time, optsRef.current as TerrainBackgroundOptions);\n } else if (type === 'circuit') {\n renderCircuitBackground(ctx, r.width, r.height, time, optsRef.current as CircuitBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","/**\n * asciiText — pure string output (no canvas required).\n * Converts an image/video/canvas element to a plain-text ASCII string\n * suitable for server-side rendering, clipboard export, or terminal output.\n */\nimport type { AsciiOptions } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { imageToAsciiFrame } from './renderer';\n\n/**\n * Convert any image/video/canvas source to a plain multi-line string of ASCII.\n *\n * @example\n * ```ts\n * const text = asciiText(imgEl, { fontSize: 8, colorMode: 'grayscale' });\n * console.log(text);\n * ```\n *\n * @example SSR (Node/JSDOM)\n * ```ts\n * const { createCanvas, loadImage } = require('@napi-rs/canvas');\n * const img = await loadImage('./photo.jpg');\n * const canvas = createCanvas(img.width, img.height);\n * const ctx = canvas.getContext('2d');\n * ctx.drawImage(img, 0, 0);\n * const text = asciiText(canvas as unknown as HTMLCanvasElement, { fontSize: 10 });\n * ```\n */\nexport function asciiText(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const lines: string[] = [];\n for (const row of frame) {\n lines.push(row.map(cell => cell.char).join(''));\n }\n return lines.join('\\n');\n}\n\n/**\n * Convert any source to an ASCII string with ANSI 256-colour escape codes.\n * Works in any terminal that supports ANSI colours.\n *\n * @example\n * ```ts\n * process.stdout.write(asciiTextAnsi(imgEl, { fontSize: 8 }));\n * ```\n */\nexport function asciiTextAnsi(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const RESET = '\\x1b[0m';\n const lines: string[] = [];\n\n for (const row of frame) {\n let line = '';\n for (const cell of row) {\n if (cell.char === ' ' || cell.a < 10) {\n line += ' ';\n } else {\n // Truecolor ANSI: \\x1b[38;2;R;G;Bm\n line += `\\x1b[38;2;${cell.r};${cell.g};${cell.b}m${cell.char}${RESET}`;\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n}\n","/**\n * text-frame.ts — Build and render ASCII frames from tiling text patterns.\n *\n * Enables interactive text backgrounds with the full hover-effect system\n * (spotlight, magnify, repel, glow, colorShift, …) without needing an image\n * source.\n *\n * @example — basic usage\n * ```ts\n * import { renderTextBackground } from 'asciify-engine';\n *\n * function tick(ctx, w, h, mousePos) {\n * renderTextBackground(ctx, w, h, 'asciify·engine·v1·', {\n * hoverEffect: 'spotlight',\n * hoverColor: '#d4ff00',\n * }, mousePos);\n * requestAnimationFrame(() => tick(ctx, w, h, mousePos));\n * }\n * ```\n *\n * @example — build the frame yourself and pass it to renderFrameToCanvas\n * ```ts\n * import { buildTextFrame, renderFrameToCanvas, DEFAULT_OPTIONS } from 'asciify-engine';\n *\n * const frame = buildTextFrame('hello world · ', 80, 24);\n * renderFrameToCanvas(ctx, frame, {\n * ...DEFAULT_OPTIONS,\n * hoverEffect: 'repel',\n * hoverStrength: 0.9,\n * hoverColor: '#a0e8ff',\n * }, width, height, 0, mousePos);\n * ```\n */\n\nimport type { AsciiFrame, AsciiOptions, HoverEffect } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseColor } from '../backgrounds/_shared';\nimport { renderFrameToCanvas } from './renderer';\n\n// ─── Public types ──────────────────────────────────────────────────────────\n\nexport interface TextBackgroundOptions {\n /**\n * Character size in pixels.\n * Controls the grid density: smaller → more cells, finer text.\n * @default 10\n */\n fontSize?: number;\n\n /**\n * Line-height multiplier applied on top of `fontSize` to derive row height.\n * Matches the default monospace aspect ratio used by the renderer.\n * @default 1.6\n */\n lineHeight?: number;\n\n /**\n * Base colour for the text cells (inactive state).\n * Accepts any CSS hex or rgb string.\n * @default '#505050'\n */\n color?: string;\n\n /**\n * Base alpha for the text cells, 0–255.\n * @default 100\n */\n opacity?: number;\n\n /**\n * Which hover effect to activate when `hoverPos` is supplied.\n * @default 'spotlight'\n */\n hoverEffect?: HoverEffect;\n\n /**\n * Intensity of the hover distortion / glow, 0–1.\n * @default 0.85\n */\n hoverStrength?: number;\n\n /**\n * Normalised radius of the hover influence zone, 0–1.\n * @default 0.18\n */\n hoverRadius?: number;\n\n /**\n * Accent colour applied by the hover effect.\n * @default '#d4ff00'\n */\n hoverColor?: string;\n}\n\n// ─── buildTextFrame ────────────────────────────────────────────────────────\n\n/**\n * Build an `AsciiFrame` filled with a tiling text pattern.\n *\n * The `text` string is repeated (wrapping at column boundaries) across every\n * cell of the `cols × rows` grid. Each cell carries the supplied base colour\n * and opacity as `{r, g, b, a}` values.\n *\n * The returned frame can be passed directly to `renderFrameToCanvas` with any\n * `AsciiOptions` including hover effects.\n *\n * @param text - Pattern string to tile across the grid (e.g. `'hello · '`)\n * @param cols - Number of character columns\n * @param rows - Number of character rows\n * @param color - Base RGB colour string for the cells (default: `'#505050'`)\n * @param opacity - Base alpha 0–255 (default: `100`)\n */\nexport function buildTextFrame(\n text: string,\n cols: number,\n rows: number,\n color: string = '#505050',\n opacity: number = 100,\n): AsciiFrame {\n if (!text || cols <= 0 || rows <= 0) return [];\n const parsed = parseColor(color) ?? { r: 80, g: 80, b: 80 };\n const pattern = text;\n const len = pattern.length;\n\n return Array.from({ length: rows }, (_, row) =>\n Array.from({ length: cols }, (_, col) => ({\n char: pattern[(row * cols + col) % len],\n r: parsed.r,\n g: parsed.g,\n b: parsed.b,\n a: opacity,\n }))\n );\n}\n\n// ─── renderTextBackground ─────────────────────────────────────────────────\n\n/**\n * All-in-one: build a tiling text grid and render it to a canvas with the\n * full hover-effect system (spotlight, magnify, repel, glow, colorShift, …).\n *\n * Call this inside a `requestAnimationFrame` loop, passing updated `hoverPos`\n * each frame to get smooth interactive effects.\n *\n * @param ctx - 2D rendering context of the target canvas\n * @param width - Canvas logical width in pixels\n * @param height - Canvas logical height in pixels\n * @param text - Pattern string to tile (e.g. `'asciify·engine·v1·'`)\n * @param options - {@link TextBackgroundOptions}\n * @param hoverPos - Normalised mouse position `{x, y}` in 0–1 range,\n * optionally with an `intensity` multiplier (0–1).\n * Pass `null` or omit to render without hover.\n */\nexport function renderTextBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n text: string,\n options: TextBackgroundOptions = {},\n hoverPos?: { x: number; y: number; intensity?: number } | null,\n): void {\n const {\n fontSize = 10,\n lineHeight = 1.6,\n color = '#505050',\n opacity = 100,\n hoverEffect = 'spotlight',\n hoverStrength = 0.85,\n hoverRadius = 0.18,\n hoverColor = '#d4ff00',\n } = options;\n\n const cols = Math.max(1, Math.floor(width / fontSize));\n const rows = Math.max(1, Math.floor(height / (fontSize * lineHeight)));\n\n const frame = buildTextFrame(text, cols, rows, color, opacity);\n\n const renderOpts: AsciiOptions = {\n ...DEFAULT_OPTIONS,\n fontSize,\n hoverEffect,\n hoverStrength,\n hoverRadius,\n hoverColor,\n };\n\n renderFrameToCanvas(ctx, frame, renderOpts, width, height, 0, hoverPos ?? null);\n}\n","// ── Snapshot ─────────────────────────────────────────────────────────────\n\nexport interface SnapshotOptions {\n /**\n * Image format.\n * - 'png' — lossless (default)\n * - 'jpeg' — smaller, no transparency\n * - 'webp' — best compression with transparency\n */\n format?: 'png' | 'jpeg' | 'webp';\n /** 0–1 quality for jpeg/webp. Default: 0.92 */\n quality?: number;\n /**\n * Scale factor applied before capture. Default: 1.\n * Use 2 for a high-resolution export at 2× the canvas size.\n */\n scale?: number;\n}\n\n/**\n * Capture a single frame from a canvas as a Blob.\n *\n * @example\n * ```ts\n * const blob = await captureSnapshot(canvas);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport function captureSnapshot(\n canvas: HTMLCanvasElement,\n { format = 'png', quality = 0.92, scale = 1 }: SnapshotOptions = {},\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let src: HTMLCanvasElement = canvas;\n if (scale !== 1) {\n const off = document.createElement('canvas');\n off.width = Math.round(canvas.width * scale);\n off.height = Math.round(canvas.height * scale);\n const offCtx = off.getContext('2d');\n if (!offCtx) { reject(new Error('captureSnapshot: could not get 2d context')); return; }\n offCtx.drawImage(canvas, 0, 0, off.width, off.height);\n src = off;\n }\n src.toBlob(\n (blob) => blob ? resolve(blob) : reject(new Error('captureSnapshot: toBlob returned null')),\n `image/${format}`,\n quality,\n );\n });\n}\n\n/**\n * Capture a single frame and immediately trigger a browser download.\n *\n * @example\n * ```ts\n * await snapshotAndDownload(canvas);\n * await snapshotAndDownload(canvas, { format: 'jpeg', filename: 'my-art' });\n * ```\n */\nexport async function snapshotAndDownload(\n canvas: HTMLCanvasElement,\n options: SnapshotOptions & { filename?: string } = {},\n): Promise<void> {\n const { filename = 'asciify-snapshot', format = 'png', ...snapOpts } = options;\n const blob = await captureSnapshot(canvas, { format, ...snapOpts });\n const ext = format === 'jpeg' ? 'jpg' : format;\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${filename}.${ext}`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 10_000);\n}\n","/**\n * asciifyWebcam — live webcam → ASCII art on canvas.\n *\n * Requests camera access, attaches the stream to a hidden video element, and\n * runs a rAF loop that converts each frame to ASCII and renders it onto a\n * supplied canvas.\n *\n * @example\n * const stop = await asciifyWebcam(canvas);\n * // later: stop();\n *\n * @example\n * const stop = await asciifyWebcam(canvas, {\n * fontSize: 8,\n * style: 'terminal',\n * mirror: true, // horizontal flip (selfie mode)\n * constraints: { facingMode: 'user' },\n * });\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, renderFrameToCanvas } from './renderer';\n\nexport interface WebcamOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra AsciiOptions merged on top of the preset */\n options?: Partial<AsciiOptions>;\n /**\n * Called every frame to get the latest options. Takes priority over `options`.\n * Use this to keep the rendering in sync with live UI controls without\n * restarting the camera.\n *\n * @example\n * const optionsRef = useRef(currentOptions);\n * optionsRef.current = currentOptions;\n * asciifyWebcam(canvas, { liveOptions: () => optionsRef.current });\n */\n liveOptions?: () => Partial<AsciiOptions>;\n /**\n * Flip the output horizontally so it reads like a mirror / selfie camera.\n * Default: true\n */\n mirror?: boolean;\n /**\n * Passed directly to `getUserMedia({ video: constraints })`.\n * Defaults to `{ facingMode: 'user' }`.\n */\n constraints?: MediaTrackConstraints;\n /**\n * Device pixel ratio used to compute logical render dimensions from the\n * canvas's physical pixel size. Defaults to `window.devicePixelRatio ?? 1`.\n * Set this when you size the canvas at physical resolution (e.g. width × dpr)\n * so that ASCII column/row counts are based on CSS pixels, not physical ones.\n */\n dpr?: number;\n}\n\n/**\n * Start a live webcam ASCII-art loop and render it onto `canvas`.\n * Returns a `stop()` function that cancels the loop and releases the camera.\n *\n * Throws if the browser doesn't support `getUserMedia` or the user denies\n * camera permission.\n */\nexport async function asciifyWebcam(\n canvas: HTMLCanvasElement,\n {\n fontSize = 10,\n style = 'classic',\n options = {},\n liveOptions,\n mirror = true,\n constraints = { facingMode: 'user' },\n dpr: dprOverride,\n }: WebcamOptions = {}\n): Promise<() => void> {\n if (!navigator.mediaDevices?.getUserMedia) {\n throw new Error('asciifyWebcam: getUserMedia is not supported in this browser.');\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ video: constraints });\n\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n video.playsInline = true;\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error('asciifyWebcam: video stream failed to load.'));\n video.play().catch(reject);\n });\n\n const merged: AsciiOptions = {\n ...DEFAULT_OPTIONS,\n ...ART_STYLE_PRESETS[style],\n ...options,\n fontSize,\n };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('asciifyWebcam: could not get 2d context from canvas.');\n\n // ── DPR — scale ctx once so renderFrameToCanvas uses CSS (logical) pixels ──\n const deviceRatio = dprOverride ?? (typeof window !== 'undefined' ? window.devicePixelRatio : 1) ?? 1;\n if (deviceRatio !== 1) {\n ctx.scale(deviceRatio, deviceRatio);\n }\n\n // ── Hover tracking ────────────────────────────────────────────────────────\n let hoverPos: { x: number; y: number } | null = null;\n const smoothHover = { x: 0.5, y: 0.5, intensity: 0 };\n\n const onMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n hoverPos = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height,\n };\n };\n const onMouseLeave = () => { hoverPos = null; };\n\n if (merged.hoverStrength > 0) {\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n }\n\n let cancelled = false;\n let animId: number;\n const startTime = performance.now();\n\n const tick = (timestamp: number) => {\n if (cancelled) return;\n\n if (video.readyState >= video.HAVE_CURRENT_DATA) {\n // Logical (CSS) dimensions — used for ASCII column/row count\n const displayW = canvas.width / deviceRatio;\n const displayH = canvas.height / deviceRatio;\n const elapsed = (timestamp - startTime) / 1000;\n\n // Merge live options on top of base if a getter was provided\n const frameOptions: AsciiOptions = liveOptions\n ? { ...merged, ...liveOptions() }\n : merged;\n\n // Sync hover listeners when hoverStrength changes via liveOptions\n const wantsHover = frameOptions.hoverStrength > 0;\n if (wantsHover) {\n canvas.addEventListener('mousemove', onMouseMove);\n canvas.addEventListener('mouseleave', onMouseLeave);\n } else {\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n }\n\n const { frame } = imageToAsciiFrame(video, frameOptions, displayW, displayH);\n\n // Smooth hover interpolation\n if (hoverPos) {\n const dx = hoverPos.x - smoothHover.x;\n const dy = hoverPos.y - smoothHover.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const speed = Math.min(0.25, 0.06 + dist * 0.8);\n smoothHover.x += dx * speed;\n smoothHover.y += dy * speed;\n smoothHover.intensity += (1 - smoothHover.intensity) * 0.12;\n } else {\n smoothHover.intensity *= 0.965;\n if (smoothHover.intensity < 0.003) smoothHover.intensity = 0;\n }\n\n const hoverArg = smoothHover.intensity > 0.003\n ? { x: smoothHover.x, y: smoothHover.y, intensity: smoothHover.intensity }\n : null;\n\n if (mirror) {\n ctx.save();\n ctx.scale(-1, 1);\n ctx.translate(-displayW, 0);\n renderFrameToCanvas(ctx, frame, frameOptions, displayW, displayH, elapsed, hoverArg);\n ctx.restore();\n } else {\n renderFrameToCanvas(ctx, frame, frameOptions, displayW, displayH, elapsed, hoverArg);\n }\n }\n\n animId = requestAnimationFrame(tick);\n };\n\n animId = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(animId);\n canvas.removeEventListener('mousemove', onMouseMove);\n canvas.removeEventListener('mouseleave', onMouseLeave);\n stream.getTracks().forEach(t => t.stop());\n video.srcObject = null;\n };\n}\n","/**\n * big-text.ts — ASCII text rendering via an embedded 7×7 bitmap font.\n *\n * Each character is defined as 7 rows × 7 pixels stored as compact bit-patterns.\n * No canvas, no font files, no pixel-sampling — output is always crisp and readable.\n *\n * @example\n * ```ts\n * import { asciifyText } from 'asciify-engine';\n * console.log(asciifyText('Hello!'));\n * console.log(asciifyText('v2', { scale: 2, char: '#' }));\n * ```\n */\n\n// ─── Bitmap font ───────────────────────────────────────────────────────────\n// Glyph = [row0..row6]. Each row is a 7-bit number:\n// bit 6 (value 64) = leftmost pixel\n// bit 0 (value 1) = rightmost pixel\n\nconst FONT: Record<string, number[]> = {\n // ── Uppercase ──\n 'A': [ 28, 54, 99, 127, 99, 99, 99],\n 'B': [126, 99, 99, 126, 99, 99, 126],\n 'C': [ 62, 99, 96, 96, 96, 99, 62],\n 'D': [124, 102, 99, 99, 99, 102, 124],\n 'E': [127, 96, 96, 124, 96, 96, 127],\n 'F': [127, 96, 96, 124, 96, 96, 96],\n 'G': [ 62, 99, 96, 111, 99, 99, 62],\n 'H': [ 99, 99, 99, 127, 99, 99, 99],\n 'I': [127, 8, 8, 8, 8, 8, 127],\n 'J': [ 63, 6, 6, 6, 102, 102, 60],\n 'K': [ 99, 102, 108, 120, 108, 102, 99],\n 'L': [ 96, 96, 96, 96, 96, 96, 127],\n 'M': [ 99, 119, 107, 107, 99, 99, 99],\n 'N': [ 99, 115, 107, 103, 99, 99, 99],\n 'O': [ 62, 99, 99, 99, 99, 99, 62],\n 'P': [126, 99, 99, 126, 96, 96, 96],\n 'Q': [ 62, 99, 99, 99, 107, 102, 61],\n 'R': [126, 99, 99, 126, 108, 102, 99],\n 'S': [ 62, 99, 96, 62, 3, 99, 62],\n 'T': [127, 8, 8, 8, 8, 8, 8],\n 'U': [ 99, 99, 99, 99, 99, 99, 62],\n 'V': [ 99, 99, 99, 99, 54, 28, 8],\n 'W': [ 99, 99, 99, 107, 107, 54, 20],\n 'X': [ 99, 54, 28, 8, 28, 54, 99],\n 'Y': [ 99, 99, 54, 28, 8, 8, 8],\n 'Z': [127, 3, 6, 12, 24, 48, 127],\n\n // ── Lowercase ──\n 'a': [ 0, 0, 60, 3, 62, 99, 61],\n 'b': [ 96, 96, 124, 99, 99, 99, 124],\n 'c': [ 0, 0, 62, 96, 96, 96, 62],\n 'd': [ 3, 3, 31, 99, 99, 99, 31],\n 'e': [ 0, 0, 62, 99, 127, 96, 62],\n 'f': [ 30, 48, 48, 126, 48, 48, 48],\n 'g': [ 0, 0, 63, 99, 63, 3, 62],\n 'h': [ 96, 96, 124, 99, 99, 99, 99],\n 'i': [ 8, 0, 24, 8, 8, 8, 28],\n 'j': [ 4, 0, 12, 4, 4, 36, 24],\n 'k': [ 96, 96, 102, 108, 120, 108, 102],\n 'l': [ 24, 8, 8, 8, 8, 8, 28],\n 'm': [ 0, 0, 92, 107, 107, 99, 99],\n 'n': [ 0, 0, 94, 99, 99, 99, 99],\n 'o': [ 0, 0, 62, 99, 99, 99, 62],\n 'p': [ 0, 0, 126, 99, 126, 96, 96],\n 'q': [ 0, 0, 63, 99, 63, 3, 3],\n 'r': [ 0, 0, 94, 99, 96, 96, 96],\n 's': [ 0, 0, 62, 96, 62, 3, 124],\n 't': [ 48, 48, 126, 48, 48, 48, 30],\n 'u': [ 0, 0, 99, 99, 99, 103, 59],\n 'v': [ 0, 0, 99, 99, 54, 28, 8],\n 'w': [ 0, 0, 99, 99, 107, 54, 20],\n 'x': [ 0, 0, 99, 54, 28, 54, 99],\n 'y': [ 0, 0, 99, 99, 63, 3, 62],\n 'z': [ 0, 0, 127, 6, 12, 24, 127],\n\n // ── Digits ──\n '0': [ 62, 99, 103, 107, 115, 99, 62],\n '1': [ 8, 24, 56, 8, 8, 8, 62],\n '2': [ 62, 99, 3, 6, 24, 48, 127],\n '3': [ 62, 99, 3, 30, 3, 99, 62],\n '4': [ 6, 14, 22, 38, 127, 6, 6],\n '5': [127, 96, 126, 3, 3, 99, 62],\n '6': [ 62, 99, 96, 126, 99, 99, 62],\n '7': [127, 3, 6, 12, 24, 24, 24],\n '8': [ 62, 99, 99, 62, 99, 99, 62],\n '9': [ 62, 99, 99, 63, 3, 99, 62],\n\n // ── Punctuation & symbols ──\n ' ': [ 0, 0, 0, 0, 0, 0, 0],\n '!': [ 24, 24, 24, 24, 24, 0, 24],\n '?': [ 62, 99, 3, 14, 8, 0, 8],\n '.': [ 0, 0, 0, 0, 0, 24, 24],\n ',': [ 0, 0, 0, 0, 0, 24, 48],\n ';': [ 0, 24, 24, 0, 24, 24, 48],\n ':': [ 0, 24, 24, 0, 24, 24, 0],\n '-': [ 0, 0, 0, 62, 0, 0, 0],\n '_': [ 0, 0, 0, 0, 0, 0, 127],\n \"'\": [ 24, 24, 32, 0, 0, 0, 0],\n '\"': [ 54, 54, 36, 0, 0, 0, 0],\n '`': [ 24, 8, 0, 0, 0, 0, 0],\n ')': [ 24, 12, 6, 6, 6, 12, 24],\n '(': [ 12, 24, 48, 48, 48, 24, 12],\n '[': [ 60, 48, 48, 48, 48, 48, 60],\n ']': [ 30, 6, 6, 6, 6, 6, 30],\n '{': [ 14, 24, 24, 48, 24, 24, 14],\n '}': [ 56, 12, 12, 6, 12, 12, 56],\n '/': [ 3, 6, 12, 24, 48, 96, 0],\n '\\\\': [ 96, 48, 24, 12, 6, 3, 0],\n '|': [ 8, 8, 8, 8, 8, 8, 8],\n '+': [ 0, 8, 8, 62, 8, 8, 0],\n '=': [ 0, 0, 62, 0, 62, 0, 0],\n '*': [ 0, 42, 28, 127, 28, 42, 0],\n '#': [ 36, 36, 127, 36, 127, 36, 36],\n '@': [ 62, 99, 111, 107, 111, 96, 62],\n '&': [ 24, 36, 24, 60, 74, 68, 58],\n '%': [ 99, 38, 4, 8, 16, 50, 99],\n '$': [ 8, 62, 72, 62, 9, 62, 8],\n '^': [ 8, 20, 34, 0, 0, 0, 0],\n '~': [ 0, 0, 50, 76, 0, 0, 0],\n '<': [ 6, 12, 24, 48, 24, 12, 6],\n '>': [ 48, 24, 12, 6, 12, 24, 48],\n};\n\n/** Unknown chars fall back to a 7×7 rectangle outline. */\nconst FALLBACK: number[] = [127, 65, 65, 65, 65, 65, 127];\n\nfunction glyph(ch: string): number[] {\n return FONT[ch] ?? FONT[ch.toUpperCase()] ?? FALLBACK;\n}\n\n// ─── Options ───────────────────────────────────────────────────────────────\n\nexport interface BigTextOptions {\n /**\n * Character used for ink pixels. Any single grapheme — emoji work too.\n * @default '█'\n */\n char?: string;\n /**\n * Pixel scale factor.\n * `1` = each font pixel → 1 char (output is 7 rows tall).\n * `2` = each pixel → 2×2 chars (14 rows tall), etc.\n * @default 1\n */\n scale?: number;\n /** Foreground colour (canvas output only). @default '#d4ff00' */\n color?: string;\n /** Background colour (canvas output only). @default transparent */\n bgColor?: string;\n /** Physical character cell size in px (canvas output only). @default 10 */\n fontSize?: number;\n}\n\n// ─── Public API ────────────────────────────────────────────────────────────\n\n/**\n * Convert a string to multi-line ASCII text art.\n *\n * Uses an embedded 7×7 pixel bitmap font — no font files, no install step,\n * works in every JS environment (browser, Node, Deno, Bun).\n *\n * @example\n * ```ts\n * import { asciifyText } from 'asciify-engine';\n * console.log(asciifyText('Hello!'));\n * console.log(asciifyText('v2.0', { char: '#' }));\n * console.log(asciifyText('WOW', { scale: 2, char: '▓' }));\n * ```\n */\nexport function asciifyText(text: string, options: BigTextOptions = {}): string {\n if (!text) return '';\n\n const { char = '█', scale = 1 } = options;\n const fillChar = [...char][0] ?? '█';\n const sc = Math.max(1, Math.floor(scale));\n const ROWS = 7 * sc;\n const GAP = sc;\n\n const rows: string[] = Array.from({ length: ROWS }, () => '');\n\n for (let ci = 0; ci < text.length; ci++) {\n const g = glyph(text[ci]);\n for (let srcRow = 0; srcRow < 7; srcRow++) {\n const bits = g[srcRow];\n let seg = '';\n for (let srcCol = 6; srcCol >= 0; srcCol--) {\n seg += ((bits >> srcCol) & 1 ? fillChar : ' ').repeat(sc);\n }\n for (let rep = 0; rep < sc; rep++) rows[srcRow * sc + rep] += seg;\n }\n if (ci < text.length - 1) {\n for (let r = 0; r < ROWS; r++) rows[r] += ' '.repeat(GAP);\n }\n }\n\n return rows.join('\\n');\n}\n\n/**\n * Render ASCII text directly onto an HTMLCanvasElement.\n * The canvas is automatically resized to fit the output.\n *\n * @example\n * ```ts\n * import { renderTextToCanvas } from 'asciify-engine';\n * renderTextToCanvas(canvas, 'Hello!', { color: '#d4ff00', scale: 2 });\n * ```\n */\nexport function renderTextToCanvas(\n canvas: HTMLCanvasElement,\n text: string,\n options: BigTextOptions = {},\n): void {\n const { color = '#d4ff00', bgColor, fontSize = 10 } = options;\n\n const art = asciifyText(text, options);\n if (!art) return;\n\n const lines = art.split('\\n');\n const cols = Math.max(...lines.map(l => [...l].length));\n\n // Monospace: each char is ~0.6× as wide as tall\n canvas.width = Math.ceil(cols * fontSize * 0.6);\n canvas.height = Math.ceil(lines.length * fontSize);\n\n const ctx = canvas.getContext('2d')!;\n\n if (bgColor && bgColor !== 'transparent') {\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n ctx.fillStyle = color;\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n lines.forEach((line, row) => ctx.fillText(line, 0, row * fontSize));\n}\n"]}